From b61876ed122f816660fe49e0de1b7ee4891deaa2 Mon Sep 17 00:00:00 2001 From: Patrick Bellasi Date: Tue, 18 Dec 2018 10:31:30 +0000 Subject: [PATCH] ANDROID: sched/fair: EAS: Add uclamp support to find_energy_efficient_cpu() Utilization clamping can be used to boost the utilization of small tasks or cap that of big tasks. Thus, one of its possible usages is to bias tasks placement to "promote" small tasks on higher capacity (less energy efficient) CPUs or "constraint" big tasks on small capacity (more energy efficient) CPUs. When the Energy Aware Scheduler (EAS) looks for the most energy efficient CPU to run a task on, it currently considers only the effective utiliation estimated for a task. Fix this by adding an additional check to skip CPUs which capacity is smaller then the task clamped utilization. Change-Id: I43fa6fa27e27c1eb5272c6a45d1a6a5b0faae1aa Signed-off-by: Patrick Bellasi Cc: Ingo Molnar Cc: Peter Zijlstra Signed-off-by: Quentin Perret --- kernel/sched/fair.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 83ab35e2374f..c80cf449f9fb 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -6026,6 +6026,19 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target) return target; } +static unsigned int uclamp_task_util(struct task_struct *p) +{ +#ifdef CONFIG_UCLAMP_TASK + unsigned int min_util = uclamp_eff_value(p, UCLAMP_MIN); + unsigned int max_util = uclamp_eff_value(p, UCLAMP_MAX); + unsigned int est_util = task_util_est(p); + + return clamp(est_util, min_util, max_util); +#else + return task_util_est(p); +#endif +} + /** * Amount of capacity of a CPU that is (estimated to be) used by CFS tasks * @cpu: the CPU to get the utilization of @@ -6370,6 +6383,10 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) if (!fits_capacity(util, cpu_cap)) continue; + /* Skip CPUs which do not fit task requirements */ + if (cpu_cap < uclamp_task_util(p)) + continue; + /* Always use prev_cpu as a candidate. */ if (cpu == prev_cpu) { prev_delta = compute_energy(p, prev_cpu, pd);