Index | Thread | Search

From:
Vitaliy Makkoveev <mvs@openbsd.org>
Subject:
Re: Remove last callers of the lbolt sleep channel
To:
Tim Leslie <tleslie@protonmail.com>
Cc:
Claudio Jeker <cjeker@diehard.n-r-g.com>, "tech@openbsd.org" <tech@openbsd.org>
Date:
Wed, 24 Sep 2025 20:07:29 +0300

Download raw body.

Thread
On Wed, Sep 24, 2025 at 04:20:08PM +0000, Tim Leslie wrote:
> > > 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
> 

Since you added ttysleep_nsec() declaration to sys/tty.h, you don't need
this declaration in kern/tty.c. With this fix this diff is ok by mvs.

I will commit it by myself unless someone has objections or commit it by
himself.

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