On Thu, Dec 24, 2020 at 12:24:01AM +0100, Patrick Wildt wrote:
> Am Wed, Dec 23, 2020 at 05:04:23PM -0600 schrieb Scott Cheloha:
> > On Wed, Dec 23, 2020 at 02:42:18PM -0700, Theo de Raadt wrote:
> > > I agree.  This chunk below is really gross and does not follow the
> > > special wakeup channel metaphor.
> > > 
> > > It is *entirely clear* that a &channel called "nowake" has no wakeup.
> > > Like duh.
> > > 
> > > > +/*
> > > > + * nowake is a global sleep channel for threads that do not want
> > > > + * to receive wakeup(9) broadcasts.
> > > > + */
> > > > +int __nowake;
> > > > +void *nowake = &__nowake;
> > 
> > So we'll go with this?
> > 
> > Index: kern/kern_synch.c
> > ===================================================================
> > RCS file: /cvs/src/sys/kern/kern_synch.c,v
> > retrieving revision 1.172
> > diff -u -p -r1.172 kern_synch.c
> > --- kern/kern_synch.c       7 Dec 2020 16:55:29 -0000       1.172
> > +++ kern/kern_synch.c       23 Dec 2020 23:03:31 -0000
> > @@ -87,6 +87,11 @@ sleep_queue_init(void)
> >             TAILQ_INIT(&slpque[i]);
> >  }
> >  
> > +/*
> > + * Global sleep channel for threads that do not want to
> > + * receive wakeup(9) broadcasts.
> > + */
> > +int nowake;
> >  
> >  /*
> >   * During autoconfiguration or after a panic, a sleep will simply
> > @@ -119,6 +124,7 @@ tsleep(const volatile void *ident, int p
> >  #endif
> >  
> >     KASSERT((priority & ~(PRIMASK | PCATCH)) == 0);
> > +   KASSERT(ident != nowake || ISSET(priority, PCATCH) || timo != 0);
> 
> Sure you compiled this? ident is void *, nowake is int.  Should be ident
> != &nowake?  Same for the other code in the diff.

Whoops.  Thought I had compiled it.

Yes, I meant &nowake.

Index: kern/kern_synch.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_synch.c,v
retrieving revision 1.172
diff -u -p -r1.172 kern_synch.c
--- kern/kern_synch.c   7 Dec 2020 16:55:29 -0000       1.172
+++ kern/kern_synch.c   23 Dec 2020 23:12:10 -0000
@@ -87,6 +87,11 @@ sleep_queue_init(void)
                TAILQ_INIT(&slpque[i]);
 }
 
+/*
+ * Global sleep channel for threads that do not want to
+ * receive wakeup(9) broadcasts.
+ */
+int nowake;
 
 /*
  * During autoconfiguration or after a panic, a sleep will simply
@@ -119,6 +124,7 @@ tsleep(const volatile void *ident, int p
 #endif
 
        KASSERT((priority & ~(PRIMASK | PCATCH)) == 0);
+       KASSERT(ident != &nowake || ISSET(priority, PCATCH) || timo != 0);
 
 #ifdef MULTIPROCESSOR
        KASSERT(timo || _kernel_lock_held());
@@ -213,6 +219,7 @@ msleep(const volatile void *ident, struc
 #endif
 
        KASSERT((priority & ~(PRIMASK | PCATCH | PNORELOCK)) == 0);
+       KASSERT(ident != &nowake || ISSET(priority, PCATCH) || timo != 0);
        KASSERT(mtx != NULL);
 
        if (priority & PCATCH)
@@ -301,6 +308,7 @@ rwsleep(const volatile void *ident, stru
        int error, status;
 
        KASSERT((priority & ~(PRIMASK | PCATCH | PNORELOCK)) == 0);
+       KASSERT(ident != &nowake || ISSET(priority, PCATCH) || timo != 0);
        rw_assert_anylock(rwl);
        status = rw_status(rwl);
 
Index: sys/systm.h
===================================================================
RCS file: /cvs/src/sys/sys/systm.h,v
retrieving revision 1.148
diff -u -p -r1.148 systm.h
--- sys/systm.h 26 Aug 2020 03:29:07 -0000      1.148
+++ sys/systm.h 23 Dec 2020 23:12:10 -0000
@@ -107,6 +107,8 @@ extern struct vnode *rootvp;        /* vnode eq
 extern dev_t swapdev;          /* swapping device */
 extern struct vnode *swapdev_vp;/* vnode equivalent to above */
 
+extern int nowake;             /* dead wakeup(9) channel */
+
 struct proc;
 struct process;
 #define curproc curcpu()->ci_curproc

Reply via email to