Index | Thread | Search

From:
Martin Pieuchot <mpi@openbsd.org>
Subject:
Re: sched_unpeg_proc()
To:
Miod Vallat <miod@online.fr>
Cc:
tech@openbsd.org
Date:
Mon, 8 Jul 2024 15:57:01 +0200

Download raw body.

Thread
On 08/07/24(Mon) 13:41, Miod Vallat wrote:
> > > > Index: kern/kern_smr.c
> > > > ===================================================================
> > > > RCS file: /cvs/src/sys/kern/kern_smr.c,v
> > > > diff -u -p -r1.16 kern_smr.c
> > > > --- kern/kern_smr.c	14 Aug 2022 01:58:27 -0000	1.16
> > > > +++ kern/kern_smr.c	8 Jul 2024 10:00:15 -0000
> > > > @@ -162,8 +162,8 @@ smr_grace_wait(void)
> > > >  			continue;
> > > >  		sched_peg_curproc(ci);
> > > >  		KASSERT(ci->ci_schedstate.spc_smrgp == smrgp);
> > > > +		sched_unpeg_curproc();
> > > >  	}
> > > > -	atomic_clearbits_int(&curproc->p_flag, P_CPUPEG);
> > > 
> > > Are you sure you want to move the unpeg call into the for() loop?
> > 
> > I need this in dumbsched because I modify the per-CPU `spc' descriptor
> > and I need to undo the states before picking up the next CPU.
> 
> So that move should not be part of the commit introducing
> sched_unpeg_curproc(), methinks.

Fine.  Here's an updated diff with the corresponding KASSERT() removed.

Index: arch/amd64/amd64/identcpu.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/identcpu.c,v
diff -u -p -r1.145 identcpu.c
--- arch/amd64/amd64/identcpu.c	24 Jun 2024 21:22:14 -0000	1.145
+++ arch/amd64/amd64/identcpu.c	8 Jul 2024 09:51:03 -0000
@@ -169,7 +169,7 @@ cpu_hz_update_sensor(void *args)
 		ci->ci_hz_sensor.value = val;
 	}
 
-	atomic_clearbits_int(&curproc->p_flag, P_CPUPEG);
+	sched_unpeg_curproc();
 }
 #endif
 
Index: dev/kstat.c
===================================================================
RCS file: /cvs/src/sys/dev/kstat.c,v
diff -u -p -r1.2 kstat.c
--- dev/kstat.c	31 Jan 2022 05:09:17 -0000	1.2
+++ dev/kstat.c	8 Jul 2024 09:55:45 -0000
@@ -593,7 +593,7 @@ kstat_cpu_enter(void *p)
 void
 kstat_cpu_leave(void *p)
 {
-	atomic_clearbits_int(&curproc->p_flag, P_CPUPEG);
+	sched_unpeg_curproc();
 }
 
 void
Index: kern/kern_sched.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sched.c,v
diff -u -p -r1.96 kern_sched.c
--- kern/kern_sched.c	3 Jun 2024 12:48:25 -0000	1.96
+++ kern/kern_sched.c	8 Jul 2024 13:56:01 -0000
@@ -633,6 +633,16 @@ sched_peg_curproc(struct cpu_info *ci)
 	SCHED_UNLOCK();
 }
 
+void
+sched_unpeg_curproc(void)
+{
+	struct proc *p = curproc;
+
+	KASSERT(ISSET(p->p_flag, P_CPUPEG));
+
+	atomic_clearbits_int(&p->p_flag, P_CPUPEG);
+}
+
 #ifdef MULTIPROCESSOR
 
 void
@@ -699,7 +709,7 @@ sched_barrier_task(void *arg)
 
 	sched_peg_curproc(ci);
 	cond_signal(&sb->cond);
-	atomic_clearbits_int(&curproc->p_flag, P_CPUPEG);
+	sched_unpeg_curproc();
 }
 
 void
Index: kern/kern_smr.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_smr.c,v
diff -u -p -r1.16 kern_smr.c
--- kern/kern_smr.c	14 Aug 2022 01:58:27 -0000	1.16
+++ kern/kern_smr.c	8 Jul 2024 13:54:51 -0000
@@ -163,7 +163,7 @@ smr_grace_wait(void)
 		sched_peg_curproc(ci);
 		KASSERT(ci->ci_schedstate.spc_smrgp == smrgp);
 	}
-	atomic_clearbits_int(&curproc->p_flag, P_CPUPEG);
+	sched_unpeg_curproc();
 #endif /* MULTIPROCESSOR */
 }
 
Index: sys/sched.h
===================================================================
RCS file: /cvs/src/sys/sys/sched.h,v
diff -u -p -r1.72 sched.h
--- sys/sched.h	3 Jun 2024 12:48:25 -0000	1.72
+++ sys/sched.h	8 Jul 2024 10:01:54 -0000
@@ -169,6 +169,7 @@ void cpu_idle_enter(void);
 void cpu_idle_cycle(void);
 void cpu_idle_leave(void);
 void sched_peg_curproc(struct cpu_info *ci);
+void sched_unpeg_curproc(void);
 void sched_barrier(struct cpu_info *ci);
 
 int sysctl_hwsetperf(void *, size_t *, void *, size_t);