aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched/core.c
diff options
context:
space:
mode:
authorCorey Minyard <cminyard@mvista.com>2014-05-08 14:47:39 -0400
committerIngo Molnar <mingo@kernel.org>2014-05-22 05:16:35 -0400
commita803f0261bb2bb57aab5542af3174db43b2a3887 (patch)
tree305b9aeaf5c4ccdeba62c4f99461ade245fdd960 /kernel/sched/core.c
parent72465447867b9de6b5cdea5d10f9781585136270 (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.c11
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
5092static 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
5092static int sched_cpu_active(struct notifier_block *nfb, 5099static 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