Thread (19 messages) 19 messages, 2 authors, 2024-01-19

Re: [PATCH v3 1/5] cpufreq: Add a cpufreq pressure feedback for the scheduler

From: Dietmar Eggemann <dietmar.eggemann@arm.com>
Date: 2024-01-08 16:35:16
Also in: linux-arm-kernel, linux-arm-msm, linux-doc, linux-pm, lkml

On 08/01/2024 14:48, Vincent Guittot wrote:
Provide to the scheduler a feedback about the temporary max available
capacity. Unlike arch_update_thermal_pressure, this doesn't need to be
filtered as the pressure will happen for dozens ms or more.
Is this then related to the 'medium pace system pressure' you mentioned
in your OSPM '23 talk?
quoted hunk ↗ jump to hunk
Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
---
 drivers/cpufreq/cpufreq.c | 36 ++++++++++++++++++++++++++++++++++++
 include/linux/cpufreq.h   | 10 ++++++++++
 2 files changed, 46 insertions(+)
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index 44db4f59c4cc..fa2e2ea26f7f 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -2563,6 +2563,40 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
 }
 EXPORT_SYMBOL(cpufreq_get_policy);
 
+DEFINE_PER_CPU(unsigned long, cpufreq_pressure);
+
+/**
+ * cpufreq_update_pressure() - Update cpufreq pressure for CPUs
+ * @policy: cpufreq policy of the CPUs.
+ *
+ * Update the value of cpufreq pressure for all @cpus in the policy.
+ */
+static void cpufreq_update_pressure(struct cpufreq_policy *policy)
+{
+	unsigned long max_capacity, capped_freq, pressure;
+	u32 max_freq;
+	int cpu;
+
+	/*
+	 * Handle properly the boost frequencies, which should simply clean
+	 * the thermal pressure value.
               ^^^^^^^
IMHO, this is a copy & paste error from topology_update_thermal_pressure()?
+	 */
+	if (max_freq <= capped_freq) {
max_freq seems to be uninitialized.
+		pressure = 0;
Is this x86 (turbo boost) specific? IMHO at arm we follow this max freq
(including boost) relates to 1024 in capacity? Or haven't we made this
discussion yet?
+	} else {
+		cpu = cpumask_first(policy->related_cpus);
+		max_capacity = arch_scale_cpu_capacity(cpu);
+		capped_freq = policy->max;
+		max_freq = arch_scale_freq_ref(cpu);
+
+		pressure = max_capacity -
+			   mult_frac(max_capacity, capped_freq, max_freq);
+	}
+
+	for_each_cpu(cpu, policy->related_cpus)
+		WRITE_ONCE(per_cpu(cpufreq_pressure, cpu), pressure);
+}
+
[...]
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help