When stopping a machine, with "halt -p" for example, secondary CPUs are
removed from the scheduler before smr_flush() is called.  So there's no
need for the SMR thread to peg itself to such CPUs.  This currently
isn't a problem because we use per-CPU runqueues but it doesn't work
with a global one.  So the diff below skip halted CPUs.  It should also
speed up rebooting/halting on machine with a huge number of CPUs.

ok?

Index: kern/kern_smr.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_smr.c,v
retrieving revision 1.16
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     11 Aug 2023 19:43:54 -0000
@@ -158,6 +158,8 @@ smr_grace_wait(void)
        CPU_INFO_FOREACH(cii, ci) {
                if (!CPU_IS_RUNNING(ci))
                        continue;
+               if (ci->ci_schedstate.spc_schedflags & SPCF_HALTED)
+                       continue;
                if (READ_ONCE(ci->ci_schedstate.spc_smrgp) == smrgp)
                        continue;
                sched_peg_curproc(ci);

Reply via email to