initclocks: don't reinitialize ticks, jiffies at runtime
authorcheloha <cheloha@openbsd.org>
Fri, 3 Mar 2023 20:16:44 +0000 (20:16 +0000)
committercheloha <cheloha@openbsd.org>
Fri, 3 Mar 2023 20:16:44 +0000 (20:16 +0000)
Various drivers use ticks/jiffies before initclocks().  It isn't
generally safe to reinitialize them at runtime.  Hoist the conditional
definition of HZ from param.c into sys/kernel.h so we can see it from
kern_clock.c and statically initialize ticks/jiffies to the desired
offset.

With this change, timeouts scheduled before initclocks() do not all
fire immediately during the first softclock().

With input from kettenis@.

Link: https://marc.info/?l=openbsd-tech&m=167753870803378&w=2
sys/conf/param.c
sys/kern/kern_clock.c
sys/sys/kernel.h

index 6a3cd39..42f56d1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: param.c,v 1.47 2022/04/13 10:08:10 sthen Exp $        */
+/*     $OpenBSD: param.c,v 1.48 2023/03/03 20:16:44 cheloha Exp $      */
 /*     $NetBSD: param.c,v 1.16 1996/03/12 03:08:40 mrg Exp $   */
 
 /*
@@ -69,9 +69,6 @@
  * Compiled with -DHZ=xx -DMAXUSERS=xx
  */
 
-#ifndef HZ
-#define        HZ 100
-#endif
 int    hz = HZ;
 int    tick = 1000000 / HZ;
 int    tick_nsec = 1000000000 / HZ;
index fc6d904..1265d74 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_clock.c,v 1.106 2023/02/04 19:33:03 cheloha Exp $        */
+/*     $OpenBSD: kern_clock.c,v 1.107 2023/03/03 20:16:44 cheloha Exp $        */
 /*     $NetBSD: kern_clock.c,v 1.34 1996/06/09 04:51:03 briggs Exp $   */
 
 /*-
@@ -86,11 +86,11 @@ int stathz;
 int    schedhz;
 int    profhz;
 int    profprocs;
-int    ticks;
+int    ticks = INT_MAX - (15 * 60 * HZ);
 static int psdiv, pscnt;               /* prof => stat divider */
 int    psratio;                        /* ratio: prof / stat */
 
-volatile unsigned long jiffies;                /* XXX Linux API for drm(4) */
+volatile unsigned long jiffies = ULONG_MAX - (10 * 60 * HZ);
 
 /*
  * Initialize clock frequencies and start both clocks running.
@@ -98,9 +98,6 @@ volatile unsigned long jiffies;               /* XXX Linux API for drm(4) */
 void
 initclocks(void)
 {
-       ticks = INT_MAX - (15 * 60 * hz);
-       jiffies = ULONG_MAX - (10 * 60 * hz);
-
        /*
         * Set divisors to 1 (normal case) and let the machine-specific
         * code do its bit.
index b0a66fd..0147fde 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kernel.h,v 1.25 2021/01/13 16:28:50 cheloha Exp $     */
+/*     $OpenBSD: kernel.h,v 1.26 2023/03/03 20:16:44 cheloha Exp $     */
 /*     $NetBSD: kernel.h,v 1.11 1995/03/03 01:24:16 cgd Exp $  */
 
 /*-
@@ -56,3 +56,7 @@ extern int hz;                        /* system clock's frequency */
 extern int stathz;             /* statistics clock's frequency */
 extern int profhz;             /* profiling clock's frequency */
 extern int lbolt;              /* once a second sleep address */
+
+#ifndef HZ
+#define HZ 100
+#endif