• Valentin Schneider's avatar
    sched/fair: Make EAS wakeup placement consider uclamp restrictions · 1d42509e
    Valentin Schneider authored
    task_fits_capacity() has just been made uclamp-aware, and
    find_energy_efficient_cpu() needs to go through the same treatment.
    
    Things are somewhat different here however - using the task max clamp isn't
    sufficient. Consider the following setup:
    
      The target runqueue, rq:
        rq.cpu_capacity_orig = 512
        rq.cfs.avg.util_avg = 200
        rq.uclamp.max = 768 // the max p.uclamp.max of all enqueued p's is 768
    
      The waking task, p (not yet enqueued on rq):
        p.util_est = 600
        p.uclamp.max = 100
    
    Now, consider the following code which doesn't use the rq clamps:
    
      util = uclamp_task_util(p);
      // Does the task fit in the spare CPU capacity?
      cpu = cpu_of(rq);
      fits_capacity(util, cpu_capacity(cpu) - cpu_util(cpu))
    
    This would lead to:
    
      util = 100;
      fits_capacity(100, 512 - 200)
    
    fits_capacity() would return true. However, enqueuing p on that CPU *will*
    cause it to become overutilized since rq clamp values are max-aggregated,
    so we'd remain with
    
      rq.uclamp.max = 768
    
    which comes from the other tasks already enqueued on rq. Thus, we could
    select a high enough frequency to reach beyond 0.8 * 512 utilization
    (== overutilized) after enqueuing p on rq. What find_energy_efficient_cpu()
    needs here is uclamp_rq_util_with() which lets us peek at the future
    utilization landscape, including rq-wide uclamp values.
    
    Make find_energy_efficient_cpu() use uclamp_rq_util_with() for its
    fits_capacity() check. This is in line with what compute_energy() ends up
    using for estimating utilization.
    Tested-By: default avatarDietmar Eggemann <dietmar.eggemann@arm.com>
    Suggested-by: default avatarQuentin Perret <qperret@google.com>
    Signed-off-by: default avatarValentin Schneider <valentin.schneider@arm.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
    Reviewed-by: default avatarDietmar Eggemann <dietmar.eggemann@arm.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/20191211113851.24241-6-valentin.schneider@arm.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    1d42509e
fair.c 287 KB