aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/intel_pstate.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2025-03-28 21:48:54 +0100
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2025-04-09 21:22:18 +0200
commiteaff6b62d3439ca6ee00dba4f77673a8c37dac20 (patch)
tree7b708d66abf301f1befbf3df36a50a48673318a2 /drivers/cpufreq/intel_pstate.c
parentcpufreq: Introduce cpufreq_policy_refresh() (diff)
downloadlinux-eaff6b62d3439ca6ee00dba4f77673a8c37dac20.tar.gz
linux-eaff6b62d3439ca6ee00dba4f77673a8c37dac20.zip
cpufreq: Pass policy pointer to ->update_limits()
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
Diffstat (limited to 'drivers/cpufreq/intel_pstate.c')
-rw-r--r--drivers/cpufreq/intel_pstate.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
index 108e4c6a371e..f5ca04b98b92 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -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)