diff options
Diffstat (limited to 'sys/kern/kern_event.c')
-rw-r--r-- | sys/kern/kern_event.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index aa446b6..f7f9f1c 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -1059,6 +1059,15 @@ kqueue_expand(struct kqueue *kq, struct filterops *fops, uintptr_t ident, int fd; int mflag = waitok ? M_WAITOK : M_NOWAIT; + /* + * knote locks the KQ and filt_proc calls kqueue_register if _TRACK + * is set. Return early so we don't assert KQ_NOTOWNED in this + * case. We have a knote in the hash, so we have the table. + */ + if ((fops->f_isfd && kq->kq_knlistsize > ident) || + (!fops->f_isfd && kq->kq_knhashmask != 0)) + return 0; + KQ_NOTOWNED(kq); if (fops->f_isfd) { |