sched: fix cpu hotplug
I think we may have a race between try_to_wake_up() and migrate_live_tasks() -> move_task_off_dead_cpu() when the later one may end up looping endlessly. Interrupts are enabled on other CPUs when migration_call(CPU_DEAD, ...) is called so we may get a race between try_to_wake_up() and migrate_live_tasks() -> move_task_off_dead_cpu(). The former one may push a task out of a dead CPU causing the later one to loop endlessly. Heiko Carstens observed: | That's exactly what explains a dump I got yesterday. Thanks for fixing! :) Signed-off-by: Dmitry Adamushko <dmitry.adamushko@gmail.com> Cc: miaox@cn.fujitsu.com Cc: Lai Jiangshan <laijs@cn.fujitsu.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Avi Kivity <avi@qumranet.com> Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Родитель
619b048803
Коммит
dc7fab8b3b
|
@ -5621,8 +5621,10 @@ static int __migrate_task(struct task_struct *p, int src_cpu, int dest_cpu)
|
|||
|
||||
double_rq_lock(rq_src, rq_dest);
|
||||
/* Already moved. */
|
||||
if (task_cpu(p) != src_cpu)
|
||||
if (task_cpu(p) != src_cpu) {
|
||||
ret = 1;
|
||||
goto out;
|
||||
}
|
||||
/* Affinity changed (again). */
|
||||
if (!cpu_isset(dest_cpu, p->cpus_allowed))
|
||||
goto out;
|
||||
|
|
Загрузка…
Ссылка в новой задаче