From: Martin Pieuchot Subject: Re: sched_unpeg_proc() To: Miod Vallat Cc: tech@openbsd.org Date: Mon, 8 Jul 2024 15:57:01 +0200 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);