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

Reply via email to