CVSROOT:        /cvs
Module name:    src
Changes by:     [email protected] 2020/12/23 18:16:14

Modified files:
        sys/kern       : kern_synch.c 
        sys/sys        : systm.h 

Log message:
tsleep(9): add global "nowake" channel for threads avoiding wakeup(9)

It would be convenient if there were a channel a thread could sleep on
to indicate they do not want any wakeup(9) broadcasts.  The easiest way
to do this is to add an "int nowake" to kern_synch.c and extern it in
sys/systm.h.  You use it like this:

#include <sys/systm.h>

tsleep_nsec(&nowait, ...);

There is now no need to handroll a local dead channel, e.g.

int chan;

tsleep_nsec(&chan, ...);

which expands the stack.  Local dead channels will be replaced with
&nowake in later patches.

One possible problem with this "one global channel" approach is sleep
queue congestion.  If you have lots of threads sleeping on &nowake you
might slow down a wakeup(9) on a different channel that hashes into
the same queue.  Unsure how much of problem this actually is, if at all.

NetBSD and FreeBSD have a "pause" interface in the kernel that chooses
a suitable channel automatically.  To keep things simple and avoid
adding a new interface we will start with this global channel.

Discussed with mpi@, claudio@, kettenis@, and deraadt@.

Basically designed by kettenis@, who vetoed my other proposals.

Bugs caught by deraadt@, tb@, and patrick@.

Reply via email to