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