• Andrew Morton's avatar
    [PATCH] sched_balance_exec(): don't fiddle with the cpus_allowed mask · 3de8a6b4
    Andrew Morton authored
    From: Rusty Russell <rusty@rustcorp.com.au>,
          Nick Piggin <piggin@cyberone.com.au>
    
    The current sched_balance_exec() sets the task's cpus_allowed mask
    temporarily to move it to a different CPU.  This has several issues,
    including the fact that a task will see its affinity at a bogus value.
    
    So we change the migration_req_t to explicitly specify a destination CPU,
    rather than the migration thread deriving it from cpus_allowed.  If the
    requested CPU is no longer valid (racing with another set_cpus_allowed,
    say), it can be ignored: if the task is not allowed on this CPU, there will
    be another migration request pending.
    
    This change allows sched_balance_exec() to tell the migration thread what
    to do without changing the cpus_allowed mask.
    
    So we rename __set_cpus_allowed() to move_task(), as the cpus_allowed mask
    is now set by the caller.  And move_task_away(), which the migration thread
    uses to actually perform the move, is renamed __move_task().
    
    I also ignore offline CPUs in sched_best_cpu(), so sched_migrate_task()
    doesn't need to check for offline CPUs.
    
    Ulterior motive: this approach also plays well with CPU Hotplug.
    Previously that patch might have seen a task with cpus_allowed only
    containing the dying CPU (temporarily due to sched_balance_exec) and
    forcibly reset it to all cpus, which might be wrong.  The other approach is
    to hold the cpucontrol sem around sched_balance_exec(), which is too much
    of a bottleneck.
    3de8a6b4
sched.c 86.9 KB