sched/fair: Stabilize asym cpu capacity system idle cpu selection
authorVincent Guittot <vincent.guittot@linaro.org>
Tue, 11 Jul 2023 08:13:59 +0000 (10:13 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 13 Jul 2023 13:21:53 +0000 (15:21 +0200)
select_idle_capacity() not only looks for an idle cpu that fits for the
waking task but also for cpu with highest bandwidth when no cpu fits.
Start the loop with target cpu so it will be selected 1st when no cpu fits
but several cpus shared the same bandwidth. Starting with target cpu
prevents the task to migrate between cpus with same bandwidth at every
wakeup when no cpu fits.

Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20230711081359.868862-1-vincent.guittot@linaro.org
kernel/sched/fair.c

index a87988327f889c5b792e16c9ed7661f04179a3ba..0cd1cdbae534600a2959b7eff3f4e38508d9258e 100644 (file)
@@ -7096,7 +7096,7 @@ select_idle_capacity(struct task_struct *p, struct sched_domain *sd, int target)
        util_min = uclamp_eff_value(p, UCLAMP_MIN);
        util_max = uclamp_eff_value(p, UCLAMP_MAX);
 
-       for_each_cpu_wrap(cpu, cpus, target + 1) {
+       for_each_cpu_wrap(cpu, cpus, target) {
                unsigned long cpu_cap = capacity_of(cpu);
 
                if (!available_idle_cpu(cpu) && !sched_idle_cpu(cpu))