aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Guittot <vincent.guittot@linaro.org>2018-08-29 09:44:23 +0200
committerVincent Guittot <vincent.guittot@linaro.org>2018-08-29 09:44:23 +0200
commit5505e32da4b814c1f79785b9e31f3a7a5f6cb5e2 (patch)
tree67e8ce06892baa0afede91a5a72d08f73d143107
parent1b6266ebe3da8198e9a02fbad77bbb56e2f7ce2e (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.c2
-rw-r--r--kernel/sched/sched.h22
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
+