]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
cpufreq: Pass policy pointer to ->update_limits()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 28 Mar 2025 20:48:54 +0000 (21:48 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 9 Apr 2025 19:22:18 +0000 (21:22 +0200)
Since cpufreq_update_limits() obtains a cpufreq policy pointer for the
given CPU and reference counts the corresponding policy object, it may
as well pass the policy pointer to the cpufreq driver's ->update_limits()
callback which allows that callback to avoid invoking cpufreq_cpu_get()
for the same CPU.

Accordingly, redefine ->update_limits() to take a policy pointer instead
of a CPU number and update both drivers implementing it, intel_pstate
and amd-pstate, as needed.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Acked-by: Sudeep Holla <sudeep.holla@arm.com>
Tested-by: Sudeep Holla <sudeep.holla@arm.com>
Link: https://patch.msgid.link/8560367.NyiUUSuA9g@rjwysocki.net
drivers/cpufreq/amd-pstate.c
drivers/cpufreq/cpufreq.c
drivers/cpufreq/intel_pstate.c
include/linux/cpufreq.h

index 6789eed1bb5ba00a6519a2c4c6d110c8f7abe27f..b9d59c7425f5dc100e6137588cfb1b705e89aadd 100644 (file)
@@ -821,19 +821,16 @@ static void amd_pstate_init_prefcore(struct amd_cpudata *cpudata)
        schedule_work(&sched_prefcore_work);
 }
 
-static void amd_pstate_update_limits(unsigned int cpu)
+static void amd_pstate_update_limits(struct cpufreq_policy *policy)
 {
-       struct cpufreq_policy *policy __free(put_cpufreq_policy) = cpufreq_cpu_get(cpu);
        struct amd_cpudata *cpudata;
        u32 prev_high = 0, cur_high = 0;
        bool highest_perf_changed = false;
+       unsigned int cpu = policy->cpu;
 
        if (!amd_pstate_prefcore)
                return;
 
-       if (!policy)
-               return;
-
        if (amd_get_highest_perf(cpu, &cur_high))
                return;
 
index c885e0ec174ff6090f85884cc13132f6c9177e9b..2b91ba503b32c0774c83aea54947ce32e630026f 100644 (file)
@@ -2769,7 +2769,7 @@ void cpufreq_update_limits(unsigned int cpu)
                return;
 
        if (cpufreq_driver->update_limits)
-               cpufreq_driver->update_limits(cpu);
+               cpufreq_driver->update_limits(policy);
        else
                cpufreq_policy_refresh(policy);
 }
index 108e4c6a371ecacf010a5aa13af26d94859d20d8..f5ca04b98b92b9b4e597f10f537b311f616f7aed 100644 (file)
@@ -1353,14 +1353,9 @@ static void intel_pstate_update_policies(void)
                cpufreq_update_policy(cpu);
 }
 
-static bool intel_pstate_update_max_freq(struct cpudata *cpudata)
+static void __intel_pstate_update_max_freq(struct cpufreq_policy *policy,
+                                          struct cpudata *cpudata)
 {
-       struct cpufreq_policy *policy __free(put_cpufreq_policy);
-
-       policy = cpufreq_cpu_get(cpudata->cpu);
-       if (!policy)
-               return false;
-
        guard(cpufreq_policy_write)(policy);
 
        if (hwp_active)
@@ -1370,16 +1365,28 @@ static bool intel_pstate_update_max_freq(struct cpudata *cpudata)
                        cpudata->pstate.max_freq : cpudata->pstate.turbo_freq;
 
        refresh_frequency_limits(policy);
+}
+
+static bool intel_pstate_update_max_freq(struct cpudata *cpudata)
+{
+       struct cpufreq_policy *policy __free(put_cpufreq_policy);
+
+       policy = cpufreq_cpu_get(cpudata->cpu);
+       if (!policy)
+               return false;
+
+       __intel_pstate_update_max_freq(policy, cpudata);
 
        return true;
 }
 
-static void intel_pstate_update_limits(unsigned int cpu)
+static void intel_pstate_update_limits(struct cpufreq_policy *policy)
 {
-       struct cpudata *cpudata = all_cpu_data[cpu];
+       struct cpudata *cpudata = all_cpu_data[policy->cpu];
 
-       if (intel_pstate_update_max_freq(cpudata))
-               hybrid_update_capacity(cpudata);
+       __intel_pstate_update_max_freq(policy, cpudata);
+
+       hybrid_update_capacity(cpudata);
 }
 
 static void intel_pstate_update_limits_for_all(void)
index a33a094ef75593fc61811c58310391cba688ece0..f3cf2adea18f8848fd70c046fb4c660d54751826 100644 (file)
@@ -399,7 +399,7 @@ struct cpufreq_driver {
        unsigned int    (*get)(unsigned int cpu);
 
        /* Called to update policy limits on firmware notifications. */
-       void            (*update_limits)(unsigned int cpu);
+       void            (*update_limits)(struct cpufreq_policy *policy);
 
        /* optional */
        int             (*bios_limit)(int cpu, unsigned int *limit);