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>
This commit is contained in:
parent
7246544786
commit
a803f0261b
|
@ -5089,10 +5089,20 @@ static struct notifier_block migration_notifier = {
|
||||||
.priority = CPU_PRI_MIGRATION,
|
.priority = CPU_PRI_MIGRATION,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void __cpuinit set_cpu_rq_start_time(void)
|
||||||
|
{
|
||||||
|
int cpu = smp_processor_id();
|
||||||
|
struct rq *rq = cpu_rq(cpu);
|
||||||
|
rq->age_stamp = sched_clock_cpu(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
static int sched_cpu_active(struct notifier_block *nfb,
|
static int sched_cpu_active(struct notifier_block *nfb,
|
||||||
unsigned long action, void *hcpu)
|
unsigned long action, void *hcpu)
|
||||||
{
|
{
|
||||||
switch (action & ~CPU_TASKS_FROZEN) {
|
switch (action & ~CPU_TASKS_FROZEN) {
|
||||||
|
case CPU_STARTING:
|
||||||
|
set_cpu_rq_start_time();
|
||||||
|
return NOTIFY_OK;
|
||||||
case CPU_DOWN_FAILED:
|
case CPU_DOWN_FAILED:
|
||||||
set_cpu_active((long)hcpu, true);
|
set_cpu_active((long)hcpu, true);
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
|
@ -6970,6 +6980,7 @@ void __init sched_init(void)
|
||||||
if (cpu_isolated_map == NULL)
|
if (cpu_isolated_map == NULL)
|
||||||
zalloc_cpumask_var(&cpu_isolated_map, GFP_NOWAIT);
|
zalloc_cpumask_var(&cpu_isolated_map, GFP_NOWAIT);
|
||||||
idle_thread_set_boot_cpu();
|
idle_thread_set_boot_cpu();
|
||||||
|
set_cpu_rq_start_time();
|
||||||
#endif
|
#endif
|
||||||
init_sched_fair_class();
|
init_sched_fair_class();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue