Lines Matching defs:kq
79 void kqueue_wakeup(struct kqueue *kq);
82 void kqueue_do_check(struct kqueue *kq, const char *func, int line);
83 #define kqueue_check(kq) kqueue_do_check((kq), __func__, __LINE__)
85 #define kqueue_check(kq) do {} while (0)
93 static void kqueue_expand_hash(struct kqueue *kq);
94 static void kqueue_expand_list(struct kqueue *kq, int fd);
116 void knote_remove(struct proc *p, struct kqueue *kq, struct knlist **plist,
123 int filt_kqueue_common(struct knote *kn, struct kqueue *kq);
208 KQREF(struct kqueue *kq)
210 refcnt_take(&kq->kq_refcnt);
214 KQRELE(struct kqueue *kq)
218 if (refcnt_rele(&kq->kq_refcnt) == 0)
221 fdp = kq->kq_fdp;
223 LIST_REMOVE(kq, kq_next);
226 LIST_REMOVE(kq, kq_next);
230 KASSERT(TAILQ_EMPTY(&kq->kq_head));
231 KASSERT(kq->kq_nknotes == 0);
233 free(kq->kq_knlist, M_KEVENT, kq->kq_knlistsize *
235 hashfree(kq->kq_knhash, KN_HASHSIZE, M_KEVENT);
236 klist_free(&kq->kq_klist);
237 pool_put(&kqueue_pool, kq);
266 struct kqueue *kq = kn->kn_fp->f_data;
272 klist_insert(&kq->kq_klist, kn);
279 struct kqueue *kq = kn->kn_fp->f_data;
281 klist_remove(&kq->kq_klist, kn);
285 filt_kqueue_common(struct knote *kn, struct kqueue *kq)
287 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
289 kn->kn_data = kq->kq_count;
297 struct kqueue *kq = kn->kn_fp->f_data;
300 mtx_enter(&kq->kq_lock);
301 active = filt_kqueue_common(kn, kq);
302 mtx_leave(&kq->kq_lock);
310 struct kqueue *kq = kn->kn_fp->f_data;
313 mtx_enter(&kq->kq_lock);
315 active = filt_kqueue_common(kn, kq);
316 mtx_leave(&kq->kq_lock);
324 struct kqueue *kq = kn->kn_fp->f_data;
327 mtx_enter(&kq->kq_lock);
331 active = filt_kqueue_common(kn, kq);
334 mtx_leave(&kq->kq_lock);
423 struct kqueue *kq = kn->kn_kq;
444 mtx_enter(&kq->kq_lock);
446 mtx_leave(&kq->kq_lock);
476 error = kqueue_register(kq, &kev, 0, NULL);
633 struct kqueue *kq = kn->kn_kq;
636 mtx_enter(&kq->kq_lock);
638 mtx_leave(&kq->kq_lock);
690 struct kqueue *kq = kn->kn_kq;
705 mtx_enter(&kq->kq_lock);
709 mtx_leave(&kq->kq_lock);
974 struct kqueue *kq = p->p_kq;
995 if (kq->kq_nknotes > 4 * kq->kq_knlistsize)
996 kqueue_purge(p, kq);
1017 struct kqueue *kq;
1019 kq = pool_get(&kqueue_pool, PR_WAITOK | PR_ZERO);
1020 refcnt_init(&kq->kq_refcnt);
1021 kq->kq_fdp = fdp;
1022 TAILQ_INIT(&kq->kq_head);
1023 mtx_init(&kq->kq_lock, IPL_HIGH);
1024 task_set(&kq->kq_task, kqueue_task, kq);
1025 klist_init_mutex(&kq->kq_klist, &kqueue_klist_lock);
1027 return (kq);
1034 struct kqueue *kq;
1040 kq = kqueue_alloc(fdp);
1049 fp->f_data = kq;
1051 LIST_INSERT_HEAD(&fdp->fd_kqlist, kq, kq_next);
1052 kq = NULL;
1057 if (kq != NULL)
1058 pool_put(&kqueue_pool, kq);
1094 struct kqueue *kq;
1125 kq = fp->f_data;
1142 error = kqueue_register(kq, kevp, 0, p);
1166 kqueue_scan_setup(&scan, kq);
1201 kqueue_do_check(struct kqueue *kq, const char *func, int line)
1206 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
1208 TAILQ_FOREACH(kn, &kq->kq_head, kn_tqe) {
1211 panic("%s:%d: kq=%p kn=%p marker QUEUED",
1212 func, line, kq, kn);
1216 panic("%s:%d: kq=%p kn=%p knote !ACTIVE",
1217 func, line, kq, kn);
1219 panic("%s:%d: kq=%p kn=%p knote !QUEUED",
1220 func, line, kq, kn);
1221 if (kn->kn_kq != kq)
1222 panic("%s:%d: kq=%p kn=%p kn_kq=%p != kq",
1223 func, line, kq, kn, kn->kn_kq);
1225 if (count > kq->kq_count)
1229 if (count != kq->kq_count) {
1231 panic("%s:%d: kq=%p kq_count=%d count=%d nmarker=%d",
1232 func, line, kq, kq->kq_count, count, nmarker);
1238 kqueue_register(struct kqueue *kq, struct kevent *kev, unsigned int pollid,
1241 struct filedesc *fdp = kq->kq_fdp;
1248 KASSERT(pollid == 0 || (p != NULL && p->p_kq == kq));
1280 mtx_enter(&kq->kq_lock);
1282 kqueue_expand_list(kq, kev->ident);
1283 if (kev->ident < kq->kq_knlistsize)
1284 list = &kq->kq_knlist[kev->ident];
1286 mtx_enter(&kq->kq_lock);
1288 kqueue_expand_hash(kq);
1289 if (kq->kq_knhashmask != 0) {
1290 list = &kq->kq_knhash[
1291 KN_HASH((u_long)kev->ident, kq->kq_knhashmask)];
1315 mtx_leave(&kq->kq_lock);
1329 kn->kn_kq = kq;
1346 mtx_leave(&kq->kq_lock);
1375 mtx_enter(&kq->kq_lock);
1383 KASSERT(kq == p->p_kq);
1384 mtx_leave(&kq->kq_lock);
1399 mtx_leave(&kq->kq_lock);
1401 mtx_enter(&kq->kq_lock);
1410 mtx_leave(&kq->kq_lock);
1421 mtx_leave(&kq->kq_lock);
1424 mtx_enter(&kq->kq_lock);
1431 mtx_leave(&kq->kq_lock);
1441 kqueue_sleep(struct kqueue *kq, struct timespec *tsp)
1447 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
1454 error = msleep_nsec(kq, &kq->kq_lock, PSOCK | PCATCH | PNORELOCK,
1476 struct kqueue *kq = scan->kqs_kq;
1489 mtx_enter(&kq->kq_lock);
1491 if (kq->kq_state & KQ_DYING) {
1492 mtx_leave(&kq->kq_lock);
1497 if (kq->kq_count == 0) {
1504 mtx_leave(&kq->kq_lock);
1508 kq->kq_state |= KQ_SLEEP;
1509 error = kqueue_sleep(kq, tsp);
1529 TAILQ_INSERT_TAIL(&kq->kq_head, &scan->kqs_end, kn_tqe);
1532 TAILQ_REMOVE(&kq->kq_head, &scan->kqs_end, kn_tqe);
1533 TAILQ_INSERT_TAIL(&kq->kq_head, &scan->kqs_end, kn_tqe);
1536 TAILQ_INSERT_HEAD(&kq->kq_head, &scan->kqs_start, kn_tqe);
1544 TAILQ_REMOVE(&kq->kq_head, &scan->kqs_start, kn_tqe);
1545 TAILQ_INSERT_AFTER(&kq->kq_head, kn, &scan->kqs_start,
1552 mtx_enter(&kq->kq_lock);
1556 kqueue_check(kq);
1557 TAILQ_REMOVE(&kq->kq_head, kn, kn_tqe);
1559 kq->kq_count--;
1560 kqueue_check(kq);
1567 mtx_leave(&kq->kq_lock);
1570 if (p->p_kq == kq &&
1574 mtx_enter(&kq->kq_lock);
1602 mtx_enter(&kq->kq_lock);
1610 mtx_enter(&kq->kq_lock);
1614 kqueue_check(kq);
1624 mtx_enter(&kq->kq_lock);
1626 mtx_enter(&kq->kq_lock);
1633 mtx_enter(&kq->kq_lock);
1635 kqueue_check(kq);
1636 kq->kq_count++;
1638 TAILQ_INSERT_TAIL(&kq->kq_head, kn, kn_tqe);
1644 kqueue_check(kq);
1650 TAILQ_REMOVE(&kq->kq_head, &scan->kqs_start, kn_tqe);
1651 if (reinserted && kq->kq_count != 0)
1652 kqueue_wakeup(kq);
1653 mtx_leave(&kq->kq_lock);
1662 kqueue_scan_setup(struct kqueue_scan_state *scan, struct kqueue *kq)
1666 KQREF(kq);
1667 scan->kqs_kq = kq;
1677 struct kqueue *kq = scan->kqs_kq;
1686 mtx_enter(&kq->kq_lock);
1687 TAILQ_REMOVE(&kq->kq_head, &scan->kqs_end, kn_tqe);
1688 mtx_leave(&kq->kq_lock);
1690 KQRELE(kq);
1718 struct kqueue *kq = fp->f_data;
1721 st->st_size = kq->kq_count; /* unlocked read */
1728 kqueue_purge(struct proc *p, struct kqueue *kq)
1732 mtx_enter(&kq->kq_lock);
1733 for (i = 0; i < kq->kq_knlistsize; i++)
1734 knote_remove(p, kq, &kq->kq_knlist, i, 1);
1735 if (kq->kq_knhashmask != 0) {
1736 for (i = 0; i < kq->kq_knhashmask + 1; i++)
1737 knote_remove(p, kq, &kq->kq_knhash, i, 1);
1739 mtx_leave(&kq->kq_lock);
1743 kqueue_terminate(struct proc *p, struct kqueue *kq)
1748 mtx_enter(&kq->kq_lock);
1754 KASSERT(kq->kq_count == 0);
1755 TAILQ_FOREACH(kn, &kq->kq_head, kn_tqe)
1758 kq->kq_state |= KQ_DYING;
1759 state = kq->kq_state;
1760 kqueue_wakeup(kq);
1761 mtx_leave(&kq->kq_lock);
1767 KASSERT(klist_empty(&kq->kq_klist));
1769 taskq_del_barrier(systqmp, &kq->kq_task);
1775 struct kqueue *kq = fp->f_data;
1779 kqueue_purge(p, kq);
1780 kqueue_terminate(p, kq);
1782 KQRELE(kq);
1790 struct kqueue *kq = arg;
1792 knote(&kq->kq_klist, 0);
1796 kqueue_wakeup(struct kqueue *kq)
1798 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
1800 if (kq->kq_state & KQ_SLEEP) {
1801 kq->kq_state &= ~KQ_SLEEP;
1802 wakeup(kq);
1804 if (!klist_empty(&kq->kq_klist)) {
1806 kq->kq_state |= KQ_TASK;
1807 task_add(systqmp, &kq->kq_task);
1812 kqueue_expand_hash(struct kqueue *kq)
1817 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
1819 if (kq->kq_knhashmask == 0) {
1820 mtx_leave(&kq->kq_lock);
1822 mtx_enter(&kq->kq_lock);
1823 if (kq->kq_knhashmask == 0) {
1824 kq->kq_knhash = hash;
1825 kq->kq_knhashmask = hashmask;
1828 mtx_leave(&kq->kq_lock);
1830 mtx_enter(&kq->kq_lock);
1836 kqueue_expand_list(struct kqueue *kq, int fd)
1841 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
1843 if (kq->kq_knlistsize <= fd) {
1844 size = kq->kq_knlistsize;
1845 mtx_leave(&kq->kq_lock);
1849 mtx_enter(&kq->kq_lock);
1850 if (kq->kq_knlistsize <= fd) {
1851 memcpy(list, kq->kq_knlist,
1852 kq->kq_knlistsize * sizeof(*list));
1853 memset(&list[kq->kq_knlistsize], 0,
1854 (size - kq->kq_knlistsize) * sizeof(*list));
1855 olist = kq->kq_knlist;
1856 osize = kq->kq_knlistsize;
1857 kq->kq_knlist = list;
1858 kq->kq_knlistsize = size;
1859 mtx_leave(&kq->kq_lock);
1861 mtx_enter(&kq->kq_lock);
1864 mtx_leave(&kq->kq_lock);
1866 mtx_enter(&kq->kq_lock);
1884 struct kqueue *kq = kn->kn_kq;
1886 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
1892 mtx_leave(&kq->kq_lock);
1897 msleep_nsec(kn, &kq->kq_lock, PNORELOCK, "kqepts",
1955 struct kqueue *kq;
1961 kq = kn->kn_kq;
1962 mtx_enter(&kq->kq_lock);
1964 mtx_leave(&kq->kq_lock);
1973 knote_remove(struct proc *p, struct kqueue *kq, struct knlist **plist, int idx,
1978 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
1982 KASSERT(kn->kn_kq == kq);
1990 KASSERT(kn->kn_kq == kq);
1996 mtx_enter(&kq->kq_lock);
1999 mtx_leave(&kq->kq_lock);
2010 !(p->p_kq == kq &&
2019 mtx_enter(&kq->kq_lock);
2026 mtx_enter(&kq->kq_lock);
2037 struct kqueue *kq;
2046 LIST_FOREACH(kq, &fdp->fd_kqlist, kq_next) {
2047 mtx_enter(&kq->kq_lock);
2048 if (fd < kq->kq_knlistsize)
2049 knote_remove(p, kq, &kq->kq_knlist, fd, 0);
2050 mtx_leave(&kq->kq_lock);
2086 struct kqueue *kq = kn->kn_kq;
2089 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
2093 KASSERT(kq->kq_knlistsize > kn->kn_id);
2094 list = &kq->kq_knlist[kn->kn_id];
2096 KASSERT(kq->kq_knhashmask != 0);
2097 list = &kq->kq_knhash[KN_HASH(kn->kn_id, kq->kq_knhashmask)];
2100 kq->kq_nknotes++;
2106 struct kqueue *kq = kn->kn_kq;
2109 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
2112 kq->kq_nknotes--;
2114 list = &kq->kq_knlist[kn->kn_id];
2116 list = &kq->kq_knhash[KN_HASH(kn->kn_id, kq->kq_knhashmask)];
2127 struct kqueue *kq = kn->kn_kq;
2131 mtx_enter(&kq->kq_lock);
2139 mtx_leave(&kq->kq_lock);
2150 struct kqueue *kq = kn->kn_kq;
2152 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
2156 kqueue_check(kq);
2157 TAILQ_INSERT_TAIL(&kq->kq_head, kn, kn_tqe);
2159 kq->kq_count++;
2160 kqueue_check(kq);
2161 kqueue_wakeup(kq);
2167 struct kqueue *kq = kn->kn_kq;
2169 MUTEX_ASSERT_LOCKED(&kq->kq_lock);
2173 kqueue_check(kq);
2174 TAILQ_REMOVE(&kq->kq_head, kn, kn_tqe);
2176 kq->kq_count--;
2177 kqueue_check(kq);
2277 struct kqueue *kq;
2285 kq = kn->kn_kq;
2286 mtx_enter(&kq->kq_lock);
2293 mtx_leave(&kq->kq_lock);
2299 mtx_enter(&kq->kq_lock);
2302 mtx_leave(&kq->kq_lock);