diff options
author | 2020-12-09 18:58:19 +0000 | |
---|---|---|
committer | 2020-12-09 18:58:19 +0000 | |
commit | 39f6f77817c76a2be04e8fca4529d9602479e56e (patch) | |
tree | b0039bf89bf36c2b8b77415d2d524f798ac7b08c | |
parent | fxp does not currently fit (diff) | |
download | wireguard-openbsd-39f6f77817c76a2be04e8fca4529d9602479e56e.tar.xz wireguard-openbsd-39f6f77817c76a2be04e8fca4529d9602479e56e.zip |
Add kernel-only per-thread kqueue & helpers to initialize and free it.
This will soon be used by select(2) and poll(2).
ok anton@, visa@
-rw-r--r-- | sys/kern/kern_event.c | 36 | ||||
-rw-r--r-- | sys/kern/kern_exit.c | 4 | ||||
-rw-r--r-- | sys/sys/event.h | 5 | ||||
-rw-r--r-- | sys/sys/proc.h | 5 |
4 files changed, 45 insertions, 5 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index d945c0692d3..9cd7c7dac8f 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_event.c,v 1.146 2020/12/07 11:15:50 mpi Exp $ */ +/* $OpenBSD: kern_event.c,v 1.147 2020/12/09 18:58:19 mpi Exp $ */ /*- * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org> @@ -57,6 +57,7 @@ #include <sys/timeout.h> #include <sys/wait.h> +struct kqueue *kqueue_alloc(struct filedesc *); void kqueue_terminate(struct proc *p, struct kqueue *); void kqueue_free(struct kqueue *); void kqueue_init(void); @@ -504,6 +505,31 @@ const struct filterops dead_filtops = { .f_event = filt_dead, }; +void +kqpoll_init(void) +{ + struct proc *p = curproc; + + if (p->p_kq != NULL) + return; + + p->p_kq = kqueue_alloc(p->p_fd); + p->p_kq_serial = arc4random(); +} + +void +kqpoll_exit(void) +{ + struct proc *p = curproc; + + if (p->p_kq == NULL) + return; + + kqueue_terminate(p, p->p_kq); + kqueue_free(p->p_kq); + p->p_kq = NULL; +} + struct kqueue * kqueue_alloc(struct filedesc *fdp) { @@ -1144,7 +1170,7 @@ kqueue_stat(struct file *fp, struct stat *st, struct proc *p) } void -kqueue_terminate(struct proc *p, struct kqueue *kq) +kqueue_purge(struct proc *p, struct kqueue *kq) { int i; @@ -1156,6 +1182,12 @@ kqueue_terminate(struct proc *p, struct kqueue *kq) for (i = 0; i < kq->kq_knhashmask + 1; i++) knote_remove(p, &kq->kq_knhash[i]); } +} + +void +kqueue_terminate(struct proc *p, struct kqueue *kq) +{ + kqueue_purge(p, kq); kq->kq_state |= KQ_DYING; kqueue_wakeup(kq); diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 92bbfe915b5..4738000e10d 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_exit.c,v 1.192 2020/12/07 16:55:28 mpi Exp $ */ +/* $OpenBSD: kern_exit.c,v 1.193 2020/12/09 18:58:19 mpi Exp $ */ /* $NetBSD: kern_exit.c,v 1.39 1996/04/22 01:38:25 christos Exp $ */ /* @@ -185,6 +185,8 @@ exit1(struct proc *p, int xexit, int xsig, int flags) if ((p->p_flag & P_THREAD) == 0) pr->ps_siglist = 0; + kqpoll_exit(); + #if NKCOV > 0 kcov_exit(p); #endif diff --git a/sys/sys/event.h b/sys/sys/event.h index 9534b673836..93cc2200deb 100644 --- a/sys/sys/event.h +++ b/sys/sys/event.h @@ -1,4 +1,4 @@ -/* $OpenBSD: event.h,v 1.48 2020/12/07 11:15:50 mpi Exp $ */ +/* $OpenBSD: event.h,v 1.49 2020/12/09 18:58:19 mpi Exp $ */ /*- * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org> @@ -215,6 +215,8 @@ struct timespec; extern const struct filterops sig_filtops; extern const struct filterops dead_filtops; +extern void kqpoll_init(void); +extern void kqpoll_exit(void); extern void knote(struct klist *list, long hint); extern void knote_activate(struct knote *); extern void knote_remove(struct proc *p, struct knlist *list); @@ -226,6 +228,7 @@ extern int kqueue_scan(struct kqueue_scan_state *, int, struct kevent *, struct timespec *, struct proc *, int *); extern void kqueue_scan_setup(struct kqueue_scan_state *, struct kqueue *); extern void kqueue_scan_finish(struct kqueue_scan_state *); +extern void kqueue_purge(struct proc *, struct kqueue *); extern int filt_seltrue(struct knote *kn, long hint); extern int seltrue_kqfilter(dev_t, struct knote *); extern void klist_insert(struct klist *, struct knote *); diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 6ab055506e9..929691496e7 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.h,v 1.302 2020/12/07 16:55:29 mpi Exp $ */ +/* $OpenBSD: proc.h,v 1.303 2020/12/09 18:58:19 mpi Exp $ */ /* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */ /*- @@ -324,6 +324,7 @@ struct process { struct kcov_dev; struct lock_list_entry; +struct kqueue; struct p_inentry { u_long ie_serial; @@ -390,6 +391,8 @@ struct proc { struct plimit *p_limit; /* [l] read ref. of p_p->ps_limit */ struct kcov_dev *p_kd; /* kcov device handle */ struct lock_list_entry *p_sleeplocks; /* WITNESS lock tracking */ + struct kqueue *p_kq; /* [o] select/poll queue of evts */ + unsigned long p_kq_serial; /* [o] to check against enqueued evts */ int p_siglist; /* [a] Signals arrived & not delivered*/ |