Serialize internals of kqueue with a mutex
authorvisa <visa@openbsd.org>
Thu, 10 Jun 2021 15:10:56 +0000 (15:10 +0000)
committervisa <visa@openbsd.org>
Thu, 10 Jun 2021 15:10:56 +0000 (15:10 +0000)
commit19ece097246ea4174e98362a15fcc48040ae1540
tree30cf66dc5ca42398339dca4035dd4e18bf046371
parent08d013265b5755d9d80443e9cd2081ab08023b1e
Serialize internals of kqueue with a mutex

Extend struct kqueue with a mutex and use it to serializes the internals
of each kqueue instance. This should make possible to call kqueue's
system call interface without the kernel lock. The event source facing
side of kqueue should now be MP-safe, too, as long as the event source
itself is MP-safe.

msleep() with PCATCH still requires the kernel lock. To manage with
this, kqueue_scan() locks the kernel temporarily for the section that
may sleep.

As a consequence of the kqueue mutex, knote_acquire() can lose a wakeup
when klist_invalidate() calls it. To preserve proper nesting of mutexes,
knote_acquire() has to release the kqueue mutex before it unlocks klist.
This early unlocking of the mutex lets badly timed wakeups go unnoticed.
However, the system should not hang because the sleep has a timeout.

Tested by gnezdo@ and mpi@

OK mpi@
sys/kern/kern_event.c
sys/sys/eventvar.h