• Jason Low's avatar
    sched: Fix the rq->next_balance logic in rebalance_domains() and idle_balance() · 52a08ef1
    Jason Low authored
    Currently, in idle_balance(), we update rq->next_balance when we pull_tasks.
    However, it is also important to update this in the !pulled_tasks case too.
    
    When the CPU is "busy" (the CPU isn't idle), rq->next_balance gets computed
    using sd->busy_factor (so we increase the balance interval when the CPU is
    busy). However, when the CPU goes idle, rq->next_balance could still be set
    to a large value that was computed with the sd->busy_factor.
    
    Thus, we need to also update rq->next_balance in idle_balance() in the cases
    where !pulled_tasks too, so that rq->next_balance gets updated without taking
    the busy_factor into account when the CPU is about to go idle.
    
    This patch makes rq->next_balance get updated independently of whether or
    not we pulled_task. Also, we add logic to ensure that we always traverse
    at least 1 of the sched domains to get a proper next_balance value for
    updating rq->next_balance.
    
    Additionally, since load_balance() modifies the sd->balance_interval, we
    need to re-obtain the sched domain's interval after the call to
    load_balance() in rebalance_domains() before we update rq->next_balance.
    
    This patch adds and uses 2 new helper functions, update_next_balance() and
    get_sd_balance_interval() to update next_balance and obtain the sched
    domain's balance_interval.
    Signed-off-by: default avatarJason Low <jason.low2@hp.com>
    Reviewed-by: default avatarPreeti U Murthy <preeti@linux.vnet.ibm.com>
    Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Cc: daniel.lezcano@linaro.org
    Cc: alex.shi@linaro.org
    Cc: efault@gmx.de
    Cc: vincent.guittot@linaro.org
    Cc: morten.rasmussen@arm.com
    Cc: aswin@hp.com
    Link: http://lkml.kernel.org/r/1399596562.2200.7.camel@j-VirtualBoxSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    52a08ef1
fair.c 200 KB