• Dmitry Adamushko's avatar
    sched: fix __set_task_cpu() SMP race · ce96b5ac
    Dmitry Adamushko authored
    Grant Wilson has reported rare SCHED_FAIR_USER crashes on his quad-core
    system, which crashes can only be explained via runqueue corruption.
    
    there is a narrow SMP race in __set_task_cpu(): after ->cpu is set up to
    a new value, task_rq_lock(p, ...) can be successfuly executed on another
    CPU. We must ensure that updates of per-task data have been completed by
    this moment.
    
    this bug has been hiding in the Linux scheduler for an eternity (we never
    had any explicit barrier for task->cpu in set_task_cpu() - so the bug was
    introduced in 2.5.1), but only became visible via set_task_cfs_rq() being
    accidentally put after the task->cpu update. It also probably needs a
    sufficiently out-of-order CPU to trigger.
    Reported-by: default avatarGrant Wilson <grant.wilson@zen.co.uk>
    Signed-off-by: default avatarDmitry Adamushko <dmitry.adamushko@gmail.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    ce96b5ac
sched.c 178 KB