• Ken Chen's avatar
    sched: Fix erroneous all_pinned logic · b30aef17
    Ken Chen authored
    The scheduler load balancer has specific code to deal with cases of
    unbalanced system due to lots of unmovable tasks (for example because of
    hard CPU affinity). In those situation, it excludes the busiest CPU that
    has pinned tasks for load balance consideration such that it can perform
    second 2nd load balance pass on the rest of the system.
    
    This all works as designed if there is only one cgroup in the system.
    
    However, when we have multiple cgroups, this logic has false positives and
    triggers multiple load balance passes despite there are actually no pinned
    tasks at all.
    
    The reason it has false positives is that the all pinned logic is deep in
    the lowest function of can_migrate_task() and is too low level:
    
    load_balance_fair() iterates each task group and calls balance_tasks() to
    migrate target load. Along the way, balance_tasks() will also set a
    all_pinned variable. Given that task-groups are iterated, this all_pinned
    variable is essentially the status of last group in the scanning process.
    Task group can have number of reasons that no load being migrated, none
    due to cpu affinity. However, this status bit is being propagated back up
    to the higher level load_balance(), which incorrectly think that no tasks
    were moved.  It kick off the all pinned logic and start multiple passes
    attempt to move load onto puller CPU.
    
    To fix this, move the all_pinned aggregation up at the iterator level.
    This ensures that the status is aggregated over all task-groups, not just
    last one in the list.
    Signed-off-by: default avatarKen Chen <kenchen@google.com>
    Cc: stable@kernel.org
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/BANLkTi=ernzNawaR5tJZEsV_QVnfxqXmsQ@mail.gmail.comSigned-off-by: default avatarIngo Molnar <mingo@elte.hu>
    b30aef17
sched_fair.c 109 KB