• Lingutla Chandrasekhar's avatar
    sched/fair: Ignore percpu threads for imbalance pulls · 9bcb959d
    Lingutla Chandrasekhar authored
    During load balance, LBF_SOME_PINNED will be set if any candidate task
    cannot be detached due to CPU affinity constraints. This can result in
    setting env->sd->parent->sgc->group_imbalance, which can lead to a group
    being classified as group_imbalanced (rather than any of the other, lower
    group_type) when balancing at a higher level.
    
    In workloads involving a single task per CPU, LBF_SOME_PINNED can often be
    set due to per-CPU kthreads being the only other runnable tasks on any
    given rq. This results in changing the group classification during
    load-balance at higher levels when in reality there is nothing that can be
    done for this affinity constraint: per-CPU kthreads, as the name implies,
    don't get to move around (modulo hotplug shenanigans).
    
    It's not as clear for userspace tasks - a task could be in an N-CPU cpuset
    with N-1 offline CPUs, making it an "accidental" per-CPU task rather than
    an intended one. KTHREAD_IS_PER_CPU gives us an indisputable signal which
    we can leverage here to not set LBF_SOME_PINNED.
    
    Note that the aforementioned classification to group_imbalance (when
    nothing can be done) is especially problematic on big.LITTLE systems, which
    have a topology the likes of:
    
      DIE [          ]
      MC  [    ][    ]
           0  1  2  3
           L  L  B  B
    
      arch_scale_cpu_capacity(L) < arch_scale_cpu_capacity(B)
    
    Here, setting LBF_SOME_PINNED due to a per-CPU kthread when balancing at MC
    level on CPUs [0-1] will subsequently prevent CPUs [2-3] from classifying
    the [0-1] group as group_misfit_task when balancing at DIE level. Thus, if
    CPUs [0-1] are running CPU-bound (misfit) tasks, ill-timed per-CPU kthreads
    can significantly delay the upgmigration of said misfit tasks. Systems
    relying on ASYM_PACKING are likely to face similar issues.
    Signed-off-by: default avatarLingutla Chandrasekhar <clingutla@codeaurora.org>
    [Use kthread_is_per_cpu() rather than p->nr_cpus_allowed]
    [Reword changelog]
    Signed-off-by: default avatarValentin Schneider <valentin.schneider@arm.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarDietmar Eggemann <dietmar.eggemann@arm.com>
    Reviewed-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
    Link: https://lkml.kernel.org/r/20210407220628.3798191-2-valentin.schneider@arm.com
    9bcb959d
fair.c 300 KB