sched_init_cpu: move profclock staggering to clockintr_cpu_init()
authorcheloha <cheloha@openbsd.org>
Thu, 27 Jul 2023 17:52:53 +0000 (17:52 +0000)
committercheloha <cheloha@openbsd.org>
Thu, 27 Jul 2023 17:52:53 +0000 (17:52 +0000)
initclocks() runs after sched_init_cpu() is called for secondary CPUs,
so profclock_period is still zero and the clockintr_stagger() call for
spc_profclock is useless.  For now, just stagger spc_profclock during
clockintr_cpu_init() along with everything else.

sys/kern/kern_clockintr.c
sys/kern/kern_sched.c

index 9a9d912..0853b10 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_clockintr.c,v 1.28 2023/07/25 18:16:19 cheloha Exp $ */
+/* $OpenBSD: kern_clockintr.c,v 1.29 2023/07/27 17:52:53 cheloha Exp $ */
 /*
  * Copyright (c) 2003 Dale Rahn <drahn@openbsd.org>
  * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -24,7 +24,9 @@
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/mutex.h>
+#include <sys/resourcevar.h>
 #include <sys/queue.h>
+#include <sys/sched.h>
 #include <sys/stdint.h>
 #include <sys/sysctl.h>
 #include <sys/time.h>
@@ -104,6 +106,7 @@ clockintr_cpu_init(const struct intrclock *ic)
        uint64_t multiplier = 0;
        struct cpu_info *ci = curcpu();
        struct clockintr_queue *cq = &ci->ci_queue;
+       struct schedstate_percpu *spc = &ci->ci_schedstate;
        int reset_cq_intrclock = 0;
 
        KASSERT(ISSET(clockintr_flags, CL_INIT));
@@ -189,6 +192,15 @@ clockintr_cpu_init(const struct intrclock *ic)
                clockintr_advance(cq->cq_schedclock, schedclock_period);
        }
 
+       /*
+        * XXX Need to find a better place to do this.  We can't do it in
+        * sched_init_cpu() because initclocks() runs after it.
+        */
+       if (spc->spc_profclock->cl_expiration == 0) {
+               clockintr_stagger(spc->spc_profclock, profclock_period,
+                   multiplier, MAXCPUS);
+       }
+
        if (reset_cq_intrclock)
                SET(cq->cq_flags, CQ_INTRCLOCK);
 }
index 0641959..c94438e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_sched.c,v 1.80 2023/07/25 18:16:19 cheloha Exp $ */
+/*     $OpenBSD: kern_sched.c,v 1.81 2023/07/27 17:52:53 cheloha Exp $ */
 /*
  * Copyright (c) 2007, 2008 Artur Grabowski <art@openbsd.org>
  *
@@ -92,8 +92,6 @@ sched_init_cpu(struct cpu_info *ci)
                    profclock);
                if (spc->spc_profclock == NULL)
                        panic("%s: clockintr_establish profclock", __func__);
-               clockintr_stagger(spc->spc_profclock, profclock_period,
-                   CPU_INFO_UNIT(ci), MAXCPUS);
        }
 
        kthread_create_deferred(sched_kthreads_create, ci);