Index: share/man/man9/Makefile =================================================================== --- share/man/man9/Makefile +++ share/man/man9/Makefile @@ -1367,6 +1367,7 @@ kqueue.9 knlist_init.9 \ kqueue.9 knlist_init_mtx.9 \ kqueue.9 knlist_init_rw_reader.9 \ + kqueue.9 knlist_init_sx.9 \ kqueue.9 knlist_remove.9 \ kqueue.9 knlist_remove_inevent.9 \ kqueue.9 knote_fdclose.9 \ Index: share/man/man9/kqueue.9 =================================================================== --- share/man/man9/kqueue.9 +++ share/man/man9/kqueue.9 @@ -24,14 +24,14 @@ .\" .\" $FreeBSD$ .\" -.Dd October 12, 2021 +.Dd July 24, 2022 .Dt KQUEUE 9 .Os .Sh NAME .Nm kqueue_add_filteropts , kqueue_del_filteropts , .Nm kqfd_register , .Nm knote_fdclose , -.Nm knlist_init , knlist_init_mtx , knlist_init_rw_reader , +.Nm knlist_init , knlist_init_mtx , knlist_init_rw_reader , knlist_init_sx , .Nm knlist_add , knlist_remove , knlist_remove_inevent , knlist_empty , .Nm knlist_clear , knlist_delete , knlist_destroy , .Nm KNOTE_LOCKED , KNOTE_UNLOCKED @@ -59,6 +59,8 @@ .Ft void .Fn knlist_init_rw_reader "struct knlist *knl" "struct rwlock *lock" .Ft void +.Fn knlist_init_sx "struct knlist *knl" "struct sx *lock" +.Ft void .Fn knlist_add "struct knlist *knl" "struct knote *kn" "int islocked" .Ft void .Fn knlist_remove "struct knlist *knl" "struct knote *kn" "int islocked" @@ -261,9 +263,10 @@ .Vt knlist must be initialized with either .Fn knlist_init , -.Fn knlist_init_mtx +.Fn knlist_init_mtx , +.Fn knlist_init_rw_reader or -.Fn knlist_init_rw_reader . +.Fn knlist_init_sx . The .Vt knlist structure may be embedded into the object structure. @@ -321,6 +324,16 @@ function. .Pp The function +.Fn knlist_init_sx +may be used to initialize a +.Vt knlist +when +.Fa lock +is a +.Xr sx 9 +lock. +.Pp +The function .Fn knlist_empty returns true when there are no .Vt knotes Index: sys/kern/kern_event.c =================================================================== --- sys/kern/kern_event.c +++ sys/kern/kern_event.c @@ -2535,6 +2535,30 @@ rw_assert((struct rwlock *)arg, RA_UNLOCKED); } +static void +knlist_sx_xlock(void *arg) +{ + + sx_xlock((struct sx *)arg); +} + +static void +knlist_sx_xunlock(void *arg) +{ + + sx_xunlock((struct sx *)arg); +} + +static void +knlist_sx_assert_lock(void *arg, int what) +{ + + if (what == LA_LOCKED) + sx_assert((struct sx *)arg, SX_LOCKED); + else + sx_assert((struct sx *)arg, SX_UNLOCKED); +} + void knlist_init(struct knlist *knl, void *lock, void (*kl_lock)(void *), void (*kl_unlock)(void *), @@ -2588,6 +2612,14 @@ knlist_rw_assert_lock); } +void +knlist_init_sx(struct knlist *knl, struct sx *lock) +{ + + knlist_init(knl, lock, knlist_sx_xlock, knlist_sx_xunlock, + knlist_sx_assert_lock); +} + void knlist_destroy(struct knlist *knl) { Index: sys/sys/event.h =================================================================== --- sys/sys/event.h +++ sys/sys/event.h @@ -326,6 +326,7 @@ struct knlist; struct mtx; struct rwlock; +struct sx; void knote(struct knlist *list, long hint, int lockflags); void knote_fork(struct knlist *list, int pid); @@ -338,6 +339,7 @@ void (*kl_unlock)(void *), void (*kl_assert_lock)(void *, int)); void knlist_init_mtx(struct knlist *knl, struct mtx *lock); void knlist_init_rw_reader(struct knlist *knl, struct rwlock *lock); +void knlist_init_sx(struct knlist *knl, struct sx *lock); void knlist_destroy(struct knlist *knl); void knlist_cleardel(struct knlist *knl, struct thread *td, int islocked, int killkn);