On Sat, Jul 02, 2022 at 02:12:56PM +0000, Visa Hankala wrote:
> Remove the leftovers of the old poll/select mechanism.
> This includes the fields si_seltid and si_flags in struct selinfo.
> They should now always be zero because nothing calls selrecord().
>
> selwakeup() becomes a wrapper for KNOTE(). I do not want to change
> it further in this patch. This code can be subtle, as shown by the
> socket selwakeup() experiment in May. ;)
>
> The selwakeup() call in bpf_wakeup_cb() can be removed as the kqueue
> event filter ignores it.
>
> The patch makes kern.nselcoll sysctl constant. However, is there any
> actual need to keep this sysctl? vmstat(1) is the only user of
> KERN_NSELCOLL in base. Debian code search does not reveal uses that
> would affect ports.
ok jsg@
>
> Index: bin/ps/ps.1
> ===================================================================
> RCS file: src/bin/ps/ps.1,v
> retrieving revision 1.125
> diff -u -p -r1.125 ps.1
> --- bin/ps/ps.1 31 Mar 2022 17:27:14 -0000 1.125
> +++ bin/ps/ps.1 2 Jul 2022 13:51:19 -0000
> @@ -222,7 +222,6 @@ P_PROFPEND 0x2 this thread needs
> P_ALRMPEND 0x4 this thread needs SIGVTALRM
> P_SIGSUSPEND 0x8 need to restore before-suspend mask
> P_CANTSLEEP 0x10 this thread is not permitted to sleep
> -P_SELECT 0x40 selecting; wakeup/waiting danger
> P_SINTR 0x80 sleep is interruptible
> P_SYSTEM 0x200 system process: no sigs, stats, or
> swapping
> Index: sys/dev/wscons/wsdisplay.c
> ===================================================================
> RCS file: src/sys/dev/wscons/wsdisplay.c,v
> retrieving revision 1.146
> diff -u -p -r1.146 wsdisplay.c
> --- sys/dev/wscons/wsdisplay.c 2 Jul 2022 08:50:42 -0000 1.146
> +++ sys/dev/wscons/wsdisplay.c 2 Jul 2022 13:51:45 -0000
> @@ -1441,7 +1441,7 @@ wsdisplaystart(struct tty *tp)
> splx(s);
> return;
> }
> - if (tp->t_outq.c_cc == 0 && tp->t_wsel.si_seltid == 0)
> + if (tp->t_outq.c_cc == 0)
> goto low;
>
> if ((scr = sc->sc_scr[WSDISPLAYSCREEN(tp->t_dev)]) == NULL) {
> Index: sys/kern/kern_sysctl.c
> ===================================================================
> RCS file: src/sys/kern/kern_sysctl.c,v
> retrieving revision 1.402
> diff -u -p -r1.402 kern_sysctl.c
> --- sys/kern/kern_sysctl.c 21 Mar 2022 09:12:34 -0000 1.402
> +++ sys/kern/kern_sysctl.c 2 Jul 2022 13:51:45 -0000
> @@ -120,7 +120,7 @@
>
> extern struct forkstat forkstat;
> extern struct nchstats nchstats;
> -extern int nselcoll, fscale;
> +extern int fscale;
> extern fixpt_t ccpu;
> extern long numvnodes;
> extern int allowdt;
> @@ -298,7 +298,7 @@ const struct sysctl_bounded_args kern_va
> {KERN_NFILES, &numfiles, SYSCTL_INT_READONLY},
> {KERN_TTYCOUNT, &tty_count, SYSCTL_INT_READONLY},
> {KERN_ARGMAX, &arg_max, SYSCTL_INT_READONLY},
> - {KERN_NSELCOLL, &nselcoll, SYSCTL_INT_READONLY},
> + {KERN_NSELCOLL, &int_zero, SYSCTL_INT_READONLY},
> {KERN_POSIX1, &posix_version, SYSCTL_INT_READONLY},
> {KERN_NGROUPS, &ngroups_max, SYSCTL_INT_READONLY},
> {KERN_JOB_CONTROL, &int_one, SYSCTL_INT_READONLY},
> Index: sys/kern/sys_generic.c
> ===================================================================
> RCS file: src/sys/kern/sys_generic.c,v
> retrieving revision 1.147
> diff -u -p -r1.147 sys_generic.c
> --- sys/kern/sys_generic.c 8 Feb 2022 08:56:41 -0000 1.147
> +++ sys/kern/sys_generic.c 2 Jul 2022 13:51:45 -0000
> @@ -89,7 +89,6 @@ int dopselect(struct proc *, int, fd_set
> struct timespec *, const sigset_t *, register_t *);
> int doppoll(struct proc *, struct pollfd *, u_int, struct timespec *,
> const sigset_t *, register_t *);
> -void doselwakeup(struct selinfo *);
>
> int
> iovec_copyin(const struct iovec *uiov, struct iovec **iovp, struct iovec
> *aiov,
> @@ -522,8 +521,6 @@ out:
> return (error);
> }
>
> -int selwait, nselcoll;
> -
> /*
> * Select system call.
> */
> @@ -840,41 +837,6 @@ pselcollect(struct proc *p, struct keven
> return (0);
> }
>
> -int
> -seltrue(dev_t dev, int events, struct proc *p)
> -{
> -
> - return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
> -}
> -
> -int
> -selfalse(dev_t dev, int events, struct proc *p)
> -{
> -
> - return (0);
> -}
> -
> -/*
> - * Record a select request.
> - */
> -void
> -selrecord(struct proc *selector, struct selinfo *sip)
> -{
> - struct proc *p;
> - pid_t mytid;
> -
> - KERNEL_ASSERT_LOCKED();
> -
> - mytid = selector->p_tid;
> - if (sip->si_seltid == mytid)
> - return;
> - if (sip->si_seltid && (p = tfind(sip->si_seltid)) &&
> - p->p_wchan == (caddr_t)&selwait)
> - sip->si_flags |= SI_COLL;
> - else
> - sip->si_seltid = mytid;
> -}
> -
> /*
> * Do a wakeup when a selectable event occurs.
> */
> @@ -883,34 +845,9 @@ selwakeup(struct selinfo *sip)
> {
> KERNEL_LOCK();
> KNOTE(&sip->si_note, NOTE_SUBMIT);
> - doselwakeup(sip);
> KERNEL_UNLOCK();
> }
>
> -void
> -doselwakeup(struct selinfo *sip)
> -{
> - struct proc *p;
> -
> - KERNEL_ASSERT_LOCKED();
> -
> - if (sip->si_seltid == 0)
> - return;
> - if (sip->si_flags & SI_COLL) {
> - nselcoll++;
> - sip->si_flags &= ~SI_COLL;
> - wakeup(&selwait);
> - }
> - p = tfind(sip->si_seltid);
> - sip->si_seltid = 0;
> - if (p != NULL) {
> - if (wakeup_proc(p, &selwait)) {
> - /* nothing else to do */
> - } else if (p->p_flag & P_SELECT)
> - atomic_clearbits_int(&p->p_flag, P_SELECT);
> - }
> -}
> -
> /*
> * Only copyout the revents field.
> */
> Index: sys/net/bpf.c
> ===================================================================
> RCS file: src/sys/net/bpf.c,v
> retrieving revision 1.217
> diff -u -p -r1.217 bpf.c
> --- sys/net/bpf.c 2 Jul 2022 08:50:42 -0000 1.217
> +++ sys/net/bpf.c 2 Jul 2022 13:51:45 -0000
> @@ -588,11 +588,11 @@ bpf_wakeup(struct bpf_d *d)
> KNOTE(&d->bd_sel.si_note, 0);
>
> /*
> - * As long as pgsigio() and selwakeup() need to be protected
> + * As long as pgsigio() needs to be protected
> * by the KERNEL_LOCK() we have to delay the wakeup to
> * another context to keep the hot path KERNEL_LOCK()-free.
> */
> - if ((d->bd_async && d->bd_sig) || d->bd_sel.si_seltid != 0) {
> + if (d->bd_async && d->bd_sig) {
> bpf_get(d);
> if (!task_add(systq, &d->bd_wake_task))
> bpf_put(d);
> @@ -607,9 +607,6 @@ bpf_wakeup_cb(void *xd)
> if (d->bd_async && d->bd_sig)
> pgsigio(&d->bd_sigio, d->bd_sig, 0);
>
> - mtx_enter(&d->bd_mtx);
> - selwakeup(&d->bd_sel);
> - mtx_leave(&d->bd_mtx);
> bpf_put(d);
> }
>
> @@ -1192,9 +1189,6 @@ filt_bpfread(struct knote *kn, long hint
> {
> struct bpf_d *d = kn->kn_hook;
>
> - if (hint == NOTE_SUBMIT) /* ignore activation from selwakeup */
> - return (0);
> -
> MUTEX_ASSERT_LOCKED(&d->bd_mtx);
>
> kn->kn_data = d->bd_hlen;
> Index: sys/sys/proc.h
> ===================================================================
> RCS file: src/sys/sys/proc.h,v
> retrieving revision 1.332
> diff -u -p -r1.332 proc.h
> --- sys/sys/proc.h 29 Jun 2022 12:17:31 -0000 1.332
> +++ sys/sys/proc.h 2 Jul 2022 13:51:45 -0000
> @@ -409,7 +409,6 @@ struct proc {
> #define P_ALRMPEND 0x00000004 /* SIGVTALRM needs to be posted
> */
> #define P_SIGSUSPEND 0x00000008 /* Need to restore
> before-suspend mask*/
> #define P_CANTSLEEP 0x00000010 /* insomniac thread */
> -#define P_SELECT 0x00000040 /* Selecting; wakeup/waiting
> danger. */
> #define P_SINTR 0x00000080 /* Sleep is interruptible. */
> #define P_SYSTEM 0x00000200 /* No sigs, stats or swapping.
> */
> #define P_TIMEOUT 0x00000400 /* Timing out during sleep. */
> @@ -424,7 +423,7 @@ struct proc {
>
> #define P_BITS \
> ("\20" "\01INKTR" "\02PROFPEND" "\03ALRMPEND" "\04SIGSUSPEND" \
> - "\05CANTSLEEP" "\07SELECT" "\010SINTR" "\012SYSTEM" "\013TIMEOUT" \
> + "\05CANTSLEEP" "\010SINTR" "\012SYSTEM" "\013TIMEOUT" \
> "\016WEXIT" "\020OWEUPC" "\024SUSPSINGLE" "\027XX" \
> "\030CONTINUED" "\033THREAD" "\034SUSPSIG" "\035SOFTDEP" "\037CPUPEG")
>
> Index: sys/sys/selinfo.h
> ===================================================================
> RCS file: src/sys/sys/selinfo.h,v
> retrieving revision 1.5
> diff -u -p -r1.5 selinfo.h
> --- sys/sys/selinfo.h 18 Jul 2017 19:20:26 -0000 1.5
> +++ sys/sys/selinfo.h 2 Jul 2022 13:51:45 -0000
> @@ -42,15 +42,9 @@
> */
> struct selinfo {
> struct klist si_note; /* kernel note list */
> - pid_t si_seltid; /* thread to be notified */
> - short si_flags; /* see below */
> };
> -#define SI_COLL 0x0001 /* collision occurred */
>
> #ifdef _KERNEL
> -struct proc;
> -
> -void selrecord(struct proc *selector, struct selinfo *);
> void selwakeup(struct selinfo *);
> #endif
>
> Index: sys/sys/systm.h
> ===================================================================
> RCS file: src/sys/sys/systm.h,v
> retrieving revision 1.155
> diff -u -p -r1.155 systm.h
> --- sys/sys/systm.h 9 Dec 2021 00:26:10 -0000 1.155
> +++ sys/sys/systm.h 2 Jul 2022 13:51:45 -0000
> @@ -91,7 +91,6 @@ extern int ncpusfound; /* number of CPU
> extern int nblkdev; /* number of entries in bdevsw */
> extern int nchrdev; /* number of entries in cdevsw */
>
> -extern int selwait; /* select timeout address */
> extern int maxmem; /* max memory per process */
> extern int physmem; /* physical memory */
>
> @@ -151,8 +150,6 @@ int enoioctl(void);
> int enxio(void);
> int eopnotsupp(void *);
>
> -int seltrue(dev_t dev, int which, struct proc *);
> -int selfalse(dev_t dev, int which, struct proc *);
> void *hashinit(int, int, int, u_long *);
> void hashfree(void *, int, int);
> int sys_nosys(struct proc *, void *, register_t *);
>
>