diff options
author | 2020-05-30 14:10:17 +0000 | |
---|---|---|
committer | 2020-05-30 14:10:17 +0000 | |
commit | d9144382e8a0f4830dccf16fe6188175fafa7738 (patch) | |
tree | 39ace2f19650f6e1e25a858867d541d666027f98 | |
parent | Fix UVIDEO_DEBUG build (diff) | |
download | wireguard-openbsd-d9144382e8a0f4830dccf16fe6188175fafa7738.tar.xz wireguard-openbsd-d9144382e8a0f4830dccf16fe6188175fafa7738.zip |
Introduce kqueue_terminate() & kqueue_free(), no functional changes.
These functions will be used to managed per-thread kqueues that are not
associated to a file descriptor.
ok visa@
-rw-r--r-- | sys/kern/kern_event.c | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 99135d4589b..6808d90dc4b 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_event.c,v 1.133 2020/05/25 15:54:10 visa Exp $ */ +/* $OpenBSD: kern_event.c,v 1.134 2020/05/30 14:10:17 mpi Exp $ */ /*- * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org> @@ -57,6 +57,8 @@ #include <sys/timeout.h> #include <sys/wait.h> +void kqueue_terminate(struct proc *p, struct kqueue *); +void kqueue_free(struct kqueue *); void kqueue_init(void); void KQREF(struct kqueue *); void KQRELE(struct kqueue *); @@ -181,6 +183,12 @@ KQRELE(struct kqueue *kq) fdpunlock(fdp); } + kqueue_free(kq); +} + +void +kqueue_free(struct kqueue *kq) +{ free(kq->kq_knlist, M_KEVENT, kq->kq_knlistsize * sizeof(struct knlist)); hashfree(kq->kq_knhash, KN_HASHSIZE, M_KEVENT); @@ -492,13 +500,10 @@ static const struct filterops dead_filtops = { .f_event = filt_dead, }; -int -sys_kqueue(struct proc *p, void *v, register_t *retval) +struct kqueue * +kqueue_alloc(struct filedesc *fdp) { - struct filedesc *fdp = p->p_fd; struct kqueue *kq; - struct file *fp; - int fd, error; kq = pool_get(&kqueue_pool, PR_WAITOK | PR_ZERO); kq->kq_refs = 1; @@ -506,6 +511,19 @@ sys_kqueue(struct proc *p, void *v, register_t *retval) TAILQ_INIT(&kq->kq_head); task_set(&kq->kq_task, kqueue_task, kq); + return (kq); +} + +int +sys_kqueue(struct proc *p, void *v, register_t *retval) +{ + struct filedesc *fdp = p->p_fd; + struct kqueue *kq; + struct file *fp; + int fd, error; + + kq = kqueue_alloc(fdp); + fdplock(fdp); error = falloc(p, &fp, &fd); if (error) @@ -1069,13 +1087,12 @@ kqueue_stat(struct file *fp, struct stat *st, struct proc *p) return (0); } -int -kqueue_close(struct file *fp, struct proc *p) +void +kqueue_terminate(struct proc *p, struct kqueue *kq) { - struct kqueue *kq = fp->f_data; int i; - KERNEL_LOCK(); + KERNEL_ASSERT_LOCKED(); for (i = 0; i < kq->kq_knlistsize; i++) knote_remove(p, &kq->kq_knlist[i]); @@ -1083,14 +1100,23 @@ kqueue_close(struct file *fp, struct proc *p) for (i = 0; i < kq->kq_knhashmask + 1; i++) knote_remove(p, &kq->kq_knhash[i]); } - fp->f_data = NULL; - kq->kq_state |= KQ_DYING; kqueue_wakeup(kq); KASSERT(klist_empty(&kq->kq_sel.si_note)); task_del(systq, &kq->kq_task); +} + +int +kqueue_close(struct file *fp, struct proc *p) +{ + struct kqueue *kq = fp->f_data; + + KERNEL_LOCK(); + kqueue_terminate(p, kq); + fp->f_data = NULL; + KQRELE(kq); KERNEL_UNLOCK(); |