• Peter Zijlstra's avatar
    sched: Ensure set_task_cpu() is never called on blocked tasks · e2912009
    Peter Zijlstra authored
    In order to clean up the set_task_cpu() rq dependencies we need
    to ensure it is never called on blocked tasks because such usage
    does not pair with consistent rq->lock usage.
    
    This puts the migration burden on ttwu().
    
    Furthermore we need to close a race against changing
    ->cpus_allowed, since select_task_rq() runs with only preemption
    disabled.
    
    For sched_fork() this is safe because the child isn't in the
    tasklist yet, for wakeup we fix this by synchronizing
    set_cpus_allowed_ptr() against TASK_WAKING, which leaves
    sched_exec to be a problem
    
    This also closes a hole in (6ad4c188 sched: Fix balance vs
    hotplug race) where ->select_task_rq() doesn't validate the
    result against the sched_domain/root_domain.
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Mike Galbraith <efault@gmx.de>
    LKML-Reference: <20091216170517.807938893@chello.nl>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    e2912009
sched.c 270 KB