Thread (18 messages) 18 messages, 4 authors, 2023-11-02

Re: [PATCH v4 7/7] arm64/amu: use capacity_ref_freq to set AMU ratio

From: Vincent Guittot <vincent.guittot@linaro.org>
Date: 2023-11-01 09:04:59
Also in: linux-acpi, linux-pm, linux-riscv, lkml

Hi Beata,

On Wed, 1 Nov 2023 at 00:59, Beata Michalska [off-list ref] wrote:
On Fri, Oct 27, 2023 at 10:04:00AM +0200, Vincent Guittot wrote:
quoted
Use the new capacity_ref_freq to set the ratio that is used by AMU for
computing the arch_scale_freq_capacity().
This helps to keep everything aligned using the same reference for
computing CPUs capacity.
[..]
quoted
@@ -381,6 +385,9 @@ void topology_init_cpu_capacity_cppc(void)
      }

      for_each_possible_cpu(cpu) {
+             freq_inv_set_max_ratio(cpu,
+                                    per_cpu(capacity_ref_freq, cpu) * HZ_PER_KHZ);
+
The capacity_ref_freq set earlier will still lead to units mismatch,
as at the point of calling topology_init_cpu_capacity_cppc the lowest & nominal
frequencies will be provided in MHz (unless I have missed smth).
I don't get your point:
the unit of per_cpu(capacity_freq_ref, cpu) is Khz

For cppc, we have
per_cpu(capacity_freq_ref, cpu) = cppc_perf_to_khz(&perf_caps,
raw_capacity[cpu]);

freq_inv_set_max_ratio() uses
arch_timer_get_rate() which returns a freq in Hz
and
per_cpu(capacity_freq_ref, cpu) * HZ_PER_KHZ. to get a freq in Hz too.
This means that use of both, the capacity_ref_freq and the arch_freq_scale
will generate unexpected results, so I guess this should get amended in the
preceding patch (?) [1]

---
BR
B.

[1] https://lore.kernel.org/linux-arm-kernel/20231027080400.56703-4-vincent.guittot@linaro.org/T/#m42daa167097edc190b1cfc05382c385ed801d909 (local)
quoted
              capacity = raw_capacity[cpu];
              capacity = div64_u64(capacity << SCHED_CAPACITY_SHIFT,
                                   capacity_scale);
@@ -422,8 +429,11 @@ init_cpu_capacity_callback(struct notifier_block *nb,

      cpumask_andnot(cpus_to_visit, cpus_to_visit, policy->related_cpus);

-     for_each_cpu(cpu, policy->related_cpus)
+     for_each_cpu(cpu, policy->related_cpus) {
              per_cpu(capacity_ref_freq, cpu) = policy->cpuinfo.max_freq;
+             freq_inv_set_max_ratio(cpu,
+                                    per_cpu(capacity_ref_freq, cpu) * HZ_PER_KHZ);
+     }

      if (cpumask_empty(cpus_to_visit)) {
              topology_normalize_cpu_scale();
diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h
index 38ca6c76af56..ffdf0b7c55fa 100644
--- a/include/linux/arch_topology.h
+++ b/include/linux/arch_topology.h
@@ -99,6 +99,7 @@ void update_siblings_masks(unsigned int cpu);
 void remove_cpu_topology(unsigned int cpuid);
 void reset_cpu_topology(void);
 int parse_acpi_topology(void);
+void freq_inv_set_max_ratio(int cpu, u64 max_rate);
 #endif

 #endif /* _LINUX_ARCH_TOPOLOGY_H_ */
--
2.34.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help