We need to initialize the per-CPU clockintr_queue struct before we can call clockintr_establish() from sched_init_cpu().
Initialization is done with a call to clockqueue_init(). Currently we call it during clockintr_cpu_init(), i.e. each CPU initializes its own clockintr_queue struct. This patch moves the clockqueue_init() call out into main() and out into the MD code, just before sched_init_cpu(). So, now the primary CPU initializes the clockintr_queue struct on behalf of the secondary CPUs. No behavior change. With this in place, we can start breaking pieces off of the hardclock() and statclock() in the next patch. ok? Index: kern/init_main.c =================================================================== RCS file: /cvs/src/sys/kern/init_main.c,v retrieving revision 1.320 diff -u -p -r1.320 init_main.c --- kern/init_main.c 1 Jan 2023 07:00:51 -0000 1.320 +++ kern/init_main.c 12 Jun 2023 23:55:43 -0000 @@ -47,6 +47,7 @@ #include <sys/resourcevar.h> #include <sys/signalvar.h> #include <sys/systm.h> +#include <sys/clockintr.h> #include <sys/namei.h> #include <sys/vnode.h> #include <sys/tty.h> @@ -313,6 +314,7 @@ main(void *framep) /* Initialize run queues */ sched_init_runqueues(); sleep_queue_init(); + clockqueue_init(&curcpu()->ci_queue); sched_init_cpu(curcpu()); p->p_cpu->ci_randseed = (arc4random() & 0x7fffffff) + 1; Index: kern/kern_clockintr.c =================================================================== RCS file: /cvs/src/sys/kern/kern_clockintr.c,v retrieving revision 1.21 diff -u -p -r1.21 kern_clockintr.c --- kern/kern_clockintr.c 23 Apr 2023 00:08:36 -0000 1.21 +++ kern/kern_clockintr.c 12 Jun 2023 23:55:43 -0000 @@ -66,7 +66,6 @@ void clockintr_schedule(struct clockintr void clockintr_schedule_locked(struct clockintr *, uint64_t); void clockintr_statclock(struct clockintr *, void *); void clockintr_statvar_init(int, uint32_t *, uint32_t *, uint32_t *); -void clockqueue_init(struct clockintr_queue *); uint64_t clockqueue_next(const struct clockintr_queue *); void clockqueue_reset_intrclock(struct clockintr_queue *); uint64_t nsec_advance(uint64_t *, uint64_t, uint64_t); @@ -114,7 +113,6 @@ clockintr_cpu_init(const struct intrcloc KASSERT(ISSET(clockintr_flags, CL_INIT)); - clockqueue_init(cq); if (ic != NULL && !ISSET(cq->cq_flags, CQ_INTRCLOCK)) { cq->cq_intrclock = *ic; SET(cq->cq_flags, CQ_INTRCLOCK); Index: sys/clockintr.h =================================================================== RCS file: /cvs/src/sys/sys/clockintr.h,v retrieving revision 1.7 diff -u -p -r1.7 clockintr.h --- sys/clockintr.h 20 Apr 2023 14:51:28 -0000 1.7 +++ sys/clockintr.h 12 Jun 2023 23:55:43 -0000 @@ -129,6 +129,7 @@ void clockintr_trigger(void); * Kernel API */ +void clockqueue_init(struct clockintr_queue *); int sysctl_clockintr(int *, u_int, void *, size_t *, void *, size_t); #endif /* _KERNEL */ Index: arch/alpha/alpha/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/alpha/alpha/cpu.c,v retrieving revision 1.46 diff -u -p -r1.46 cpu.c --- arch/alpha/alpha/cpu.c 10 Dec 2022 15:02:29 -0000 1.46 +++ arch/alpha/alpha/cpu.c 12 Jun 2023 23:55:43 -0000 @@ -597,6 +597,7 @@ cpu_hatch(struct cpu_info *ci) ALPHA_TBIA(); alpha_pal_imb(); + clockqueue_init(&ci->ci_queue); KERNEL_LOCK(); sched_init_cpu(ci); nanouptime(&ci->ci_schedstate.spc_runtime); Index: arch/amd64/amd64/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/cpu.c,v retrieving revision 1.168 diff -u -p -r1.168 cpu.c --- arch/amd64/amd64/cpu.c 24 Apr 2023 09:04:03 -0000 1.168 +++ arch/amd64/amd64/cpu.c 12 Jun 2023 23:55:43 -0000 @@ -664,6 +664,7 @@ cpu_attach(struct device *parent, struct #if defined(MULTIPROCESSOR) cpu_intr_init(ci); cpu_start_secondary(ci); + clockqueue_init(&ci->ci_queue); sched_init_cpu(ci); ncpus++; if (ci->ci_flags & CPUF_PRESENT) { Index: arch/arm/arm/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/arm/arm/cpu.c,v retrieving revision 1.57 diff -u -p -r1.57 cpu.c --- arch/arm/arm/cpu.c 12 Mar 2022 14:40:41 -0000 1.57 +++ arch/arm/arm/cpu.c 12 Jun 2023 23:55:43 -0000 @@ -391,6 +391,7 @@ cpu_attach(struct device *parent, struct "cpu-release-addr", 0); } + clockqueue_init(&ci->ci_queue); sched_init_cpu(ci); if (cpu_hatch_secondary(ci, spinup_method, spinup_data)) { atomic_setbits_int(&ci->ci_flags, CPUF_IDENTIFY); Index: arch/arm64/arm64/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/arm64/arm64/cpu.c,v retrieving revision 1.94 diff -u -p -r1.94 cpu.c --- arch/arm64/arm64/cpu.c 11 Jun 2023 21:42:01 -0000 1.94 +++ arch/arm64/arm64/cpu.c 12 Jun 2023 23:55:43 -0000 @@ -875,6 +875,7 @@ cpu_attach(struct device *parent, struct "cpu-release-addr", 0); } + clockqueue_init(&ci->ci_queue); sched_init_cpu(ci); if (cpu_start_secondary(ci, spinup_method, spinup_data)) { atomic_setbits_int(&ci->ci_flags, CPUF_IDENTIFY); Index: arch/hppa/dev/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/hppa/dev/cpu.c,v retrieving revision 1.44 diff -u -p -r1.44 cpu.c --- arch/hppa/dev/cpu.c 6 Dec 2022 00:40:09 -0000 1.44 +++ arch/hppa/dev/cpu.c 12 Jun 2023 23:55:43 -0000 @@ -202,6 +202,7 @@ cpu_boot_secondary_processors(void) ci->ci_randseed = (arc4random() & 0x7fffffff) + 1; + clockqueue_init(&ci->ci_queue); sched_init_cpu(ci); /* Release the specified CPU by triggering an EIR{0}. */ Index: arch/i386/i386/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/i386/i386/cpu.c,v retrieving revision 1.111 diff -u -p -r1.111 cpu.c --- arch/i386/i386/cpu.c 30 Jan 2023 10:49:04 -0000 1.111 +++ arch/i386/i386/cpu.c 12 Jun 2023 23:55:43 -0000 @@ -360,6 +360,7 @@ cpu_attach(struct device *parent, struct #endif cpu_tsx_disable(ci); identifycpu(ci); + clockqueue_init(&ci->ci_queue); sched_init_cpu(ci); ci->ci_next = cpu_info_list->ci_next; cpu_info_list->ci_next = ci; Index: arch/luna88k/luna88k/machdep.c =================================================================== RCS file: /cvs/src/sys/arch/luna88k/luna88k/machdep.c,v retrieving revision 1.142 diff -u -p -r1.142 machdep.c --- arch/luna88k/luna88k/machdep.c 10 Dec 2022 02:41:56 -0000 1.142 +++ arch/luna88k/luna88k/machdep.c 12 Jun 2023 23:55:43 -0000 @@ -762,6 +762,7 @@ secondary_main() cpu_configuration_print(0); ncpus++; + clockqueue_init(&ci->ci_queue); sched_init_cpu(ci); nanouptime(&ci->ci_schedstate.spc_runtime); ci->ci_curproc = NULL; Index: arch/macppc/macppc/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/macppc/macppc/cpu.c,v retrieving revision 1.85 diff -u -p -r1.85 cpu.c --- arch/macppc/macppc/cpu.c 13 Mar 2022 12:33:01 -0000 1.85 +++ arch/macppc/macppc/cpu.c 12 Jun 2023 23:55:43 -0000 @@ -670,6 +670,7 @@ cpu_boot_secondary_processors(void) continue; ci->ci_randseed = (arc4random() & 0x7fffffff) + 1; + clockqueue_init(&ci->ci_queue); sched_init_cpu(ci); cpu_spinup(NULL, ci); Index: arch/mips64/mips64/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/mips64/mips64/cpu.c,v retrieving revision 1.82 diff -u -p -r1.82 cpu.c --- arch/mips64/mips64/cpu.c 6 Apr 2022 18:59:26 -0000 1.82 +++ arch/mips64/mips64/cpu.c 12 Jun 2023 23:55:43 -0000 @@ -395,6 +395,7 @@ cpu_boot_secondary_processors(void) continue; ci->ci_randseed = (arc4random() & 0x7fffffff) + 1; + clockqueue_init(&ci->ci_queue); sched_init_cpu(ci); cpu_boot_secondary(ci); } Index: arch/powerpc64/powerpc64/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/powerpc64/powerpc64/cpu.c,v retrieving revision 1.25 diff -u -p -r1.25 cpu.c --- arch/powerpc64/powerpc64/cpu.c 25 Jan 2023 09:53:53 -0000 1.25 +++ arch/powerpc64/powerpc64/cpu.c 12 Jun 2023 23:55:43 -0000 @@ -189,6 +189,7 @@ cpu_attach(struct device *parent, struct if (dev->dv_unit != 0) { int timeout = 10000; + clockqueue_init(&ci->ci_queue); sched_init_cpu(ci); ncpus++; Index: arch/riscv64/riscv64/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/riscv64/riscv64/cpu.c,v retrieving revision 1.13 diff -u -p -r1.13 cpu.c --- arch/riscv64/riscv64/cpu.c 6 Apr 2022 18:59:27 -0000 1.13 +++ arch/riscv64/riscv64/cpu.c 12 Jun 2023 23:55:43 -0000 @@ -193,6 +193,7 @@ cpu_attach(struct device *parent, struct if (ci->ci_flags & CPUF_AP) { int timeout = 10000; + clockqueue_init(&ci->ci_queue); sched_init_cpu(ci); if (cpu_hatch_secondary(ci)) { atomic_setbits_int(&ci->ci_flags, CPUF_IDENTIFY); Index: arch/sparc64/sparc64/cpu.c =================================================================== RCS file: /cvs/src/sys/arch/sparc64/sparc64/cpu.c,v retrieving revision 1.73 diff -u -p -r1.73 cpu.c --- arch/sparc64/sparc64/cpu.c 24 Oct 2021 17:05:04 -0000 1.73 +++ arch/sparc64/sparc64/cpu.c 12 Jun 2023 23:55:43 -0000 @@ -185,6 +185,7 @@ alloc_cpuinfo(struct mainbus_attach_args cpi->ci_self = cpi; cpi->ci_node = ma->ma_node; + clockqueue_init(&cpi->ci_queue); sched_init_cpu(cpi); /*