Index | Thread | Search

From:
Claudio Jeker <cjeker@diehard.n-r-g.com>
Subject:
Re: remove flag setting from proc_wakeup()
To:
David Gwynne <david@gwynne.id.au>
Cc:
tech@openbsd.org, visa@openbsd.org
Date:
Wed, 30 Apr 2025 06:55:31 +0200

Download raw body.

Thread
On Wed, Apr 30, 2025 at 10:51:18AM +1000, David Gwynne wrote:
> only endtsleep() sets flags via proc_wakeup, but it sets it's own flags
> later. we can use the return value from proc_wakeup and the existing
> flag setting to get the same effect.
> 
> ok?

I'm unsure about this. I did this change in perparation for fine grained
SCHED_LOCK and then we may have the pronlem that the proc starts running
before P_TIMEOUT is set. This could already be a problem now since you set
the flag after SCHED_UNLOCK.
 
> Index: dev/pci/drm/drm_linux.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/drm/drm_linux.c,v
> diff -u -p -r1.122 drm_linux.c
> --- dev/pci/drm/drm_linux.c	10 Mar 2025 09:28:56 -0000	1.122
> +++ dev/pci/drm/drm_linux.c	30 Apr 2025 00:46:12 -0000
> @@ -164,7 +164,7 @@ wake_up_process(struct proc *p)
>  	int rv;
>  
>  	SCHED_LOCK();
> -	rv = wakeup_proc(p, 0);
> +	rv = wakeup_proc(p);
>  	SCHED_UNLOCK();
>  	return rv;
>  }
> Index: kern/kern_synch.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_synch.c,v
> diff -u -p -r1.221 kern_synch.c
> --- kern/kern_synch.c	30 Apr 2025 00:26:02 -0000	1.221
> +++ kern/kern_synch.c	30 Apr 2025 00:46:12 -0000
> @@ -534,7 +534,7 @@ sleep_signal_check(struct proc *p, int a
>  }
>  
>  int
> -wakeup_proc(struct proc *p, int flags)
> +wakeup_proc(struct proc *p)
>  {
>  	int awakened = 0;
>  
> @@ -542,8 +542,6 @@ wakeup_proc(struct proc *p, int flags)
>  
>  	if (p->p_wchan != NULL) {
>  		awakened = 1;
> -		if (flags)
> -			atomic_setbits_int(&p->p_flag, flags);
>  #ifdef DIAGNOSTIC
>  		if (p->p_stat != SSLEEP && p->p_stat != SSTOP)
>  			panic("thread %d p_stat is %d", p->p_tid, p->p_stat);
> @@ -567,12 +565,18 @@ void
>  endtsleep(void *arg)
>  {
>  	struct proc *p = arg;
> +	int awakened;
> +	int flags;
>  
>  	SCHED_LOCK();
> -	wakeup_proc(p, P_TIMEOUT);
> +	awakened = wakeup_proc(p);
>  	SCHED_UNLOCK();
>  
> -	atomic_setbits_int(&p->p_flag, P_TIMEOUTRAN);
> +	flags = P_TIMEOUTRAN;
> +	if (awakened)
> +		SET(flags, P_TIMEOUT);
> +
> +	atomic_setbits_int(&p->p_flag, flags);
>  	/* do not alter the proc after this point */
>  }
>  
> @@ -865,7 +869,7 @@ tslp_wakeups(struct tslpqueue *tslpq)
>  	TAILQ_FOREACH_SAFE(entry, tslpq, tslp_link, nentry) {
>  		p = entry->tslp_p;
>  		entry->tslp_p = NULL;
> -		wakeup_proc(p, 0);
> +		wakeup_proc(p);
>  	}
>  	SCHED_UNLOCK();
>  }
> Index: sys/proc.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/proc.h,v
> diff -u -p -r1.385 proc.h
> --- sys/proc.h	30 Apr 2025 00:45:08 -0000	1.385
> +++ sys/proc.h	30 Apr 2025 00:46:13 -0000
> @@ -567,7 +576,7 @@ void	procinit(void);
>  void	setpriority(struct proc *, uint32_t, uint8_t);
>  void	setrunnable(struct proc *);
>  void	endtsleep(void *);
> -int	wakeup_proc(struct proc *, int);
> +int	wakeup_proc(struct proc *);
>  void	unsleep(struct proc *);
>  void	reaper(void *);
>  __dead void exit1(struct proc *, int, int, int);
> 

-- 
:wq Claudio