Okay, let's try one more time.
This patch adds a global sleep channel, "nowake", for sleeping threads
that don't want to receive wakeup(9) broadcasts.
You use it like this:
#include <sys/systm.h>
tsleep(nowake, ...);
I've added additional assertions to tsleep, msleep, and rwsleep that
ensures that there is *some* way to wake up the thread. You need
either an ident that is not nowake, PCATCH, or a timeout.
I prefer using indirection here to save a character when using it as
the ident, i.e. "nowake" is shorter than "&nowake".
I'll document it when it is used more broadly in the kernel.
ok?
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 20:56:35 -0000
@@ -87,6 +87,12 @@ sleep_queue_init(void)
TAILQ_INIT(&slpque[i]);
}
+/*
+ * nowake is a global sleep channel for threads that do not want
+ * to receive wakeup(9) broadcasts.
+ */
+int __nowake;
+void *nowake = &__nowake;
/*
* During autoconfiguration or after a panic, a sleep will simply
@@ -119,6 +125,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 +220,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 +309,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 20:56:35 -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 void *nowake; /* dead wakeup(9) channel */
+
struct proc;
struct process;
#define curproc curcpu()->ci_curproc