diff options
author | Corey Minyard <cminyard@mvista.com> | 2014-05-08 14:47:39 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2014-05-22 05:16:35 -0400 |
commit | a803f0261bb2bb57aab5542af3174db43b2a3887 (patch) | |
tree | 305b9aeaf5c4ccdeba62c4f99461ade245fdd960 /kernel/sched/core.c | |
parent | 72465447867b9de6b5cdea5d10f9781585136270 (diff) |
sched: Initialize rq->age_stamp on processor start
If the sched_clock time starts at a large value, the kernel will spin
in sched_avg_update for a long time while rq->age_stamp catches up
with rq->clock.
The comment in kernel/sched/clock.c says that there is no strict promise
that it starts at zero. So initialize rq->age_stamp when a cpu starts up
to avoid this.
I was seeing long delays on a simulator that didn't start the clock at
zero. This might also be an issue on reboots on processors that don't
re-initialize the timer to zero on reset, and when using kexec.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1399574859-11714-1-git-send-email-minyard@acm.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/sched/core.c')
-rw-r--r-- | kernel/sched/core.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index f5605b6deea4..da302ca98f60 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -5089,10 +5089,20 @@ static struct notifier_block migration_notifier = { | |||
5089 | .priority = CPU_PRI_MIGRATION, | 5089 | .priority = CPU_PRI_MIGRATION, |
5090 | }; | 5090 | }; |
5091 | 5091 | ||
5092 | static void __cpuinit set_cpu_rq_start_time(void) | ||
5093 | { | ||
5094 | int cpu = smp_processor_id(); | ||
5095 | struct rq *rq = cpu_rq(cpu); | ||
5096 | rq->age_stamp = sched_clock_cpu(cpu); | ||
5097 | } | ||
5098 | |||
5092 | static int sched_cpu_active(struct notifier_block *nfb, | 5099 | static int sched_cpu_active(struct notifier_block *nfb, |
5093 | unsigned long action, void *hcpu) | 5100 | unsigned long action, void *hcpu) |
5094 | { | 5101 | { |
5095 | switch (action & ~CPU_TASKS_FROZEN) { | 5102 | switch (action & ~CPU_TASKS_FROZEN) { |
5103 | case CPU_STARTING: | ||
5104 | set_cpu_rq_start_time(); | ||
5105 | return NOTIFY_OK; | ||
5096 | case CPU_DOWN_FAILED: | 5106 | case CPU_DOWN_FAILED: |
5097 | set_cpu_active((long)hcpu, true); | 5107 | set_cpu_active((long)hcpu, true); |
5098 | return NOTIFY_OK; | 5108 | return NOTIFY_OK; |
@@ -6970,6 +6980,7 @@ void __init sched_init(void) | |||
6970 | if (cpu_isolated_map == NULL) | 6980 | if (cpu_isolated_map == NULL) |
6971 | zalloc_cpumask_var(&cpu_isolated_map, GFP_NOWAIT); | 6981 | zalloc_cpumask_var(&cpu_isolated_map, GFP_NOWAIT); |
6972 | idle_thread_set_boot_cpu(); | 6982 | idle_thread_set_boot_cpu(); |
6983 | set_cpu_rq_start_time(); | ||
6973 | #endif | 6984 | #endif |
6974 | init_sched_fair_class(); | 6985 | init_sched_fair_class(); |
6975 | 6986 | ||