On 19-07-18, 14:00, Vincent Guittot wrote: > Reuse cpu_util_irq() that has been defined for schedutil and set irq util > to 0 when !CONFIG_IRQ_TIME_ACCOUNTING > > But the compiler is not able to optimize the sequence (at least with > aarch64 GCC 7.2.1) > free *= (max - irq); > free /= max; > when irq is fixed to 0 > > Add a new inline function scale_irq_capacity() that will scale utilization > when irq is accounted. Reuse this funciton in schedutil which applies > similar formula. > > Suggested-by: Ingo Molnar <mi...@redhat.com> > Signed-off-by: Vincent Guittot <vincent.guit...@linaro.org> > --- > kernel/sched/cpufreq_schedutil.c | 3 +-- > kernel/sched/fair.c | 13 +++---------- > kernel/sched/sched.h | 20 ++++++++++++++++++-- > 3 files changed, 22 insertions(+), 14 deletions(-) > > diff --git a/kernel/sched/cpufreq_schedutil.c > b/kernel/sched/cpufreq_schedutil.c > index 97dcd44..3fffad3 100644 > --- a/kernel/sched/cpufreq_schedutil.c > +++ b/kernel/sched/cpufreq_schedutil.c > @@ -247,8 +247,7 @@ static unsigned long sugov_get_util(struct sugov_cpu > *sg_cpu) > * U' = irq + ------- * U > * max > */ > - util *= (max - irq); > - util /= max; > + util = scale_irq_capacity(util, irq, max); > util += irq; > > /* > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index d5f7d52..14c3fdd 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -7551,16 +7551,12 @@ static unsigned long scale_rt_capacity(int cpu) > struct rq *rq = cpu_rq(cpu); > unsigned long max = arch_scale_cpu_capacity(NULL, cpu); > unsigned long used, free; > -#if defined(CONFIG_IRQ_TIME_ACCOUNTING) || > defined(CONFIG_PARAVIRT_TIME_ACCOUNTING) > unsigned long irq; > -#endif > > -#if defined(CONFIG_IRQ_TIME_ACCOUNTING) || > defined(CONFIG_PARAVIRT_TIME_ACCOUNTING) > - irq = READ_ONCE(rq->avg_irq.util_avg); > + irq = cpu_util_irq(rq); > > if (unlikely(irq >= max)) > return 1; > -#endif > > used = READ_ONCE(rq->avg_rt.util_avg); > used += READ_ONCE(rq->avg_dl.util_avg); > @@ -7569,11 +7565,8 @@ static unsigned long scale_rt_capacity(int cpu) > return 1; > > free = max - used; > -#if defined(CONFIG_IRQ_TIME_ACCOUNTING) || > defined(CONFIG_PARAVIRT_TIME_ACCOUNTING) > - free *= (max - irq); > - free /= max; > -#endif > - return free; > + > + return scale_irq_capacity(free, irq, max); > } > > static void update_cpu_capacity(struct sched_domain *sd, int cpu) > diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h > index ebb4b3c..b80c3fd 100644 > --- a/kernel/sched/sched.h > +++ b/kernel/sched/sched.h > @@ -2210,17 +2210,33 @@ static inline unsigned long cpu_util_rt(struct rq *rq) > { > return READ_ONCE(rq->avg_rt.util_avg); > } > +#endif > > -#if defined(CONFIG_IRQ_TIME_ACCOUNTING) || > defined(CONFIG_PARAVIRT_TIME_ACCOUNTING) > +#if defined(SMP) \ > + && (defined(CONFIG_IRQ_TIME_ACCOUNTING) || > defined(CONFIG_PARAVIRT_TIME_ACCOUNTING)) > static inline unsigned long cpu_util_irq(struct rq *rq) > { > return rq->avg_irq.util_avg; > } > + > +static inline > +unsigned long scale_irq_capacity(unsigned long util, unsigned long irq, > unsigned long max) > +{ > + util *= (max - irq);
() can be dropped here. Other than that: Acked-by: Viresh Kumar <viresh.ku...@linaro.org> -- viresh