From: Tim Leslie Subject: Re: Remove last callers of the lbolt sleep channel To: Claudio Jeker Cc: Vitaliy Makkoveev , "tech@openbsd.org" Date: Wed, 24 Sep 2025 16:20:08 +0000 > > So I prefer to use `nowake', because this 100% exclude the fallout from > > current or hypothetical newly introduced wakeup(pr->ps_pgrp). > > > I agree with this. Replacing this with 'nowake' is the right way since > only the 1sec timer should wake up these ttysleeps. Updated diff below. Tim -- diff --git a/sys/kern/sched_bsd.c b/sys/kern/sched_bsd.c --- a/sys/kern/sched_bsd.c +++ b/sys/kern/sched_bsd.c @@ -55,7 +55,6 @@ #endif uint64_t roundrobin_period; /* [I] roundrobin period (ns) */ -int lbolt; /* once a second sleep address */ struct mutex sched_lock; @@ -282,7 +281,6 @@ schedcpu(void *unused) } SCHED_UNLOCK(); } - wakeup(&lbolt); timeout_add_sec(&to, 1); } diff --git a/sys/kern/tty.c b/sys/kern/tty.c --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -747,8 +747,8 @@ ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p) if (pr->ps_pgrp->pg_jobc == 0) return (EIO); pgsignal(pr->ps_pgrp, SIGTTOU, 1); - error = ttysleep(tp, &lbolt, TTOPRI | PCATCH, - ttybg); + error = ttysleep_nsec(tp, &nowake, TTOPRI | PCATCH, + ttybg, SEC_TO_NSEC(1)); if (error) return (error); } @@ -1515,7 +1515,8 @@ loop: lflag = tp->t_lflag; goto out; } pgsignal(pr->ps_pgrp, SIGTTIN, 1); - error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, ttybg); + error = ttysleep_nsec(tp, &nowake, TTIPRI | PCATCH, ttybg, + SEC_TO_NSEC(1)); if (error) goto out; goto loop; @@ -1613,8 +1614,8 @@ read: ISSET(lflag, IEXTEN | ISIG) == (IEXTEN | ISIG)) { pgsignal(tp->t_pgrp, SIGTSTP, 1); if (first) { - error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, - ttybg); + error = ttysleep_nsec(tp, &nowake, TTIPRI | PCATCH, + ttybg, SEC_TO_NSEC(1)); if (error) break; goto loop; @@ -1765,7 +1766,8 @@ loop: goto out; } pgsignal(pr->ps_pgrp, SIGTTOU, 1); - error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, ttybg); + error = ttysleep_nsec(tp, &nowake, TTIPRI | PCATCH, ttybg, + SEC_TO_NSEC(1)); if (error) goto out; goto loop; diff --git a/sys/kern/tty_pty.c b/sys/kern/tty_pty.c --- a/sys/kern/tty_pty.c +++ b/sys/kern/tty_pty.c @@ -294,7 +294,8 @@ again: pr->ps_flags & PS_PPWAIT) return (EIO); pgsignal(pr->ps_pgrp, SIGTTIN, 1); - error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, ttybg); + error = ttysleep_nsec(tp, &nowake, TTIPRI | PCATCH, + ttybg, SEC_TO_NSEC(1)); if (error) return (error); } diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h --- a/sys/sys/kernel.h +++ b/sys/sys/kernel.h @@ -55,7 +55,6 @@ extern int ticks; /* # of hardclock ticks */ extern int hz; /* system clock's frequency */ extern int stathz; /* statistics clock's frequency */ extern int profhz; /* profiling clock's frequency */ -extern int lbolt; /* once a second sleep address */ #ifndef HZ #define HZ 100 diff --git a/sys/sys/tty.h b/sys/sys/tty.h --- a/sys/sys/tty.h +++ b/sys/sys/tty.h @@ -290,6 +290,7 @@ void ttypend(struct tty *tp); int ttyretype(struct tty *tp); int ttyrub(int c, struct tty *tp); int ttysleep(struct tty *tp, void *chan, int pri, char *wmesg); +int ttysleep_nsec(struct tty *, void *, int, char *, uint64_t); int ttywait(struct tty *tp); int ttywflush(struct tty *tp); void ttytstamp(struct tty *tp, int octs, int ncts, int odcd, int ndcd);