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 <patrick.bellasi@arm.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Quentin Perret <quentin.perret@arm.com>
This commit is contained in:
Patrick Bellasi
2018-12-18 10:31:30 +00:00
committed by Quentin Perret
parent 54ecb8f702
commit b61876ed12

View File

@@ -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);