From c06013206c840b1c3f0ec45acb8a54fc06ea0be5 Mon Sep 17 00:00:00 2001 From: Quentin Perret Date: Thu, 24 May 2018 17:35:02 +0100 Subject: [PATCH] ANDROID: sched/fair: Bypass energy computation for prefer_idle tasks If the only pre-selected candidate CPU in find_energy_efficient_cpu() happens to be prev_cpu, there is not point in computing the system energy since we have nothing to compare it against, so we currently bail out early. The same logic can be extended when prefer_idle tasks are routed in the energy-aware wake-up path: if the only candidate is idle for a prefer_idle task, just select it no matter what the energy impact is. That should help speeding-up wake-ups of prefer_idle tasks, at least when find_best_target() is used for them. Signed-off-by: Quentin Perret Change-Id: Idd0e387e4a766061cc05d2584df3a31e4dabfd09 --- kernel/sched/fair.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index a8b48ab4b4e1..31f3c747916a 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -6997,11 +6997,19 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu, int sy else select_max_spare_cap_cpus(sd, candidates, pd, p); - /* Bail out if there is no candidate, or if the only one is prev_cpu */ + /* Bail out if no candidate was found. */ weight = cpumask_weight(candidates); - if (!weight || (weight == 1 && cpumask_first(candidates) == prev_cpu)) + if (!weight) goto unlock; + /* If there is only one sensible candidate, select it now. */ + cpu = cpumask_first(candidates); + if (weight == 1 && ((schedtune_prefer_idle(p) && idle_cpu(cpu)) || + (cpu == prev_cpu))) { + best_energy_cpu = cpu; + goto unlock; + } + if (cpumask_test_cpu(prev_cpu, &p->cpus_allowed)) prev_energy = best_energy = compute_energy(p, prev_cpu, pd); else