Make kqread event filter MP-safe
authorvisa <visa@openbsd.org>
Sat, 6 Nov 2021 05:48:47 +0000 (05:48 +0000)
committervisa <visa@openbsd.org>
Sat, 6 Nov 2021 05:48:47 +0000 (05:48 +0000)
commitd0fd4be49d14ebcc7e4146a2ad4009619095c86f
tree68af5f0d515646640a71ba497fda499d28d8cc03
parent01e259ddb9e2f84b6e3affe2a84a300efca317fb
Make kqread event filter MP-safe

Use the monitored kqueue's kq_lock to serialize kqueue and knote access.

Typically, the "object lock" would cover also the klist, but that is not
possible with kqueues. knote_activate() needs kq_lock of the monitoring
kqueue, which would create lock order troubles if kq_lock was held when
calling KNOTE(&kq->kq_sel.si_note). Avoid this by using a separate klist
lock for kqueues.

The new klist lock is system-wide. Each kqueue instance could have
a dedicated klist lock. However, the efficacy of dedicated versus
system-wide lock is somewhat limited because the current implementation
activates kqueue knotes through a single thread.

OK mpi@
sys/kern/kern_event.c