On Fri, Jul 08, 2022 at 03:39:59PM +0000, Visa Hankala wrote:
> Replace struct selinfo with direct use of struct klist in bpf, kqueue
> and pipes. These subsystems no longer utilize selwakeup().
>
> OK?
ok jsg@
>
> Index: kern/kern_event.c
> ===================================================================
> RCS file: src/sys/kern/kern_event.c,v
> retrieving revision 1.191
> diff -u -p -r1.191 kern_event.c
> --- kern/kern_event.c 27 Jun 2022 13:35:21 -0000 1.191
> +++ kern/kern_event.c 8 Jul 2022 15:32:26 -0000
> @@ -38,7 +38,6 @@
> #include <sys/file.h>
> #include <sys/filedesc.h>
> #include <sys/fcntl.h>
> -#include <sys/selinfo.h>
> #include <sys/queue.h>
> #include <sys/event.h>
> #include <sys/eventvar.h>
> @@ -221,7 +220,7 @@ KQRELE(struct kqueue *kq)
> free(kq->kq_knlist, M_KEVENT, kq->kq_knlistsize *
> sizeof(struct knlist));
> hashfree(kq->kq_knhash, KN_HASHSIZE, M_KEVENT);
> - klist_free(&kq->kq_sel.si_note);
> + klist_free(&kq->kq_klist);
> pool_put(&kqueue_pool, kq);
> }
>
> @@ -257,7 +256,7 @@ kqueue_kqfilter(struct file *fp, struct
> return (EINVAL);
>
> kn->kn_fop = &kqread_filtops;
> - klist_insert(&kq->kq_sel.si_note, kn);
> + klist_insert(&kq->kq_klist, kn);
> return (0);
> }
>
> @@ -266,7 +265,7 @@ filt_kqdetach(struct knote *kn)
> {
> struct kqueue *kq = kn->kn_fp->f_data;
>
> - klist_remove(&kq->kq_sel.si_note, kn);
> + klist_remove(&kq->kq_klist, kn);
> }
>
> int
> @@ -849,7 +848,7 @@ kqueue_alloc(struct filedesc *fdp)
> TAILQ_INIT(&kq->kq_head);
> mtx_init(&kq->kq_lock, IPL_HIGH);
> task_set(&kq->kq_task, kqueue_task, kq);
> - klist_init_mutex(&kq->kq_sel.si_note, &kqueue_klist_lock);
> + klist_init_mutex(&kq->kq_klist, &kqueue_klist_lock);
>
> return (kq);
> }
> @@ -1580,7 +1579,7 @@ kqueue_terminate(struct proc *p, struct
> * Any knotes that were attached to this kqueue were deleted
> * by knote_fdclose() when this kqueue's file descriptor was closed.
> */
> - KASSERT(klist_empty(&kq->kq_sel.si_note));
> + KASSERT(klist_empty(&kq->kq_klist));
> if (state & KQ_TASK)
> taskq_del_barrier(systqmp, &kq->kq_task);
> }
> @@ -1606,7 +1605,7 @@ kqueue_task(void *arg)
> struct kqueue *kq = arg;
>
> mtx_enter(&kqueue_klist_lock);
> - KNOTE(&kq->kq_sel.si_note, 0);
> + KNOTE(&kq->kq_klist, 0);
> mtx_leave(&kqueue_klist_lock);
> }
>
> @@ -1619,7 +1618,7 @@ kqueue_wakeup(struct kqueue *kq)
> kq->kq_state &= ~KQ_SLEEP;
> wakeup(kq);
> }
> - if (!klist_empty(&kq->kq_sel.si_note)) {
> + if (!klist_empty(&kq->kq_klist)) {
> /* Defer activation to avoid recursion. */
> kq->kq_state |= KQ_TASK;
> task_add(systqmp, &kq->kq_task);
> Index: kern/sys_pipe.c
> ===================================================================
> RCS file: src/sys/kern/sys_pipe.c,v
> retrieving revision 1.140
> diff -u -p -r1.140 sys_pipe.c
> --- kern/sys_pipe.c 20 Jun 2022 01:39:44 -0000 1.140
> +++ kern/sys_pipe.c 8 Jul 2022 15:32:26 -0000
> @@ -371,7 +371,7 @@ pipeselwakeup(struct pipe *cpipe)
> {
> rw_assert_wrlock(cpipe->pipe_lock);
>
> - KNOTE(&cpipe->pipe_sel.si_note, 0);
> + KNOTE(&cpipe->pipe_klist, 0);
>
> if (cpipe->pipe_state & PIPE_ASYNC)
> pgsigio(&cpipe->pipe_sigio, SIGIO, 0);
> @@ -854,7 +854,7 @@ pipe_kqfilter(struct file *fp, struct kn
> case EVFILT_READ:
> kn->kn_fop = &pipe_rfiltops;
> kn->kn_hook = rpipe;
> - klist_insert_locked(&rpipe->pipe_sel.si_note, kn);
> + klist_insert_locked(&rpipe->pipe_klist, kn);
> break;
> case EVFILT_WRITE:
> if (wpipe == NULL) {
> @@ -864,7 +864,7 @@ pipe_kqfilter(struct file *fp, struct kn
> }
> kn->kn_fop = &pipe_wfiltops;
> kn->kn_hook = wpipe;
> - klist_insert_locked(&wpipe->pipe_sel.si_note, kn);
> + klist_insert_locked(&wpipe->pipe_klist, kn);
> break;
> case EVFILT_EXCEPT:
> if (kn->kn_flags & __EV_SELECT) {
> @@ -879,7 +879,7 @@ pipe_kqfilter(struct file *fp, struct kn
> }
> kn->kn_fop = &pipe_efiltops;
> kn->kn_hook = rpipe;
> - klist_insert_locked(&rpipe->pipe_sel.si_note, kn);
> + klist_insert_locked(&rpipe->pipe_klist, kn);
> break;
> default:
> error = EINVAL;
> @@ -895,7 +895,7 @@ filt_pipedetach(struct knote *kn)
> {
> struct pipe *cpipe = kn->kn_hook;
>
> - klist_remove(&cpipe->pipe_sel.si_note, kn);
> + klist_remove(&cpipe->pipe_klist, kn);
> }
>
> int
> @@ -1011,8 +1011,8 @@ pipe_pair_create(void)
> pp->pp_wpipe.pipe_lock = &pp->pp_lock;
> pp->pp_rpipe.pipe_lock = &pp->pp_lock;
>
> - klist_init_rwlock(&pp->pp_wpipe.pipe_sel.si_note, &pp->pp_lock);
> - klist_init_rwlock(&pp->pp_rpipe.pipe_sel.si_note, &pp->pp_lock);
> + klist_init_rwlock(&pp->pp_wpipe.pipe_klist, &pp->pp_lock);
> + klist_init_rwlock(&pp->pp_rpipe.pipe_klist, &pp->pp_lock);
>
> if (pipe_create(&pp->pp_wpipe) || pipe_create(&pp->pp_rpipe))
> goto err;
> @@ -1026,7 +1026,7 @@ err:
> void
> pipe_pair_destroy(struct pipe_pair *pp)
> {
> - klist_free(&pp->pp_wpipe.pipe_sel.si_note);
> - klist_free(&pp->pp_rpipe.pipe_sel.si_note);
> + klist_free(&pp->pp_wpipe.pipe_klist);
> + klist_free(&pp->pp_rpipe.pipe_klist);
> pool_put(&pipe_pair_pool, pp);
> }
> Index: net/bpf.c
> ===================================================================
> RCS file: src/sys/net/bpf.c,v
> retrieving revision 1.218
> diff -u -p -r1.218 bpf.c
> --- net/bpf.c 5 Jul 2022 15:06:16 -0000 1.218
> +++ net/bpf.c 8 Jul 2022 15:32:26 -0000
> @@ -54,10 +54,11 @@
> #include <sys/sysctl.h>
> #include <sys/rwlock.h>
> #include <sys/atomic.h>
> +#include <sys/event.h>
> +#include <sys/mutex.h>
> #include <sys/refcnt.h>
> #include <sys/smr.h>
> #include <sys/specdev.h>
> -#include <sys/selinfo.h>
> #include <sys/sigio.h>
> #include <sys/task.h>
> #include <sys/time.h>
> @@ -393,7 +394,7 @@ bpfopen(dev_t dev, int flag, int mode, s
> task_set(&bd->bd_wake_task, bpf_wakeup_cb, bd);
> smr_init(&bd->bd_smr);
> sigio_init(&bd->bd_sigio);
> - klist_init_mutex(&bd->bd_sel.si_note, &bd->bd_mtx);
> + klist_init_mutex(&bd->bd_klist, &bd->bd_mtx);
>
> bd->bd_rtout = 0; /* no timeout by default */
>
> @@ -585,7 +586,7 @@ bpf_wakeup(struct bpf_d *d)
> if (d->bd_nreaders)
> wakeup(d);
>
> - KNOTE(&d->bd_sel.si_note, 0);
> + KNOTE(&d->bd_klist, 0);
>
> /*
> * As long as pgsigio() needs to be protected
> @@ -1161,7 +1162,7 @@ bpfkqfilter(dev_t dev, struct knote *kn)
>
> switch (kn->kn_filter) {
> case EVFILT_READ:
> - klist = &d->bd_sel.si_note;
> + klist = &d->bd_klist;
> kn->kn_fop = &bpfread_filtops;
> break;
> default:
> @@ -1180,7 +1181,7 @@ filt_bpfrdetach(struct knote *kn)
> {
> struct bpf_d *d = kn->kn_hook;
>
> - klist_remove(&d->bd_sel.si_note, kn);
> + klist_remove(&d->bd_klist, kn);
> bpf_put(d);
> }
>
> @@ -1591,7 +1592,7 @@ bpf_d_smr(void *smr)
> if (bd->bd_wfilter != NULL)
> bpf_prog_smr(bd->bd_wfilter);
>
> - klist_free(&bd->bd_sel.si_note);
> + klist_free(&bd->bd_klist);
> free(bd, M_DEVBUF, sizeof(*bd));
> }
>
> @@ -1684,7 +1685,7 @@ bpfsdetach(void *p)
>
> while ((bd = SMR_SLIST_FIRST_LOCKED(&bp->bif_dlist))) {
> vdevgone(maj, bd->bd_unit, bd->bd_unit, VCHR);
> - klist_invalidate(&bd->bd_sel.si_note);
> + klist_invalidate(&bd->bd_klist);
> }
>
> for (tbp = bpf_iflist; tbp; tbp = tbp->bif_next) {
> Index: net/bpfdesc.h
> ===================================================================
> RCS file: src/sys/net/bpfdesc.h,v
> retrieving revision 1.46
> diff -u -p -r1.46 bpfdesc.h
> --- net/bpfdesc.h 17 Mar 2022 14:22:03 -0000 1.46
> +++ net/bpfdesc.h 8 Jul 2022 15:32:26 -0000
> @@ -99,7 +99,7 @@ struct bpf_d {
> struct sigio_ref
> bd_sigio; /* async I/O registration */
> struct refcnt bd_refcnt; /* reference count */
> - struct selinfo bd_sel; /* bsd select info */
> + struct klist bd_klist; /* list of knotes */
> int bd_unit; /* logical unit number */
> LIST_ENTRY(bpf_d) bd_list; /* descriptor list */
>
> Index: sys/eventvar.h
> ===================================================================
> RCS file: src/sys/sys/eventvar.h,v
> retrieving revision 1.16
> diff -u -p -r1.16 eventvar.h
> --- sys/eventvar.h 27 Jun 2022 13:35:21 -0000 1.16
> +++ sys/eventvar.h 8 Jul 2022 15:32:26 -0000
> @@ -41,6 +41,7 @@
> /*
> * Locking:
> * I immutable after creation
> + * L kqueue_klist_lock
> * a atomic operations
> * q kq_lock
> */
> @@ -49,7 +50,7 @@ struct kqueue {
> TAILQ_HEAD(, knote) kq_head; /* [q] list of pending event */
> int kq_count; /* [q] # of pending events */
> struct refcnt kq_refcnt; /* [a] # of references */
> - struct selinfo kq_sel;
> + struct klist kq_klist; /* [L] knotes of other kqs */
> struct filedesc *kq_fdp; /* [I] fd table of this kq */
>
> LIST_ENTRY(kqueue) kq_next;
> Index: sys/pipe.h
> ===================================================================
> RCS file: src/sys/sys/pipe.h,v
> retrieving revision 1.28
> diff -u -p -r1.28 pipe.h
> --- sys/pipe.h 20 Jun 2022 01:39:44 -0000 1.28
> +++ sys/pipe.h 8 Jul 2022 15:32:26 -0000
> @@ -26,9 +26,9 @@
>
> #ifndef _KERNEL
> #include <sys/time.h> /* for struct timespec */
> -#include <sys/selinfo.h> /* for struct selinfo */
> #endif /* _KERNEL */
>
> +#include <sys/event.h> /* for struct klist */
> #include <sys/sigio.h> /* for struct sigio_ref */
>
> /*
> @@ -80,7 +80,7 @@ struct pipe_pair;
> struct pipe {
> struct rwlock *pipe_lock;
> struct pipebuf pipe_buffer; /* [p] data storage */
> - struct selinfo pipe_sel; /* [p] for compat with select */
> + struct klist pipe_klist; /* [p] list of knotes */
> struct timespec pipe_atime; /* [p] time of last access */
> struct timespec pipe_mtime; /* [p] time of last modify */
> struct timespec pipe_ctime; /* [I] time of status change */
>
>