Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b61876ed authored by Patrick Bellasi's avatar Patrick Bellasi Committed by Quentin Perret
Browse files

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: default avatarPatrick Bellasi <patrick.bellasi@arm.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: default avatarQuentin Perret <quentin.perret@arm.com>
parent 54ecb8f7
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -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);