clockintr_cpu_init: avoid CQ_INIT flag when scheduling cq_hardclock
authorcheloha <cheloha@openbsd.org>
Fri, 21 Apr 2023 15:33:00 +0000 (15:33 +0000)
committercheloha <cheloha@openbsd.org>
Fri, 21 Apr 2023 15:33:00 +0000 (15:33 +0000)
The meaning of the CQ_INIT flag is about to change.  Soon, we won't be
able to use it to decide whether a given clockintr_cpu_init() call is
the first on a given CPU.

Instead, use the value of cl_expiration.  If it's zero, we know this
is the first clockintr_cpu_init() call on this CPU.

sys/kern/kern_clockintr.c

index af6198c..bc4e468 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_clockintr.c,v 1.15 2023/04/21 03:03:50 cheloha Exp $ */
+/* $OpenBSD: kern_clockintr.c,v 1.16 2023/04/21 15:33:00 cheloha Exp $ */
 /*
  * Copyright (c) 2003 Dale Rahn <drahn@openbsd.org>
  * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -169,10 +169,18 @@ clockintr_cpu_init(const struct intrclock *ic)
         * the global tick value is advanced during inittodr(9) on our
         * behalf.
         */
-       offset = hardclock_period / ncpus * multiplier;
-       clockintr_schedule(cq->cq_hardclock, offset);
-       if (!CPU_IS_PRIMARY(ci) || ISSET(cq->cq_flags, CQ_INIT))
+       if (CPU_IS_PRIMARY(ci)) {
+               if (cq->cq_hardclock->cl_expiration == 0)
+                       clockintr_schedule(cq->cq_hardclock, 0);
+               else
+                       clockintr_advance(cq->cq_hardclock, hardclock_period);
+       } else {
+               if (cq->cq_hardclock->cl_expiration == 0) {
+                       offset = hardclock_period / ncpus * multiplier;
+                       cq->cq_hardclock->cl_expiration =  offset;
+               }
                clockintr_advance(cq->cq_hardclock, hardclock_period);
+       }
 
        /*
         * We can always advance the statclock and schedclock.