• Viresh Kumar's avatar
    sched/fair: Load balance aggressively for SCHED_IDLE CPUs · 323af6de
    Viresh Kumar authored
    The fair scheduler performs periodic load balance on every CPU to check
    if it can pull some tasks from other busy CPUs. The duration of this
    periodic load balance is set to sd->balance_interval for the idle CPUs
    and is calculated by multiplying the sd->balance_interval with the
    sd->busy_factor (set to 32 by default) for the busy CPUs. The
    multiplication is done for busy CPUs to avoid doing load balance too
    often and rather spend more time executing actual task. While that is
    the right thing to do for the CPUs busy with SCHED_OTHER or SCHED_BATCH
    tasks, it may not be the optimal thing for CPUs running only SCHED_IDLE
    tasks.
    
    With the recent enhancements in the fair scheduler around SCHED_IDLE
    CPUs, we now prefer to enqueue a newly-woken task to a SCHED_IDLE
    CPU instead of other busy or idle CPUs. The same reasoning should be
    applied to the load balancer as well to make it migrate tasks more
    aggressively to a SCHED_IDLE CPU, as that will reduce the scheduling
    latency of the migrated (SCHED_OTHER) tasks.
    
    This patch makes minimal changes to the fair scheduler to do the next
    load balance soon after the last non SCHED_IDLE task is dequeued from a
    runqueue, i.e. making the CPU SCHED_IDLE. Also the sd->busy_factor is
    ignored while calculating the balance_interval for such CPUs. This is
    done to avoid delaying the periodic load balance by few hundred
    milliseconds for SCHED_IDLE CPUs.
    
    This is tested on ARM64 Hikey620 platform (octa-core) with the help of
    rt-app and it is verified, using kernel traces, that the newly
    SCHED_IDLE CPU does load balancing shortly after it becomes SCHED_IDLE
    and pulls tasks from other busy CPUs.
    Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
    Link: https://lkml.kernel.org/r/e485827eb8fe7db0943d6f3f6e0f5a4a70272781.1578471925.git.viresh.kumar@linaro.org
    323af6de
fair.c 287 KB