forked from Minki/linux
sched: Fix idle_cpu()
On -rt we observed hackbench waking all 400 tasks to a single cpu. This is because of select_idle_sibling()'s interaction with the new ipi based wakeup scheme. The existing idle_cpu() test only checks to see if the current task on that cpu is the idle task, it does not take already queued tasks into account, nor does it take queued to be woken tasks into account. If the remote wakeup IPIs come hard enough, there won't be time to schedule away from the idle task, and would thus keep thinking the cpu was in fact idle, regardless of the fact that there were already several hundred tasks runnable. We couldn't reproduce on mainline, but there's no reason it couldn't happen. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/n/tip-3o30p18b2paswpc9ohy2gltp@git.kernel.org Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
f0f1d32f93
commit
908a328372
@ -5138,7 +5138,20 @@ EXPORT_SYMBOL(task_nice);
|
|||||||
*/
|
*/
|
||||||
int idle_cpu(int cpu)
|
int idle_cpu(int cpu)
|
||||||
{
|
{
|
||||||
return cpu_curr(cpu) == cpu_rq(cpu)->idle;
|
struct rq *rq = cpu_rq(cpu);
|
||||||
|
|
||||||
|
if (rq->curr != rq->idle)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (rq->nr_running)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
if (!llist_empty(&rq->wake_list))
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user