I'm going to break the big statclock() patch on tech@ into smaller
chunks that are easier to review.

The goal here is to move control of statclock() out of the clock
interrupt subsystem and transform it into a client of that subsystem.

I think we can do this in four parts.  Part 3 is the most complex.

1. Replace the CL_RNDSTAT flag with a new global variable,
   "statclock_is_randomized".

2. Add clockintr_advance_random() to the public sys/clockintr.h API
   so statclock() can use it.

3. Merge the contents of clockintr_statclock() into statclock(); make
   statclock() a real callback function that reschedules itself and
   transparently handles multiple expirations.

4. Move control of the statclock clockintr handle from the clock
   interrupt subsystem to the scheduler.

Attached is a patch for step 1.

In order to isolate the statclock() from the clock interrupt subsystem
we need to replace the CL_RNDSTAT flag with something equivalent.
This patch adds a new global variable, "statclock_is_randomized", to
kern_clock.c and prototypes it in sys/systm.h.  All CL_RNDSTAT checks
are replaced with "statclock_is_randomized" checks and instead of
passing CL_RNDSTAT to clockintr_init() we set "statclock_is_randomized".

ok?

Index: kern/kern_clock.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_clock.c,v
retrieving revision 1.116
diff -u -p -r1.116 kern_clock.c
--- kern/kern_clock.c   9 Sep 2023 18:19:03 -0000       1.116
+++ kern/kern_clock.c   9 Sep 2023 19:03:13 -0000
@@ -86,6 +86,8 @@ int   ticks = INT_MAX - (15 * 60 * HZ);
 /* Don't force early wrap around, triggers bug in inteldrm */
 volatile unsigned long jiffies;
 
+int statclock_is_randomized;   /* [I] fixed or pseudorandom period? */
+
 /*
  * Initialize clock frequencies and start both clocks running.
  */
Index: kern/kern_clockintr.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_clockintr.c,v
retrieving revision 1.45
diff -u -p -r1.45 kern_clockintr.c
--- kern/kern_clockintr.c       9 Sep 2023 17:07:59 -0000       1.45
+++ kern/kern_clockintr.c       9 Sep 2023 19:03:13 -0000
@@ -167,7 +167,7 @@ clockintr_cpu_init(const struct intrcloc
         * We can always advance the statclock.  There is no reason to
         * stagger a randomized statclock.
         */
-       if (!ISSET(clockintr_flags, CL_RNDSTAT)) {
+       if (!statclock_is_randomized) {
                if (cq->cq_statclock->cl_expiration == 0) {
                        clockintr_stagger(cq->cq_statclock, statclock_avg,
                            multiplier, MAXCPUS);
@@ -466,7 +466,7 @@ clockintr_statclock(struct clockintr *cl
 {
        uint64_t count, i;
 
-       if (ISSET(clockintr_flags, CL_RNDSTAT)) {
+       if (statclock_is_randomized) {
                count = clockintr_advance_random(cl, statclock_min,
                    statclock_mask);
        } else {
Index: sys/clockintr.h
===================================================================
RCS file: /cvs/src/sys/sys/clockintr.h,v
retrieving revision 1.12
diff -u -p -r1.12 clockintr.h
--- sys/clockintr.h     6 Sep 2023 02:33:18 -0000       1.12
+++ sys/clockintr.h     9 Sep 2023 19:03:14 -0000
@@ -114,8 +114,7 @@ struct clockintr_queue {
 #define CL_STATE_MASK          0x00000001
 
 /* Global behavior flags. */
-#define CL_RNDSTAT             0x80000000      /* randomized statclock */
-#define CL_FLAG_MASK           0x80000000
+#define CL_FLAG_MASK           0x00000000
 
 void clockintr_cpu_init(const struct intrclock *);
 int clockintr_dispatch(void *);
Index: sys/systm.h
===================================================================
RCS file: /cvs/src/sys/sys/systm.h,v
retrieving revision 1.165
diff -u -p -r1.165 systm.h
--- sys/systm.h 23 Aug 2023 01:55:45 -0000      1.165
+++ sys/systm.h 9 Sep 2023 19:03:14 -0000
@@ -234,6 +234,7 @@ int tstohz(const struct timespec *);
 void   realitexpire(void *);
 
 extern uint32_t hardclock_period;
+extern int statclock_is_randomized;
 
 struct clockframe;
 void   hardclock(struct clockframe *);
Index: arch/amd64/amd64/lapic.c
===================================================================
RCS file: /cvs/src/sys/arch/amd64/amd64/lapic.c,v
retrieving revision 1.69
diff -u -p -r1.69 lapic.c
--- arch/amd64/amd64/lapic.c    23 Aug 2023 01:55:46 -0000      1.69
+++ arch/amd64/amd64/lapic.c    9 Sep 2023 19:03:14 -0000
@@ -498,7 +498,8 @@ lapic_initclocks(void)
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 }
 
 
Index: arch/arm64/dev/agtimer.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/dev/agtimer.c,v
retrieving revision 1.26
diff -u -p -r1.26 agtimer.c
--- arch/arm64/dev/agtimer.c    23 Aug 2023 01:55:46 -0000      1.26
+++ arch/arm64/dev/agtimer.c    9 Sep 2023 19:03:14 -0000
@@ -293,7 +293,8 @@ agtimer_cpu_initclocks(void)
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 
        if (sc->sc_ticks_per_second != agtimer_frequency) {
                agtimer_set_clockrate(agtimer_frequency);
Index: arch/arm/cortex/agtimer.c
===================================================================
RCS file: /cvs/src/sys/arch/arm/cortex/agtimer.c,v
retrieving revision 1.19
diff -u -p -r1.19 agtimer.c
--- arch/arm/cortex/agtimer.c   23 Aug 2023 01:55:46 -0000      1.19
+++ arch/arm/cortex/agtimer.c   9 Sep 2023 19:03:14 -0000
@@ -230,7 +230,8 @@ agtimer_cpu_initclocks(void)
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 
        if (sc->sc_ticks_per_second != agtimer_frequency) {
                agtimer_set_clockrate(agtimer_frequency);
Index: arch/arm/cortex/amptimer.c
===================================================================
RCS file: /cvs/src/sys/arch/arm/cortex/amptimer.c,v
retrieving revision 1.18
diff -u -p -r1.18 amptimer.c
--- arch/arm/cortex/amptimer.c  23 Aug 2023 01:55:46 -0000      1.18
+++ arch/arm/cortex/amptimer.c  9 Sep 2023 19:03:14 -0000
@@ -287,7 +287,8 @@ amptimer_cpu_initclocks(void)
 
        stathz = hz;
        profhz = hz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 
        if (sc->sc_ticks_per_second != amptimer_frequency) {
                amptimer_set_clockrate(amptimer_frequency);
Index: arch/armv7/omap/dmtimer.c
===================================================================
RCS file: /cvs/src/sys/arch/armv7/omap/dmtimer.c,v
retrieving revision 1.20
diff -u -p -r1.20 dmtimer.c
--- arch/armv7/omap/dmtimer.c   23 Aug 2023 01:55:46 -0000      1.20
+++ arch/armv7/omap/dmtimer.c   9 Sep 2023 19:03:14 -0000
@@ -232,7 +232,8 @@ dmtimer_cpu_initclocks(void)
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 
        sc->sc_ticks_per_second = TIMER_FREQUENCY; /* 32768 */
        sc->sc_nsec_cycle_ratio =
Index: arch/armv7/omap/gptimer.c
===================================================================
RCS file: /cvs/src/sys/arch/armv7/omap/gptimer.c,v
retrieving revision 1.21
diff -u -p -r1.21 gptimer.c
--- arch/armv7/omap/gptimer.c   23 Aug 2023 01:55:46 -0000      1.21
+++ arch/armv7/omap/gptimer.c   9 Sep 2023 19:03:14 -0000
@@ -198,7 +198,8 @@ gptimer_cpu_initclocks(void)
 {
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 
        gptimer_nsec_cycle_ratio = TIMER_FREQUENCY * (1ULL << 32) / 1000000000;
        gptimer_nsec_max = UINT64_MAX / gptimer_nsec_cycle_ratio;
Index: arch/armv7/sunxi/sxitimer.c
===================================================================
RCS file: /cvs/src/sys/arch/armv7/sunxi/sxitimer.c,v
retrieving revision 1.22
diff -u -p -r1.22 sxitimer.c
--- arch/armv7/sunxi/sxitimer.c 23 Aug 2023 01:55:46 -0000      1.22
+++ arch/armv7/sunxi/sxitimer.c 9 Sep 2023 19:03:14 -0000
@@ -180,7 +180,8 @@ sxitimer_attach(struct device *parent, s
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 
        /* stop timer, and set clk src */
        bus_space_write_4(sxitimer_iot, sxitimer_ioh,
Index: arch/hppa/dev/clock.c
===================================================================
RCS file: /cvs/src/sys/arch/hppa/dev/clock.c,v
retrieving revision 1.37
diff -u -p -r1.37 clock.c
--- arch/hppa/dev/clock.c       23 Aug 2023 01:55:46 -0000      1.37
+++ arch/hppa/dev/clock.c       9 Sep 2023 19:03:14 -0000
@@ -116,7 +116,8 @@ cpu_initclocks(void)
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 
        itmr_nsec_cycle_ratio = itmr_freq * (1ULL << 32) / 1000000000;
        itmr_nsec_max = UINT64_MAX / itmr_nsec_cycle_ratio;
Index: arch/i386/i386/lapic.c
===================================================================
RCS file: /cvs/src/sys/arch/i386/i386/lapic.c,v
retrieving revision 1.56
diff -u -p -r1.56 lapic.c
--- arch/i386/i386/lapic.c      23 Aug 2023 01:55:46 -0000      1.56
+++ arch/i386/i386/lapic.c      9 Sep 2023 19:03:14 -0000
@@ -326,7 +326,8 @@ lapic_initclocks(void)
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 }
 
 extern int gettick(void);      /* XXX put in header file */
Index: arch/loongson/dev/glxclk.c
===================================================================
RCS file: /cvs/src/sys/arch/loongson/dev/glxclk.c,v
retrieving revision 1.9
diff -u -p -r1.9 glxclk.c
--- arch/loongson/dev/glxclk.c  26 Aug 2023 09:37:43 -0000      1.9
+++ arch/loongson/dev/glxclk.c  9 Sep 2023 19:03:14 -0000
@@ -189,10 +189,11 @@ glxclk_initclock(void)
         */
        stathz = hz = 128;
        profhz = hz * 10;
+       statclock_is_randomized = 1;
        tick = 1000000 / hz;
        tick_nsec = 1000000000 / hz;
 
-       clockintr_init(CL_RNDSTAT);
+       clockintr_init(0);
 }
 
 void
Index: arch/macppc/macppc/clock.c
===================================================================
RCS file: /cvs/src/sys/arch/macppc/macppc/clock.c,v
retrieving revision 1.56
diff -u -p -r1.56 clock.c
--- arch/macppc/macppc/clock.c  23 Aug 2023 01:55:47 -0000      1.56
+++ arch/macppc/macppc/clock.c  9 Sep 2023 19:03:14 -0000
@@ -195,7 +195,8 @@ cpu_initclocks(void)
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 
        dec_nsec_cycle_ratio = ticks_per_sec * (1ULL << 32) / 1000000000;
        dec_nsec_max = UINT64_MAX / dec_nsec_cycle_ratio;
Index: arch/mips64/mips64/clock.c
===================================================================
RCS file: /cvs/src/sys/arch/mips64/mips64/clock.c,v
retrieving revision 1.51
diff -u -p -r1.51 clock.c
--- arch/mips64/mips64/clock.c  23 Aug 2023 01:55:47 -0000      1.51
+++ arch/mips64/mips64/clock.c  9 Sep 2023 19:03:14 -0000
@@ -241,7 +241,8 @@ cp0_initclock(void)
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 }
 
 /*
Index: arch/powerpc64/powerpc64/clock.c
===================================================================
RCS file: /cvs/src/sys/arch/powerpc64/powerpc64/clock.c,v
retrieving revision 1.12
diff -u -p -r1.12 clock.c
--- arch/powerpc64/powerpc64/clock.c    23 Aug 2023 01:55:47 -0000      1.12
+++ arch/powerpc64/powerpc64/clock.c    9 Sep 2023 19:03:14 -0000
@@ -94,7 +94,8 @@ cpu_initclocks(void)
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 
        evcount_attach(&clock_count, "clock", NULL);
 }
Index: arch/riscv64/riscv64/clock.c
===================================================================
RCS file: /cvs/src/sys/arch/riscv64/riscv64/clock.c,v
retrieving revision 1.11
diff -u -p -r1.11 clock.c
--- arch/riscv64/riscv64/clock.c        23 Aug 2023 01:55:47 -0000      1.11
+++ arch/riscv64/riscv64/clock.c        9 Sep 2023 19:03:14 -0000
@@ -92,7 +92,8 @@ cpu_initclocks(void)
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 
        riscv_intc_intr_establish(IRQ_TIMER_SUPERVISOR, 0,
            clock_intr, NULL, NULL);
Index: arch/sparc64/sparc64/clock.c
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/sparc64/clock.c,v
retrieving revision 1.80
diff -u -p -r1.80 clock.c
--- arch/sparc64/sparc64/clock.c        23 Aug 2023 01:55:47 -0000      1.80
+++ arch/sparc64/sparc64/clock.c        9 Sep 2023 19:03:14 -0000
@@ -501,7 +501,8 @@ cpu_initclocks(void)
 
        stathz = hz;
        profhz = stathz * 10;
-       clockintr_init(CL_RNDSTAT);
+       statclock_is_randomized = 1;
+       clockintr_init(0);
 
        /* Make sure we have a sane cpu_clockrate -- we'll need it */
        if (!cpu_clockrate) 

Reply via email to