diff options
-rw-r--r-- | include/linux/sched.h | 1 | ||||
-rw-r--r-- | kernel/sched/core.c | 3 | ||||
-rw-r--r-- | kernel/time/sched_clock.c | 8 |
3 files changed, 11 insertions, 1 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index fd4d79416cdc..5398a8aea026 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2381,6 +2381,7 @@ extern u64 sched_clock_cpu(int cpu); extern void sched_clock_init(void); +extern int sched_clock_initialized(void); #ifndef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK static inline void sched_clock_tick(void) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index d43925c6e560..59dfded79cad 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1919,7 +1919,8 @@ static inline void set_window_start(struct rq *rq) int cpu = cpu_of(rq); struct rq *sync_rq = cpu_rq(sync_cpu); - if (rq->window_start || !sched_enable_hmp) + if (rq->window_start || !sched_enable_hmp || + !sched_clock_initialized() || !sched_clock_cpu(cpu)) return; if (cpu == sync_cpu) { diff --git a/kernel/time/sched_clock.c b/kernel/time/sched_clock.c index a26036d37a38..0637823aa5a6 100644 --- a/kernel/time/sched_clock.c +++ b/kernel/time/sched_clock.c @@ -70,6 +70,7 @@ struct clock_data { static struct hrtimer sched_clock_timer; static int irqtime = -1; +static int initialized; core_param(irqtime, irqtime, int, 0400); @@ -231,6 +232,11 @@ sched_clock_register(u64 (*read)(void), int bits, unsigned long rate) pr_debug("Registered %pF as sched_clock source\n", read); } +int sched_clock_initialized(void) +{ + return initialized; +} + void __init sched_clock_postinit(void) { /* @@ -249,6 +255,8 @@ void __init sched_clock_postinit(void) hrtimer_init(&sched_clock_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); sched_clock_timer.function = sched_clock_poll; hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL); + + initialized = 1; } /* |