• Vincent Guittot's avatar
    sched: Make scale_rt invariant with frequency · b5b4860d
    Vincent Guittot authored
    The average running time of RT tasks is used to estimate the remaining compute
    capacity for CFS tasks. This remaining capacity is the original capacity scaled
    down by a factor (aka scale_rt_capacity). This estimation of available capacity
    must also be invariant with frequency scaling.
    
    A frequency scaling factor is applied on the running time of the RT tasks for
    computing scale_rt_capacity.
    
    In sched_rt_avg_update(), we now scale the RT execution time like below:
    
      rq->rt_avg += rt_delta * arch_scale_freq_capacity() >> SCHED_CAPACITY_SHIFT
    
    Then, scale_rt_capacity can be summarized by:
    
      scale_rt_capacity = SCHED_CAPACITY_SCALE * available / total
    
    with available = total - rq->rt_avg
    
    This has been been optimized in current code by:
    
      scale_rt_capacity = available / (total >> SCHED_CAPACITY_SHIFT)
    
    But we can also developed the equation like below:
    
      scale_rt_capacity = SCHED_CAPACITY_SCALE - ((rq->rt_avg << SCHED_CAPACITY_SHIFT) / total)
    
    and we can optimize the equation by removing SCHED_CAPACITY_SHIFT shift in
    the computation of rq->rt_avg and scale_rt_capacity().
    
    so rq->rt_avg += rt_delta * arch_scale_freq_capacity()
    and
    scale_rt_capacity = SCHED_CAPACITY_SCALE - (rq->rt_avg / total)
    
    arch_scale_frequency_capacity() will be called in the hot path of the scheduler
    which implies to have a short and efficient function.
    
    As an example, arch_scale_frequency_capacity() should return a cached value that
    is updated periodically outside of the hot path.
    Signed-off-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: default avatarMorten Rasmussen <morten.rasmussen@arm.com>
    Cc: Morten.Rasmussen@arm.com
    Cc: dietmar.eggemann@arm.com
    Cc: efault@gmx.de
    Cc: kamalesh@linux.vnet.ibm.com
    Cc: linaro-kernel@lists.linaro.org
    Cc: nicolas.pitre@linaro.org
    Cc: preeti@linux.vnet.ibm.com
    Cc: riel@redhat.com
    Link: http://lkml.kernel.org/r/1425052454-25797-6-git-send-email-vincent.guittot@linaro.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    b5b4860d
fair.c 214 KB