diff options
author | Vincent Guittot <vincent.guittot@linaro.org> | 2018-08-29 09:44:23 +0200 |
---|---|---|
committer | Vincent Guittot <vincent.guittot@linaro.org> | 2018-08-29 09:44:23 +0200 |
commit | 5505e32da4b814c1f79785b9e31f3a7a5f6cb5e2 (patch) | |
tree | 67e8ce06892baa0afede91a5a72d08f73d143107 | |
parent | 1b6266ebe3da8198e9a02fbad77bbb56e2f7ce2e (diff) |
sched/schedutil : optimize utilization scaling for guest kernelsched-optimize-irq-pelt
Scaling the utilization of CPUs with irq util_avg in schedutil doesn't give
any benefit and just waste CPU cycles when irq time is not accounted but
only steal time.
Add an internal _scale_irq_capacity() for scaling cpu_capacity but scale
cpu utilization in schedutil only if we are accounting irq time.
Suggested-by: Wanpeng Li <kernellwp@gmail.com>
Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
-rw-r--r-- | kernel/sched/fair.c | 2 | ||||
-rw-r--r-- | kernel/sched/sched.h | 22 |
2 files changed, 21 insertions, 3 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 309c93fcc604..c1334be05db3 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7501,7 +7501,7 @@ static unsigned long scale_rt_capacity(int cpu) free = max - used; - return scale_irq_capacity(free, irq, max); + 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 4a2e8cae63c4..1003d6950460 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -2221,14 +2221,14 @@ static inline unsigned long cpu_util_irq(struct rq *rq) } static inline -unsigned long scale_irq_capacity(unsigned long util, unsigned long irq, unsigned long max) +unsigned long _scale_irq_capacity(unsigned long util, unsigned long irq, unsigned long max) { util *= (max - irq); util /= max; return util; - } + #else static inline unsigned long cpu_util_irq(struct rq *rq) { @@ -2236,8 +2236,26 @@ static inline unsigned long cpu_util_irq(struct rq *rq) } static inline +unsigned long _scale_irq_capacity(unsigned long util, unsigned long irq, unsigned long max) +{ + return util; +} +#endif + +/* + * scale_irq_capacity is used by schedutil to scale utilization only when + * irq time is accounted. This scaling is not necessary when only virtual time + * is accounted as guest doesn't have access to frequency scaling. + */ +#ifdef CONFIG_IRQ_TIME_ACCOUNTING + +#define scale_irq_capacity _scale_irq_capacity + +#else +static inline unsigned long scale_irq_capacity(unsigned long util, unsigned long irq, unsigned long max) { return util; } #endif + |