]> git.baikalelectronics.ru Git - kernel.git/commit
sched/cpufreq: Consider reduced CPU capacity in energy calculation
authorLukasz Luba <lukasz.luba@arm.com>
Mon, 14 Jun 2021 19:12:38 +0000 (20:12 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Thu, 17 Jun 2021 12:11:43 +0000 (14:11 +0200)
commita7e068121588385ce789bcb149cbdbe6be375f8e
tree2f38807a61ee20b3ec4b46970f68f59d4d8b67c9
parentb2ac0517fe214e9277ca5bd06c4e0a64f13a11e4
sched/cpufreq: Consider reduced CPU capacity in energy calculation

Energy Aware Scheduling (EAS) needs to predict the decisions made by
SchedUtil. The map_util_freq() exists to do that.

There are corner cases where the max allowed frequency might be reduced
(due to thermal). SchedUtil as a CPUFreq governor, is aware of that
but EAS is not. This patch aims to address it.

SchedUtil stores the maximum allowed frequency in
'sugov_policy::next_freq' field. EAS has to predict that value, which is
the real used frequency. That value is made after a call to
cpufreq_driver_resolve_freq() which clamps to the CPUFreq policy limits.
In the existing code EAS is not able to predict that real frequency.
This leads to energy estimation errors.

To avoid wrong energy estimation in EAS (due to frequency miss prediction)
make sure that the step which calculates Performance Domain frequency,
is also aware of the allowed CPU capacity.

Furthermore, modify map_util_freq() to not extend the frequency value.
Instead, use map_util_perf() to extend the util value in both places:
SchedUtil and EAS, but for EAS clamp it to max allowed CPU capacity.
In the end, we achieve the same desirable behavior for both subsystems
and alignment in regards to the real CPU frequency.

Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> (For the schedutil part)
Link: https://lore.kernel.org/r/20210614191238.23224-1-lukasz.luba@arm.com
include/linux/energy_model.h
include/linux/sched/cpufreq.h
kernel/sched/cpufreq_schedutil.c
kernel/sched/fair.c