summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2020-12-09 18:58:19 +0000
committermpi <mpi@openbsd.org>2020-12-09 18:58:19 +0000
commit39f6f77817c76a2be04e8fca4529d9602479e56e (patch)
treeb0039bf89bf36c2b8b77415d2d524f798ac7b08c
parentfxp does not currently fit (diff)
downloadwireguard-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.c36
-rw-r--r--sys/kern/kern_exit.c4
-rw-r--r--sys/sys/event.h5
-rw-r--r--sys/sys/proc.h5
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*/