activate/notify waiting kq kevents from bpf_wakeup directly.
authordlg <dlg@openbsd.org>
Sun, 16 Jan 2022 06:27:14 +0000 (06:27 +0000)
committerdlg <dlg@openbsd.org>
Sun, 16 Jan 2022 06:27:14 +0000 (06:27 +0000)
commitc8b9beef26fde74fd7b47959c3d6688396fea7b7
tree1dda86c9a47c7043f8d167a7557c399ed68f6239
parentb0877370f8cb33a458fd6e808b16ed0df1fd3c7a
activate/notify waiting kq kevents from bpf_wakeup directly.

this builds on the mpsafe kq/kevent work visa has been doing.

normally kevents are notified by calling selwakeup, but selwakeup
needs the KERNEL_LOCK. because bpf runs from all sorts of contexts
that may or may not have the kernel lock, the call to selwakeup is
deferred to the systq which already has the kernel lock. while this
avoids spinning in bpf for the kernel lock, it still adds latency
between when the buffer is ready for a program and when that program
gets notified about it. now that bpf kevents are mpsafe and bpf_wakeup
is already holding the necessary locks, we can avoid that latency.

bpf_wakeup now checks if there are waiting kevents and notifies
them immediately. if there are no other things to wake up, bpf_wakeup
avoids the task_add (and associated reference counting) to defer
the selwakeup call.

selwakeup can still try to notify waiting kevents, so this uses the
hint passed to knote() to differentiate between the notification
from bpf_wakeup and selwakeup and returns early from the latter.

ok visa@
sys/net/bpf.c