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 *);
> 
> 

Reply via email to