| From 15cbbd1d317e07b4e5c6aca5d4c5579539a82784 Mon Sep 17 00:00:00 2001 |
| From: Vincent Guittot <vincent.guittot@linaro.org> |
| Date: Mon, 11 Dec 2023 11:48:52 +0100 |
| Subject: energy_model: Use a fixed reference frequency |
| |
| From: Vincent Guittot <vincent.guittot@linaro.org> |
| |
| commit 15cbbd1d317e07b4e5c6aca5d4c5579539a82784 upstream. |
| |
| The last item of a performance domain is not always the performance point |
| that has been used to compute CPU's capacity. This can lead to different |
| target frequency compared with other part of the system like schedutil and |
| would result in wrong energy estimation. |
| |
| A new arch_scale_freq_ref() is available to return a fixed and coherent |
| frequency reference that can be used when computing the CPU's frequency |
| for an level of utilization. Use this function to get this reference |
| frequency. |
| |
| Energy model is never used without defining arch_scale_freq_ref() but |
| can be compiled. Define a default arch_scale_freq_ref() returning 0 |
| in such case. |
| |
| Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org> |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Tested-by: Lukasz Luba <lukasz.luba@arm.com> |
| Reviewed-by: Lukasz Luba <lukasz.luba@arm.com> |
| Link: https://lore.kernel.org/r/20231211104855.558096-5-vincent.guittot@linaro.org |
| Stable-dep-of: e37617c8e53a ("sched/fair: Fix frequency selection for non-invariant case") |
| Signed-off-by: Wentao Guan <guanwentao@uniontech.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| include/linux/energy_model.h | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/include/linux/energy_model.h |
| +++ b/include/linux/energy_model.h |
| @@ -224,7 +224,7 @@ static inline unsigned long em_cpu_energ |
| unsigned long max_util, unsigned long sum_util, |
| unsigned long allowed_cpu_cap) |
| { |
| - unsigned long freq, scale_cpu; |
| + unsigned long freq, ref_freq, scale_cpu; |
| struct em_perf_state *ps; |
| int cpu; |
| |
| @@ -241,10 +241,10 @@ static inline unsigned long em_cpu_energ |
| */ |
| cpu = cpumask_first(to_cpumask(pd->cpus)); |
| scale_cpu = arch_scale_cpu_capacity(cpu); |
| - ps = &pd->table[pd->nr_perf_states - 1]; |
| + ref_freq = arch_scale_freq_ref(cpu); |
| |
| max_util = min(max_util, allowed_cpu_cap); |
| - freq = map_util_freq(max_util, ps->frequency, scale_cpu); |
| + freq = map_util_freq(max_util, ref_freq, scale_cpu); |
| |
| /* |
| * Find the lowest performance state of the Energy Model above the |