summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/linux/sched.h1
-rw-r--r--kernel/sched/core.c3
-rw-r--r--kernel/time/sched_clock.c8
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;
}
/*