Lines Matching refs:kn
147 static int knote_attach(struct knote *kn, struct kqueue *kq);
148 static void knote_drop(struct knote *kn, struct thread *td);
149 static void knote_drop_detached(struct knote *kn, struct thread *td);
150 static void knote_enqueue(struct knote *kn);
151 static void knote_dequeue(struct knote *kn);
154 static void knote_free(struct knote *kn);
156 static void filt_kqdetach(struct knote *kn);
157 static int filt_kqueue(struct knote *kn, long hint);
158 static int filt_procattach(struct knote *kn);
159 static void filt_procdetach(struct knote *kn);
160 static int filt_proc(struct knote *kn, long hint);
161 static int filt_fileattach(struct knote *kn);
163 static void filt_timerexpire_l(struct knote *kn, bool proc_locked);
164 static int filt_timerattach(struct knote *kn);
165 static void filt_timerdetach(struct knote *kn);
166 static void filt_timerstart(struct knote *kn, sbintime_t to);
167 static void filt_timertouch(struct knote *kn, struct kevent *kev,
169 static int filt_timervalidate(struct knote *kn, sbintime_t *to);
170 static int filt_timer(struct knote *kn, long hint);
171 static int filt_userattach(struct knote *kn);
172 static void filt_userdetach(struct knote *kn);
173 static int filt_user(struct knote *kn, long hint);
174 static void filt_usertouch(struct knote *kn, struct kevent *kev,
214 #define KNOTE_ACTIVATE(kn, islock) do { \ argument
216 mtx_assert(&(kn)->kn_kq->kq_lock, MA_OWNED); \
218 KQ_LOCK((kn)->kn_kq); \
219 (kn)->kn_status |= KN_ACTIVE; \
220 if (((kn)->kn_status & (KN_QUEUED | KN_DISABLED)) == 0) \
221 knote_enqueue((kn)); \
223 KQ_UNLOCK((kn)->kn_kq); \
249 kn_list_lock(struct knote *kn) in kn_list_lock() argument
253 knl = kn->kn_knlist; in kn_list_lock()
275 kn_in_flux(struct knote *kn) in kn_in_flux() argument
278 return (kn->kn_influx > 0); in kn_in_flux()
282 kn_enter_flux(struct knote *kn) in kn_enter_flux() argument
285 KQ_OWNED(kn->kn_kq); in kn_enter_flux()
286 MPASS(kn->kn_influx < INT_MAX); in kn_enter_flux()
287 kn->kn_influx++; in kn_enter_flux()
291 kn_leave_flux(struct knote *kn) in kn_leave_flux() argument
294 KQ_OWNED(kn->kn_kq); in kn_leave_flux()
295 MPASS(kn->kn_influx > 0); in kn_leave_flux()
296 kn->kn_influx--; in kn_leave_flux()
297 return (kn->kn_influx == 0); in kn_leave_flux()
325 filt_nullattach(struct knote *kn) in filt_nullattach() argument
370 filt_fileattach(struct knote *kn) in filt_fileattach() argument
373 return (fo_kqfilter(kn->kn_fp, kn)); in filt_fileattach()
378 kqueue_kqfilter(struct file *fp, struct knote *kn) in kqueue_kqfilter() argument
380 struct kqueue *kq = kn->kn_fp->f_data; in kqueue_kqfilter()
382 if (kn->kn_filter != EVFILT_READ) in kqueue_kqfilter()
385 kn->kn_status |= KN_KQUEUE; in kqueue_kqfilter()
386 kn->kn_fop = &kqread_filtops; in kqueue_kqfilter()
387 knlist_add(&kq->kq_sel.si_note, kn, 0); in kqueue_kqfilter()
393 filt_kqdetach(struct knote *kn) in filt_kqdetach() argument
395 struct kqueue *kq = kn->kn_fp->f_data; in filt_kqdetach()
397 knlist_remove(&kq->kq_sel.si_note, kn, 0); in filt_kqdetach()
402 filt_kqueue(struct knote *kn, long hint) in filt_kqueue() argument
404 struct kqueue *kq = kn->kn_fp->f_data; in filt_kqueue()
406 kn->kn_data = kq->kq_count; in filt_kqueue()
407 return (kn->kn_data > 0); in filt_kqueue()
412 filt_procattach(struct knote *kn) in filt_procattach() argument
419 if (kn->kn_sfflags & NOTE_EXIT) in filt_procattach()
420 p = pfind_any(kn->kn_id); in filt_procattach()
422 p = pfind(kn->kn_id); in filt_procattach()
433 kn->kn_ptr.p_proc = p; in filt_procattach()
434 kn->kn_flags |= EV_CLEAR; /* automatically set */ in filt_procattach()
440 if (kn->kn_flags & EV_FLAG2) { in filt_procattach()
441 kn->kn_flags &= ~EV_FLAG2; in filt_procattach()
442 kn->kn_data = kn->kn_sdata; /* ppid */ in filt_procattach()
443 kn->kn_fflags = NOTE_CHILD; in filt_procattach()
444 kn->kn_sfflags &= ~(NOTE_EXIT | NOTE_EXEC | NOTE_FORK); in filt_procattach()
451 if (kn->kn_flags & EV_FLAG1) { in filt_procattach()
452 kn->kn_flags &= ~EV_FLAG1; in filt_procattach()
455 knlist_add(p->p_klist, kn, 1); in filt_procattach()
463 if (immediate || (exiting && filt_proc(kn, NOTE_EXIT))) in filt_procattach()
464 KNOTE_ACTIVATE(kn, 0); in filt_procattach()
481 filt_procdetach(struct knote *kn) in filt_procdetach() argument
484 knlist_remove(kn->kn_knlist, kn, 0); in filt_procdetach()
485 kn->kn_ptr.p_proc = NULL; in filt_procdetach()
490 filt_proc(struct knote *kn, long hint) in filt_proc() argument
495 p = kn->kn_ptr.p_proc; in filt_proc()
503 if (kn->kn_sfflags & event) in filt_proc()
504 kn->kn_fflags |= event; in filt_proc()
508 kn->kn_flags |= EV_EOF | EV_ONESHOT; in filt_proc()
509 kn->kn_ptr.p_proc = NULL; in filt_proc()
510 if (kn->kn_fflags & NOTE_EXIT) in filt_proc()
511 kn->kn_data = KW_EXITCODE(p->p_xexit, p->p_xsig); in filt_proc()
512 if (kn->kn_fflags == 0) in filt_proc()
513 kn->kn_flags |= EV_DROP; in filt_proc()
517 return (kn->kn_fflags != 0); in filt_proc()
532 struct knote *kn; in knote_fork() local
542 SLIST_FOREACH(kn, &list->kl_list, kn_selnext) { in knote_fork()
543 kq = kn->kn_kq; in knote_fork()
545 if (kn_in_flux(kn) && (kn->kn_status & KN_SCAN) == 0) { in knote_fork()
553 if ((kn->kn_sfflags & NOTE_TRACK) == 0) { in knote_fork()
554 if (kn->kn_fop->f_event(kn, NOTE_FORK)) in knote_fork()
555 KNOTE_ACTIVATE(kn, 1); in knote_fork()
566 kn_enter_flux(kn); in knote_fork()
580 kev.filter = kn->kn_filter; in knote_fork()
581 kev.flags = kn->kn_flags | EV_ADD | EV_ENABLE | EV_ONESHOT | in knote_fork()
583 kev.fflags = kn->kn_sfflags; in knote_fork()
584 kev.data = kn->kn_id; /* parent */ in knote_fork()
585 kev.udata = kn->kn_kevent.udata;/* preserve udata */ in knote_fork()
588 kn->kn_fflags |= NOTE_TRACKERR; in knote_fork()
595 kev.filter = kn->kn_filter; in knote_fork()
596 kev.flags = kn->kn_flags | EV_ADD | EV_ENABLE | EV_FLAG1; in knote_fork()
597 kev.fflags = kn->kn_sfflags; in knote_fork()
598 kev.data = kn->kn_id; /* parent */ in knote_fork()
599 kev.udata = kn->kn_kevent.udata;/* preserve udata */ in knote_fork()
602 kn->kn_fflags |= NOTE_TRACKERR; in knote_fork()
603 if (kn->kn_fop->f_event(kn, NOTE_FORK)) in knote_fork()
604 KNOTE_ACTIVATE(kn, 0); in knote_fork()
607 kn_leave_flux(kn); in knote_fork()
679 struct knote *kn; member
692 callout_reset_sbt_on(&kc->c, kc->next, 0, filt_timerexpire, kc->kn, in kqtimer_sched_callout()
712 filt_timerexpire_l(kc->kn, true); in kqtimer_proc_continue()
719 filt_timerexpire_l(struct knote *kn, bool proc_locked) in filt_timerexpire_l() argument
726 kc = kn->kn_ptr.p_v; in filt_timerexpire_l()
728 if ((kn->kn_flags & EV_ONESHOT) != 0 || kc->to == 0) { in filt_timerexpire_l()
729 kn->kn_data++; in filt_timerexpire_l()
730 KNOTE_ACTIVATE(kn, 0); in filt_timerexpire_l()
739 kn->kn_data += delta; in filt_timerexpire_l()
743 KNOTE_ACTIVATE(kn, 0); /* XXX - handle locking */ in filt_timerexpire_l()
782 filt_timervalidate(struct knote *kn, sbintime_t *to) in filt_timervalidate() argument
787 if (kn->kn_sdata < 0) in filt_timervalidate()
789 if (kn->kn_sdata == 0 && (kn->kn_flags & EV_ONESHOT) == 0) in filt_timervalidate()
790 kn->kn_sdata = 1; in filt_timervalidate()
795 if ((kn->kn_sfflags & ~(NOTE_TIMER_PRECMASK | NOTE_ABSTIME)) != 0) in filt_timervalidate()
798 *to = timer2sbintime(kn->kn_sdata, kn->kn_sfflags); in filt_timervalidate()
801 if ((kn->kn_sfflags & NOTE_ABSTIME) != 0) { in filt_timervalidate()
810 filt_timerattach(struct knote *kn) in filt_timerattach() argument
817 error = filt_timervalidate(kn, &to); in filt_timerattach()
820 KASSERT(to > 0 || (kn->kn_flags & EV_ONESHOT) != 0 || in filt_timerattach()
821 (kn->kn_sfflags & NOTE_ABSTIME) != 0, in filt_timerattach()
831 if ((kn->kn_sfflags & NOTE_ABSTIME) == 0) in filt_timerattach()
832 kn->kn_flags |= EV_CLEAR; /* automatically set */ in filt_timerattach()
833 kn->kn_status &= ~KN_DETACHED; /* knlist_add clears it */ in filt_timerattach()
834 kn->kn_ptr.p_v = kc = malloc(sizeof(*kc), M_KQUEUE, M_WAITOK); in filt_timerattach()
835 kc->kn = kn; in filt_timerattach()
840 filt_timerstart(kn, to); in filt_timerattach()
846 filt_timerstart(struct knote *kn, sbintime_t to) in filt_timerstart() argument
850 kc = kn->kn_ptr.p_v; in filt_timerstart()
851 if ((kn->kn_sfflags & NOTE_ABSTIME) != 0) { in filt_timerstart()
862 filt_timerdetach(struct knote *kn) in filt_timerdetach() argument
868 kc = kn->kn_ptr.p_v; in filt_timerdetach()
887 kn->kn_status |= KN_DETACHED; /* knlist_remove sets it */ in filt_timerdetach()
891 filt_timertouch(struct knote *kn, struct kevent *kev, u_long type) in filt_timertouch() argument
902 kc = kn->kn_ptr.p_v; in filt_timertouch()
922 kq = kn->kn_kq; in filt_timertouch()
924 if (kn->kn_status & KN_QUEUED) in filt_timertouch()
925 knote_dequeue(kn); in filt_timertouch()
927 kn->kn_status &= ~KN_ACTIVE; in filt_timertouch()
928 kn->kn_data = 0; in filt_timertouch()
932 kn->kn_sfflags = kev->fflags; in filt_timertouch()
933 kn->kn_sdata = kev->data; in filt_timertouch()
934 error = filt_timervalidate(kn, &to); in filt_timertouch()
936 kn->kn_flags |= EV_ERROR; in filt_timertouch()
937 kn->kn_data = error; in filt_timertouch()
939 filt_timerstart(kn, to); in filt_timertouch()
944 *kev = kn->kn_kevent; in filt_timertouch()
945 if (kn->kn_flags & EV_CLEAR) { in filt_timertouch()
946 kn->kn_data = 0; in filt_timertouch()
947 kn->kn_fflags = 0; in filt_timertouch()
958 filt_timer(struct knote *kn, long hint) in filt_timer() argument
961 return (kn->kn_data != 0); in filt_timer()
965 filt_userattach(struct knote *kn) in filt_userattach() argument
971 kn->kn_hook = NULL; in filt_userattach()
972 if (kn->kn_fflags & NOTE_TRIGGER) in filt_userattach()
973 kn->kn_hookid = 1; in filt_userattach()
975 kn->kn_hookid = 0; in filt_userattach()
980 filt_userdetach(__unused struct knote *kn) in filt_userdetach() argument
989 filt_user(struct knote *kn, __unused long hint) in filt_user() argument
992 return (kn->kn_hookid); in filt_user()
996 filt_usertouch(struct knote *kn, struct kevent *kev, u_long type) in filt_usertouch() argument
1003 kn->kn_hookid = 1; in filt_usertouch()
1012 kn->kn_sfflags &= kev->fflags; in filt_usertouch()
1016 kn->kn_sfflags |= kev->fflags; in filt_usertouch()
1020 kn->kn_sfflags = kev->fflags; in filt_usertouch()
1027 kn->kn_sdata = kev->data; in filt_usertouch()
1029 kn->kn_hookid = 0; in filt_usertouch()
1030 kn->kn_data = 0; in filt_usertouch()
1031 kn->kn_fflags = 0; in filt_usertouch()
1036 *kev = kn->kn_kevent; in filt_usertouch()
1037 kev->fflags = kn->kn_sfflags; in filt_usertouch()
1038 kev->data = kn->kn_sdata; in filt_usertouch()
1039 if (kn->kn_flags & EV_CLEAR) { in filt_usertouch()
1040 kn->kn_hookid = 0; in filt_usertouch()
1041 kn->kn_data = 0; in filt_usertouch()
1042 kn->kn_fflags = 0; in filt_usertouch()
1495 struct knote *kn, *tkn; in kqueue_register() local
1504 kn = NULL; in kqueue_register()
1579 SLIST_FOREACH(kn, &kq->kq_knlist[kev->ident], kn_link) in kqueue_register()
1580 if (kev->filter == kn->kn_filter) in kqueue_register()
1607 SLIST_FOREACH(kn, list, kn_link) in kqueue_register()
1608 if (kev->ident == kn->kn_id && in kqueue_register()
1609 kev->filter == kn->kn_filter) in kqueue_register()
1615 if (kn != NULL && kn_in_flux(kn)) { in kqueue_register()
1633 if (kn == NULL) { in kqueue_register()
1635 kn = tkn; in kqueue_register()
1637 if (kn == NULL) { in kqueue_register()
1642 kn->kn_fp = fp; in kqueue_register()
1643 kn->kn_kq = kq; in kqueue_register()
1644 kn->kn_fop = fops; in kqueue_register()
1652 kn->kn_sfflags = kev->fflags; in kqueue_register()
1653 kn->kn_sdata = kev->data; in kqueue_register()
1656 kn->kn_kevent = *kev; in kqueue_register()
1657 kn->kn_kevent.flags &= ~(EV_ADD | EV_DELETE | in kqueue_register()
1659 kn->kn_status = KN_DETACHED; in kqueue_register()
1661 kn->kn_status |= KN_DISABLED; in kqueue_register()
1662 kn_enter_flux(kn); in kqueue_register()
1664 error = knote_attach(kn, kq); in kqueue_register()
1667 tkn = kn; in kqueue_register()
1671 if ((error = kn->kn_fop->f_attach(kn)) != 0) { in kqueue_register()
1672 knote_drop_detached(kn, td); in kqueue_register()
1675 knl = kn_list_lock(kn); in kqueue_register()
1686 kn_enter_flux(kn); in kqueue_register()
1688 knote_drop(kn, td); in kqueue_register()
1693 kn->kn_flags |= EV_ONESHOT; in kqueue_register()
1694 KNOTE_ACTIVATE(kn, 1); in kqueue_register()
1698 kn->kn_status &= ~KN_DISABLED; in kqueue_register()
1700 kn->kn_status |= KN_DISABLED; in kqueue_register()
1707 kn->kn_status |= KN_SCAN; in kqueue_register()
1708 kn_enter_flux(kn); in kqueue_register()
1710 knl = kn_list_lock(kn); in kqueue_register()
1712 kn->kn_kevent.udata = kev->udata; in kqueue_register()
1714 fops->f_touch(kn, kev, EVENT_REGISTER); in kqueue_register()
1716 kn->kn_sfflags = kev->fflags; in kqueue_register()
1717 kn->kn_sdata = kev->data; in kqueue_register()
1731 if ((kn->kn_status & KN_DISABLED) == 0) in kqueue_register()
1732 event = kn->kn_fop->f_event(kn, 0); in kqueue_register()
1738 kn->kn_status |= KN_ACTIVE; in kqueue_register()
1739 if ((kn->kn_status & (KN_ACTIVE | KN_DISABLED | KN_QUEUED)) == in kqueue_register()
1741 knote_enqueue(kn); in kqueue_register()
1742 kn->kn_status &= ~KN_SCAN; in kqueue_register()
1743 kn_leave_flux(kn); in kqueue_register()
1920 struct knote *kn, *marker; in kqueue_scan() local
1987 kn = TAILQ_FIRST(&kq->kq_head); in kqueue_scan()
1989 if ((kn->kn_status == KN_MARKER && kn != marker) || in kqueue_scan()
1990 kn_in_flux(kn)) { in kqueue_scan()
2001 TAILQ_REMOVE(&kq->kq_head, kn, kn_tqe); in kqueue_scan()
2002 if ((kn->kn_status & KN_DISABLED) == KN_DISABLED) { in kqueue_scan()
2003 kn->kn_status &= ~KN_QUEUED; in kqueue_scan()
2007 if (kn == marker) { in kqueue_scan()
2013 KASSERT(!kn_in_flux(kn), in kqueue_scan()
2014 ("knote %p is unexpectedly in flux", kn)); in kqueue_scan()
2016 if ((kn->kn_flags & EV_DROP) == EV_DROP) { in kqueue_scan()
2017 kn->kn_status &= ~KN_QUEUED; in kqueue_scan()
2018 kn_enter_flux(kn); in kqueue_scan()
2025 knote_drop(kn, td); in kqueue_scan()
2028 } else if ((kn->kn_flags & EV_ONESHOT) == EV_ONESHOT) { in kqueue_scan()
2029 kn->kn_status &= ~KN_QUEUED; in kqueue_scan()
2030 kn_enter_flux(kn); in kqueue_scan()
2037 *kevp = kn->kn_kevent; in kqueue_scan()
2038 knote_drop(kn, td); in kqueue_scan()
2040 kn = NULL; in kqueue_scan()
2042 kn->kn_status |= KN_SCAN; in kqueue_scan()
2043 kn_enter_flux(kn); in kqueue_scan()
2045 if ((kn->kn_status & KN_KQUEUE) == KN_KQUEUE) in kqueue_scan()
2047 knl = kn_list_lock(kn); in kqueue_scan()
2048 if (kn->kn_fop->f_event(kn, 0) == 0) { in kqueue_scan()
2051 kn->kn_status &= ~(KN_QUEUED | KN_ACTIVE | in kqueue_scan()
2053 kn_leave_flux(kn); in kqueue_scan()
2059 touch = (!kn->kn_fop->f_isfd && in kqueue_scan()
2060 kn->kn_fop->f_touch != NULL); in kqueue_scan()
2062 kn->kn_fop->f_touch(kn, kevp, EVENT_PROCESS); in kqueue_scan()
2064 *kevp = kn->kn_kevent; in kqueue_scan()
2067 if (kn->kn_flags & (EV_CLEAR | EV_DISPATCH)) { in kqueue_scan()
2072 if (touch == 0 && kn->kn_flags & EV_CLEAR) { in kqueue_scan()
2073 kn->kn_data = 0; in kqueue_scan()
2074 kn->kn_fflags = 0; in kqueue_scan()
2076 if (kn->kn_flags & EV_DISPATCH) in kqueue_scan()
2077 kn->kn_status |= KN_DISABLED; in kqueue_scan()
2078 kn->kn_status &= ~(KN_QUEUED | KN_ACTIVE); in kqueue_scan()
2081 TAILQ_INSERT_TAIL(&kq->kq_head, kn, kn_tqe); in kqueue_scan()
2083 kn->kn_status &= ~KN_SCAN; in kqueue_scan()
2084 kn_leave_flux(kn); in kqueue_scan()
2213 struct knote *kn; in kqueue_drain() local
2230 while ((kn = SLIST_FIRST(&kq->kq_knlist[i])) != NULL) { in kqueue_drain()
2231 if (kn_in_flux(kn)) { in kqueue_drain()
2236 kn_enter_flux(kn); in kqueue_drain()
2238 knote_drop(kn, td); in kqueue_drain()
2244 while ((kn = SLIST_FIRST(&kq->kq_knhash[i])) != NULL) { in kqueue_drain()
2245 if (kn_in_flux(kn)) { in kqueue_drain()
2251 kn_enter_flux(kn); in kqueue_drain()
2253 knote_drop(kn, td); in kqueue_drain()
2375 struct knote *kn, *tkn; in knote() local
2393 SLIST_FOREACH_SAFE(kn, &list->kl_list, kn_selnext, tkn) { in knote()
2394 kq = kn->kn_kq; in knote()
2396 if (kn_in_flux(kn) && (kn->kn_status & KN_SCAN) == 0) { in knote()
2407 kn_enter_flux(kn); in knote()
2409 error = kn->kn_fop->f_event(kn, hint); in knote()
2411 kn_leave_flux(kn); in knote()
2413 KNOTE_ACTIVATE(kn, 1); in knote()
2416 if (kn->kn_fop->f_event(kn, hint)) in knote()
2417 KNOTE_ACTIVATE(kn, 1); in knote()
2429 knlist_add(struct knlist *knl, struct knote *kn, int islocked) in knlist_add() argument
2433 KQ_NOTOWNED(kn->kn_kq); in knlist_add()
2434 KASSERT(kn_in_flux(kn), ("knote %p not in flux", kn)); in knlist_add()
2435 KASSERT((kn->kn_status & KN_DETACHED) != 0, in knlist_add()
2436 ("knote %p was not detached", kn)); in knlist_add()
2439 SLIST_INSERT_HEAD(&knl->kl_list, kn, kn_selnext); in knlist_add()
2442 KQ_LOCK(kn->kn_kq); in knlist_add()
2443 kn->kn_knlist = knl; in knlist_add()
2444 kn->kn_status &= ~KN_DETACHED; in knlist_add()
2445 KQ_UNLOCK(kn->kn_kq); in knlist_add()
2449 knlist_remove_kq(struct knlist *knl, struct knote *kn, int knlislocked, in knlist_remove_kq() argument
2455 mtx_assert(&kn->kn_kq->kq_lock, kqislocked ? MA_OWNED : MA_NOTOWNED); in knlist_remove_kq()
2456 KASSERT(kqislocked || kn_in_flux(kn), ("knote %p not in flux", kn)); in knlist_remove_kq()
2457 KASSERT((kn->kn_status & KN_DETACHED) == 0, in knlist_remove_kq()
2458 ("knote %p was already detached", kn)); in knlist_remove_kq()
2461 SLIST_REMOVE(&knl->kl_list, kn, knote, kn_selnext); in knlist_remove_kq()
2462 kn->kn_knlist = NULL; in knlist_remove_kq()
2466 KQ_LOCK(kn->kn_kq); in knlist_remove_kq()
2467 kn->kn_status |= KN_DETACHED; in knlist_remove_kq()
2469 KQ_UNLOCK(kn->kn_kq); in knlist_remove_kq()
2476 knlist_remove(struct knlist *knl, struct knote *kn, int islocked) in knlist_remove() argument
2479 knlist_remove_kq(knl, kn, islocked, 0); in knlist_remove()
2592 struct knote *kn, *kn2; in knlist_cleardel() local
2604 SLIST_FOREACH_SAFE(kn, &knl->kl_list, kn_selnext, kn2) { in knlist_cleardel()
2605 kq = kn->kn_kq; in knlist_cleardel()
2607 if (kn_in_flux(kn)) { in knlist_cleardel()
2611 knlist_remove_kq(knl, kn, 1, 1); in knlist_cleardel()
2613 kn_enter_flux(kn); in knlist_cleardel()
2615 knote_drop_detached(kn, td); in knlist_cleardel()
2618 kn->kn_flags |= EV_EOF | EV_ONESHOT; in knlist_cleardel()
2626 kn = SLIST_FIRST(&knl->kl_list); in knlist_cleardel()
2627 kq = kn->kn_kq; in knlist_cleardel()
2629 KASSERT(kn_in_flux(kn), ("knote removed w/o list lock")); in knlist_cleardel()
2655 struct knote *kn; in knote_fdclose() local
2670 (kn = SLIST_FIRST(&kq->kq_knlist[fd])) != NULL) { in knote_fdclose()
2671 if (kn_in_flux(kn)) { in knote_fdclose()
2679 kn_enter_flux(kn); in knote_fdclose()
2682 knote_drop(kn, td); in knote_fdclose()
2690 knote_attach(struct knote *kn, struct kqueue *kq) in knote_attach() argument
2694 KASSERT(kn_in_flux(kn), ("knote %p not marked influx", kn)); in knote_attach()
2699 if (kn->kn_fop->f_isfd) { in knote_attach()
2700 if (kn->kn_id >= kq->kq_knlistsize) in knote_attach()
2702 list = &kq->kq_knlist[kn->kn_id]; in knote_attach()
2706 list = &kq->kq_knhash[KN_HASH(kn->kn_id, kq->kq_knhashmask)]; in knote_attach()
2708 SLIST_INSERT_HEAD(list, kn, kn_link); in knote_attach()
2713 knote_drop(struct knote *kn, struct thread *td) in knote_drop() argument
2716 if ((kn->kn_status & KN_DETACHED) == 0) in knote_drop()
2717 kn->kn_fop->f_detach(kn); in knote_drop()
2718 knote_drop_detached(kn, td); in knote_drop()
2722 knote_drop_detached(struct knote *kn, struct thread *td) in knote_drop_detached() argument
2727 kq = kn->kn_kq; in knote_drop_detached()
2729 KASSERT((kn->kn_status & KN_DETACHED) != 0, in knote_drop_detached()
2730 ("knote %p still attached", kn)); in knote_drop_detached()
2735 KASSERT(kn->kn_influx >= 1, in knote_drop_detached()
2737 kn, kn->kn_influx)); in knote_drop_detached()
2738 if (kn->kn_influx == 1) in knote_drop_detached()
2744 if (kn->kn_fop->f_isfd) in knote_drop_detached()
2745 list = &kq->kq_knlist[kn->kn_id]; in knote_drop_detached()
2747 list = &kq->kq_knhash[KN_HASH(kn->kn_id, kq->kq_knhashmask)]; in knote_drop_detached()
2750 SLIST_REMOVE(list, kn, knote, kn_link); in knote_drop_detached()
2751 if (kn->kn_status & KN_QUEUED) in knote_drop_detached()
2752 knote_dequeue(kn); in knote_drop_detached()
2755 if (kn->kn_fop->f_isfd) { in knote_drop_detached()
2756 fdrop(kn->kn_fp, td); in knote_drop_detached()
2757 kn->kn_fp = NULL; in knote_drop_detached()
2759 kqueue_fo_release(kn->kn_kevent.filter); in knote_drop_detached()
2760 kn->kn_fop = NULL; in knote_drop_detached()
2761 knote_free(kn); in knote_drop_detached()
2765 knote_enqueue(struct knote *kn) in knote_enqueue() argument
2767 struct kqueue *kq = kn->kn_kq; in knote_enqueue()
2769 KQ_OWNED(kn->kn_kq); in knote_enqueue()
2770 KASSERT((kn->kn_status & KN_QUEUED) == 0, ("knote already queued")); in knote_enqueue()
2772 TAILQ_INSERT_TAIL(&kq->kq_head, kn, kn_tqe); in knote_enqueue()
2773 kn->kn_status |= KN_QUEUED; in knote_enqueue()
2779 knote_dequeue(struct knote *kn) in knote_dequeue() argument
2781 struct kqueue *kq = kn->kn_kq; in knote_dequeue()
2783 KQ_OWNED(kn->kn_kq); in knote_dequeue()
2784 KASSERT(kn->kn_status & KN_QUEUED, ("knote not queued")); in knote_dequeue()
2786 TAILQ_REMOVE(&kq->kq_head, kn, kn_tqe); in knote_dequeue()
2787 kn->kn_status &= ~KN_QUEUED; in knote_dequeue()
2809 knote_free(struct knote *kn) in knote_free() argument
2812 uma_zfree(knote_zone, kn); in knote_free()
2875 struct kqueue *kq, struct knote *kn) in sysctl_kern_proc_kqueue_report_one() argument
2880 if (kn->kn_status == KN_MARKER) in sysctl_kern_proc_kqueue_report_one()
2884 memcpy(&kin.knt_event, &kn->kn_kevent, sizeof(struct kevent)); in sysctl_kern_proc_kqueue_report_one()
2885 kin.knt_status = knote_status_export(kn->kn_status); in sysctl_kern_proc_kqueue_report_one()
2886 kn_enter_flux(kn); in sysctl_kern_proc_kqueue_report_one()
2888 if (kn->kn_fop->f_userdump != NULL) in sysctl_kern_proc_kqueue_report_one()
2889 (void)kn->kn_fop->f_userdump(p, kn, &kin); in sysctl_kern_proc_kqueue_report_one()
2893 kn_leave_flux(kn); in sysctl_kern_proc_kqueue_report_one()
2904 struct knote *kn; in sysctl_kern_proc_kqueue() local
2940 SLIST_FOREACH(kn, &kq->kq_knlist[i], kn_link) { in sysctl_kern_proc_kqueue()
2942 kq, kn); in sysctl_kern_proc_kqueue()
2950 SLIST_FOREACH(kn, &kq->kq_knhash[i], kn_link) { in sysctl_kern_proc_kqueue()
2952 kq, kn); in sysctl_kern_proc_kqueue()