On Thu, Aug 31, 2023 at 04:01:35PM -0500, Scott Cheloha wrote:
> This is the next patch in the clock interrupt policy reorganization
> series.
>
> While the hardclock/dt(4) patch is being rewritten we can do this
> orthogonal statclock() patch. It needs to get done at some point
> anyway, may as well do it now.
>
> So, this patch moves most of the statclock() code out of the clockintr
> layer and cedes control of the statclock() to the scheduler. My thinking
> is: (a) statclock() increments p_cpticks and calls schedclock(), so in
> practice it is a scheduler interrupt, and (b) in the future it would be
> nice if the scheduler could disable the statclock when a CPU is very idle
> and maybe save some power.
>
> All of this should feel familiar. It is equivalent to what we just
> did to roundrobin().
>
> - Move the contents of the clockintr_statclock() wrapper function
> into statclock() and make statclock() a real clockintr callback.
>
> - clockintr_expiration(), clockintr_nsecuptime(), and
> clockintr_schedule() all become public sys/clockintr.h
> interfaces for use in statclock().
>
> - Tweak statclock() to handle multiple expirations at once.
>
> - Move the statclock handle from clockintr_queue (cq_statclock) to
> schedstate_percpu (spc_statclock). Establish spc_statclock during
> sched_init_cpu().
>
> - Move the statclock variables from kern_clockintr.c to kern_clock.c.
> Move statclock variable initialization from clockintr_init() forward
> into initclocks().
>
> - Replace the CL_RNDSTAT flag with a new global boolean,
> statclock_is_randomized. Update clockintr_init() callers to set
> statclock_is_randomized instead of passing CL_RNDSTAT.
Ping.
ok?
Index: kern/kern_clock.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_clock.c,v
retrieving revision 1.115
diff -u -p -r1.115 kern_clock.c
--- kern/kern_clock.c 23 Aug 2023 01:55:45 -0000 1.115
+++ kern/kern_clock.c 5 Sep 2023 01:13:22 -0000
@@ -39,6 +39,7 @@
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/clockintr.h>
#include <sys/timeout.h>
#include <sys/kernel.h>
#include <sys/limits.h>
@@ -87,17 +88,42 @@ int ticks = INT_MAX - (15 * 60 * HZ);
/* Don't force early wrap around, triggers bug in inteldrm */
volatile unsigned long jiffies;
+uint32_t statclock_avg; /* [I] average statclock period (ns) */
+uint32_t statclock_min; /* [I] minimum statclock period (ns) */
+uint32_t statclock_mask; /* [I] set of statclock_min offsets */
+int statclock_is_randomized; /* [I] fixed or pseudo-random period */
+
/*
* Initialize clock frequencies and start both clocks running.
*/
void
initclocks(void)
{
+ uint32_t half_avg, var;
+
/*
* Let the machine-specific code do its bit.
*/
cpu_initclocks();
+ KASSERT(stathz >= 1 && stathz <= 1000000000);
+
+ /*
+ * Compute the average statclock() period. Then find var, the
+ * largest power of two such that var <= statclock_avg / 2.
+ */
+ statclock_avg = 1000000000 / stathz;
+ half_avg = statclock_avg / 2;
+ for (var = 1U << 31; var > half_avg; var /= 2)
+ continue;
+
+ /*
+ * Set a lower bound for the range using statclock_avg and var.
+ * The mask for that range is just (var - 1).
+ */
+ statclock_min = statclock_avg - (var / 2);
+ statclock_mask = var - 1;
+
KASSERT(profhz >= stathz && profhz <= 1000000000);
KASSERT(profhz % stathz == 0);
profclock_period = 1000000000 / profhz;
@@ -246,12 +272,30 @@ stopprofclock(struct process *pr)
* do process and kernel statistics.
*/
void
-statclock(struct clockframe *frame)
+statclock(struct clockintr *cl, void *cf)
{
+ uint64_t count, expiration, i, uptime;
+ struct clockframe *frame = cf;
struct cpu_info *ci = curcpu();
struct schedstate_percpu *spc = &ci->ci_schedstate;
struct proc *p = curproc;
struct process *pr;
+ uint32_t off;
+
+ if (statclock_is_randomized) {
+ count = 0;
+ expiration = clockintr_expiration(cl);
+ uptime = clockintr_nsecuptime(cl);
+ while (expiration <= uptime) {
+ while ((off = (random() & statclock_mask)) == 0)
+ continue;
+ expiration += statclock_min + off;
+ count++;
+ }
+ clockintr_schedule(cl, expiration);
+ } else {
+ count = clockintr_advance(cl, statclock_avg);
+ }
if (CLKF_USERMODE(frame)) {
pr = p->p_p;
@@ -259,11 +303,11 @@ statclock(struct clockframe *frame)
* Came from user mode; CPU was in user state.
* If this process is being profiled record the tick.
*/
- p->p_uticks++;
+ p->p_uticks += count;
if (pr->ps_nice > NZERO)
- spc->spc_cp_time[CP_NICE]++;
+ spc->spc_cp_time[CP_NICE] += count;
else
- spc->spc_cp_time[CP_USER]++;
+ spc->spc_cp_time[CP_USER] += count;
} else {
/*
* Came from kernel mode, so we were:
@@ -280,27 +324,30 @@ statclock(struct clockframe *frame)
*/
if (CLKF_INTR(frame)) {
if (p != NULL)
- p->p_iticks++;
+ p->p_iticks += count;
spc->spc_cp_time[spc->spc_spinning ?
- CP_SPIN : CP_INTR]++;
+ CP_SPIN : CP_INTR] += count;
} else if (p != NULL && p != spc->spc_idleproc) {
- p->p_sticks++;
+ p->p_sticks += count;
spc->spc_cp_time[spc->spc_spinning ?
- CP_SPIN : CP_SYS]++;
- } else
+ CP_SPIN : CP_SYS] += count;
+ } else {
spc->spc_cp_time[spc->spc_spinning ?
- CP_SPIN : CP_IDLE]++;
+ CP_SPIN : CP_IDLE] += count;
+ }
}
if (p != NULL) {
- p->p_cpticks++;
+ p->p_cpticks += count;
/*
* If no schedclock is provided, call it here at ~~12-25 Hz;
* ~~16 Hz is best
*/
if (schedhz == 0) {
- if ((++spc->spc_schedticks & 3) == 0)
- schedclock(p);
+ for (i = 0; i < count; i++) {
+ if ((++spc->spc_schedticks & 3) == 0)
+ schedclock(p);
+ }
}
}
}
Index: kern/kern_clockintr.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_clockintr.c,v
retrieving revision 1.33
diff -u -p -r1.33 kern_clockintr.c
--- kern/kern_clockintr.c 26 Aug 2023 22:21:00 -0000 1.33
+++ kern/kern_clockintr.c 5 Sep 2023 01:13:22 -0000
@@ -38,17 +38,10 @@
*/
u_int clockintr_flags; /* [I] global state + behavior flags */
uint32_t hardclock_period; /* [I] hardclock period (ns) */
-uint32_t statclock_avg; /* [I] average statclock period
(ns) */
-uint32_t statclock_min; /* [I] minimum statclock period
(ns) */
-uint32_t statclock_mask; /* [I] set of allowed offsets */
void clockintr_cancel_locked(struct clockintr *);
-uint64_t clockintr_expiration(const struct clockintr *);
void clockintr_hardclock(struct clockintr *, void *);
-uint64_t clockintr_nsecuptime(const struct clockintr *);
-void clockintr_schedule(struct clockintr *, uint64_t);
void clockintr_schedule_locked(struct clockintr *, uint64_t);
-void clockintr_statclock(struct clockintr *, void *);
void clockqueue_intrclock_install(struct clockintr_queue *,
const struct intrclock *);
uint64_t clockqueue_next(const struct clockintr_queue *);
@@ -61,8 +54,6 @@ uint64_t nsec_advance(uint64_t *, uint64
void
clockintr_init(u_int flags)
{
- uint32_t half_avg, var;
-
KASSERT(CPU_IS_PRIMARY(curcpu()));
KASSERT(clockintr_flags == 0);
KASSERT(!ISSET(flags, ~CL_FLAG_MASK));
@@ -71,24 +62,6 @@ clockintr_init(u_int flags)
hardclock_period = 1000000000 / hz;
roundrobin_period = hardclock_period * 10;
- KASSERT(stathz >= 1 && stathz <= 1000000000);
-
- /*
- * Compute the average statclock() period. Then find var, the
- * largest power of two such that var <= statclock_avg / 2.
- */
- statclock_avg = 1000000000 / stathz;
- half_avg = statclock_avg / 2;
- for (var = 1U << 31; var > half_avg; var /= 2)
- continue;
-
- /*
- * Set a lower bound for the range using statclock_avg and var.
- * The mask for that range is just (var - 1).
- */
- statclock_min = statclock_avg - (var / 2);
- statclock_mask = var - 1;
-
SET(clockintr_flags, flags | CL_INIT);
}
@@ -111,17 +84,12 @@ clockintr_cpu_init(const struct intrcloc
if (ic != NULL)
clockqueue_intrclock_install(cq, ic);
- /* TODO: Remove these from struct clockintr_queue. */
+ /* TODO: Remove this from struct clockintr_queue. */
if (cq->cq_hardclock == NULL) {
cq->cq_hardclock = clockintr_establish(cq, clockintr_hardclock);
if (cq->cq_hardclock == NULL)
panic("%s: failed to establish hardclock", __func__);
}
- if (cq->cq_statclock == NULL) {
- cq->cq_statclock = clockintr_establish(cq, clockintr_statclock);
- if (cq->cq_statclock == NULL)
- panic("%s: failed to establish statclock", __func__);
- }
/*
* Mask CQ_INTRCLOCK while we're advancing the internal clock
@@ -166,13 +134,13 @@ 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 (cq->cq_statclock->cl_expiration == 0) {
- clockintr_stagger(cq->cq_statclock, statclock_avg,
+ if (!statclock_is_randomized) {
+ if (spc->spc_statclock->cl_expiration == 0) {
+ clockintr_stagger(spc->spc_statclock, statclock_avg,
multiplier, MAXCPUS);
}
}
- clockintr_advance(cq->cq_statclock, statclock_avg);
+ clockintr_advance(spc->spc_statclock, statclock_avg);
/*
* XXX Need to find a better place to do this. We can't do it in
@@ -493,30 +461,6 @@ clockintr_hardclock(struct clockintr *cl
count = clockintr_advance(cl, hardclock_period);
for (i = 0; i < count; i++)
hardclock(frame);
-}
-
-void
-clockintr_statclock(struct clockintr *cl, void *frame)
-{
- uint64_t count, expiration, i, uptime;
- uint32_t off;
-
- if (ISSET(clockintr_flags, CL_RNDSTAT)) {
- count = 0;
- expiration = clockintr_expiration(cl);
- uptime = clockintr_nsecuptime(cl);
- while (expiration <= uptime) {
- while ((off = (random() & statclock_mask)) == 0)
- continue;
- expiration += statclock_min + off;
- count++;
- }
- clockintr_schedule(cl, expiration);
- } else {
- count = clockintr_advance(cl, statclock_avg);
- }
- for (i = 0; i < count; i++)
- statclock(frame);
}
void
Index: kern/kern_sched.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sched.c,v
retrieving revision 1.88
diff -u -p -r1.88 kern_sched.c
--- kern/kern_sched.c 31 Aug 2023 19:29:51 -0000 1.88
+++ kern/kern_sched.c 5 Sep 2023 01:13:24 -0000
@@ -97,6 +97,9 @@ sched_init_cpu(struct cpu_info *ci)
spc->spc_roundrobin = clockintr_establish(&ci->ci_queue, roundrobin);
if (spc->spc_roundrobin == NULL)
panic("%s: clockintr_establish roundrobin", __func__);
+ spc->spc_statclock = clockintr_establish(&ci->ci_queue, statclock);
+ if (spc->spc_statclock == NULL)
+ panic("%s: clockintr_establish statclock", __func__);
kthread_create_deferred(sched_kthreads_create, ci);
Index: sys/clockintr.h
===================================================================
RCS file: /cvs/src/sys/sys/clockintr.h,v
retrieving revision 1.10
diff -u -p -r1.10 clockintr.h
--- sys/clockintr.h 21 Aug 2023 17:22:04 -0000 1.10
+++ sys/clockintr.h 5 Sep 2023 01:13:24 -0000
@@ -97,7 +97,6 @@ struct clockintr_queue {
TAILQ_HEAD(, clockintr) cq_pend;/* [m] pending clockintr list */
struct clockintr *cq_running; /* [m] running clockintr */
struct clockintr *cq_hardclock; /* [o] hardclock handle */
- struct clockintr *cq_statclock; /* [o] statclock handle */
struct intrclock cq_intrclock; /* [I] local interrupt clock */
struct clockintr_stat cq_stat; /* [o] dispatch statistics */
volatile u_int cq_gen; /* [o] cq_stat update generation */
@@ -114,8 +113,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 *);
@@ -130,6 +128,9 @@ uint64_t clockintr_advance(struct clocki
void clockintr_cancel(struct clockintr *);
struct clockintr *clockintr_establish(struct clockintr_queue *,
void (*)(struct clockintr *, void *));
+uint64_t clockintr_expiration(const struct clockintr *);
+uint64_t clockintr_nsecuptime(const struct clockintr *);
+void clockintr_schedule(struct clockintr *, uint64_t);
void clockintr_stagger(struct clockintr *, uint64_t, u_int, u_int);
void clockqueue_init(struct clockintr_queue *);
int sysctl_clockintr(int *, u_int, void *, size_t *, void *, size_t);
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 5 Sep 2023 01:13:24 -0000
@@ -234,10 +234,14 @@ int tstohz(const struct timespec *);
void realitexpire(void *);
extern uint32_t hardclock_period;
+extern uint32_t statclock_avg;
+extern int statclock_is_randomized;
struct clockframe;
void hardclock(struct clockframe *);
-void statclock(struct clockframe *);
+
+struct clockintr;
+void statclock(struct clockintr *, void *);
void initclocks(void);
void inittodr(time_t);
Index: sys/sched.h
===================================================================
RCS file: /cvs/src/sys/sys/sched.h,v
retrieving revision 1.61
diff -u -p -r1.61 sched.h
--- sys/sched.h 11 Aug 2023 22:02:50 -0000 1.61
+++ sys/sched.h 5 Sep 2023 01:13:24 -0000
@@ -109,6 +109,7 @@ struct schedstate_percpu {
struct clockintr *spc_itimer; /* [o] itimer_update handle */
struct clockintr *spc_profclock; /* [o] profclock handle */
struct clockintr *spc_roundrobin; /* [o] roundrobin handle */
+ struct clockintr *spc_statclock; /* [o] statclock handle */
u_int spc_nrun; /* procs on the run queues */
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 5 Sep 2023 01:13:24 -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 5 Sep 2023 01:13:26 -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 5 Sep 2023 01:13:26 -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 5 Sep 2023 01:13:27 -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 5 Sep 2023 01:13:27 -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 5 Sep 2023 01:13:27 -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 5 Sep 2023 01:13:27 -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 5 Sep 2023 01:13:27 -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 5 Sep 2023 01:13:28 -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 5 Sep 2023 01:13:28 -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 5 Sep 2023 01:13:28 -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 5 Sep 2023 01:13:28 -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 5 Sep 2023 01:13:28 -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 5 Sep 2023 01:13:28 -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 5 Sep 2023 01:13:28 -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)