git: aba6f33275e7 - main - sockets: provide protocol method pr_kqfilter

From: Gleb Smirnoff <glebius_at_FreeBSD.org>
Date: Wed, 30 Apr 2025 21:14:42 UTC
The branch main has been updated by glebius:

URL: https://cgit.FreeBSD.org/src/commit/?id=aba6f33275e72b9de8b4936cd8c00dd671e5d6e8

commit aba6f33275e72b9de8b4936cd8c00dd671e5d6e8
Author:     Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2025-04-30 21:13:58 +0000
Commit:     Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2025-04-30 21:13:58 +0000

    sockets: provide protocol method pr_kqfilter
    
    Reviewed by:            markj
    Differential Revision:  https://reviews.freebsd.org/D48919
---
 sys/kern/sys_socket.c  | 10 +++++++++-
 sys/kern/uipc_domain.c |  1 +
 sys/kern/uipc_socket.c |  4 +---
 sys/sys/protosw.h      |  3 +++
 sys/sys/socketvar.h    |  1 +
 5 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c
index 456d93ff0d68..c221106ae067 100644
--- a/sys/kern/sys_socket.c
+++ b/sys/kern/sys_socket.c
@@ -87,7 +87,7 @@ static fo_rdwr_t soo_read;
 static fo_rdwr_t soo_write;
 static fo_ioctl_t soo_ioctl;
 static fo_poll_t soo_poll;
-extern fo_kqfilter_t soo_kqfilter;
+static fo_kqfilter_t soo_kqfilter;
 static fo_stat_t soo_stat;
 static fo_close_t soo_close;
 static fo_chmod_t soo_chmod;
@@ -291,6 +291,14 @@ soo_poll(struct file *fp, int events, struct ucred *active_cred,
 	return (so->so_proto->pr_sopoll(so, events, td));
 }
 
+static int
+soo_kqfilter(struct file *fp, struct knote *kn)
+{
+	struct socket *so = fp->f_data;
+
+	return (so->so_proto->pr_kqfilter(so, kn));
+}
+
 static int
 soo_stat(struct file *fp, struct stat *ub, struct ucred *active_cred)
 {
diff --git a/sys/kern/uipc_domain.c b/sys/kern/uipc_domain.c
index 2d68e11b9f0a..3f31f8ba421c 100644
--- a/sys/kern/uipc_domain.c
+++ b/sys/kern/uipc_domain.c
@@ -191,6 +191,7 @@ pr_init(struct domain *dom, struct protosw *pr)
 	DEFAULT(pr_sopoll, sopoll_generic);
 	DEFAULT(pr_setsbopt, sbsetopt);
 	DEFAULT(pr_aio_queue, soaio_queue_generic);
+	DEFAULT(pr_kqfilter, sokqfilter_generic);
 
 #define NOTSUPP(foo)	if (pr->foo == NULL)  pr->foo = foo ## _notsupp
 	NOTSUPP(pr_accept);
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 10f81a959147..03a2c532f053 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -186,7 +186,6 @@ static int	filt_soread(struct knote *kn, long hint);
 static void	filt_sowdetach(struct knote *kn);
 static int	filt_sowrite(struct knote *kn, long hint);
 static int	filt_soempty(struct knote *kn, long hint);
-fo_kqfilter_t	soo_kqfilter;
 
 static const struct filterops soread_filtops = {
 	.f_isfd = 1,
@@ -4488,9 +4487,8 @@ sopoll_generic(struct socket *so, int events, struct thread *td)
 }
 
 int
-soo_kqfilter(struct file *fp, struct knote *kn)
+sokqfilter_generic(struct socket *so, struct knote *kn)
 {
-	struct socket *so = kn->kn_fp->f_data;
 	struct sockbuf *sb;
 	sb_which which;
 	struct knlist *knl;
diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h
index 2f74148efa1d..4808f136cabf 100644
--- a/sys/sys/protosw.h
+++ b/sys/sys/protosw.h
@@ -51,6 +51,7 @@ struct stat;
 struct ucred;
 struct uio;
 struct kaiocb;
+struct knote;
 enum shutdown_how;
 
 /* USE THESE FOR YOUR PROTOTYPES ! */
@@ -89,6 +90,7 @@ typedef int	pr_sosend_t(struct socket *, struct sockaddr *, struct uio *,
 typedef int	pr_soreceive_t(struct socket *, struct sockaddr **,
 		    struct uio *, struct mbuf **, struct mbuf **, int *);
 typedef int	pr_sopoll_t(struct socket *, int, struct thread *);
+typedef int	pr_kqfilter_t(struct socket *, struct knote *);
 typedef void	pr_sosetlabel_t(struct socket *);
 typedef void	pr_close_t(struct socket *);
 typedef int	pr_bindat_t(int, struct socket *, struct sockaddr *,
@@ -138,6 +140,7 @@ struct protosw {
 	pr_sosetlabel_t	*pr_sosetlabel;	/* MAC, XXXGL: remove */
 	pr_setsbopt_t	*pr_setsbopt;	/* Socket buffer ioctls */
 	pr_chmod_t	*pr_chmod;	/* fchmod(2) */
+	pr_kqfilter_t	*pr_kqfilter;	/* kevent(2) */
 };
 #endif	/* defined(_KERNEL) || defined(_WANT_PROTOSW) */
 #ifdef _KERNEL
diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h
index 02d0ca139fa4..8e70ada24259 100644
--- a/sys/sys/socketvar.h
+++ b/sys/sys/socketvar.h
@@ -527,6 +527,7 @@ struct socket *
 struct socket *
 	sopeeloff(struct socket *);
 int	sopoll_generic(struct socket *so, int events, struct thread *td);
+int	sokqfilter_generic(struct socket *so, struct knote *kn);
 int	soaio_queue_generic(struct socket *so, struct kaiocb *job);
 int	soreceive(struct socket *so, struct sockaddr **paddr, struct uio *uio,
 	    struct mbuf **mp0, struct mbuf **controlp, int *flagsp);