90 lines
2.9 KiB
Diff
90 lines
2.9 KiB
Diff
From 34925ac1038d19197f0a2ac8574496e77645fdf5 Mon Sep 17 00:00:00 2001
|
|
From: Mario Limonciello <mario.limonciello@amd.com>
|
|
Date: Wed, 26 Feb 2025 01:49:20 -0600
|
|
Subject: cpufreq/amd-pstate: Overhaul locking
|
|
|
|
amd_pstate_cpu_boost_update() and refresh_frequency_limits() both
|
|
update the policy state and have nothing to do with the amd-pstate
|
|
driver itself.
|
|
|
|
A global "limits" lock doesn't make sense because each CPU can have
|
|
policies changed independently. Each time a CPU changes values they
|
|
will atomically be written to the per-CPU perf member. Drop per CPU
|
|
locking cases.
|
|
|
|
The remaining "global" driver lock is used to ensure that only one
|
|
entity can change driver modes at a given time.
|
|
|
|
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
|
|
Reviewed-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
|
|
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
|
---
|
|
drivers/cpufreq/amd-pstate.c | 13 +++----------
|
|
1 file changed, 3 insertions(+), 10 deletions(-)
|
|
|
|
--- a/drivers/cpufreq/amd-pstate.c
|
|
+++ b/drivers/cpufreq/amd-pstate.c
|
|
@@ -196,7 +196,6 @@ static inline int get_mode_idx_from_str(
|
|
return -EINVAL;
|
|
}
|
|
|
|
-static DEFINE_MUTEX(amd_pstate_limits_lock);
|
|
static DEFINE_MUTEX(amd_pstate_driver_lock);
|
|
|
|
static u8 msr_get_epp(struct amd_cpudata *cpudata)
|
|
@@ -752,7 +751,6 @@ static int amd_pstate_set_boost(struct c
|
|
pr_err("Boost mode is not supported by this processor or SBIOS\n");
|
|
return -EOPNOTSUPP;
|
|
}
|
|
- guard(mutex)(&amd_pstate_driver_lock);
|
|
|
|
ret = amd_pstate_cpu_boost_update(policy, state);
|
|
refresh_frequency_limits(policy);
|
|
@@ -1170,8 +1168,6 @@ static ssize_t store_energy_performance_
|
|
if (ret < 0)
|
|
return -EINVAL;
|
|
|
|
- guard(mutex)(&amd_pstate_limits_lock);
|
|
-
|
|
ret = amd_pstate_set_energy_pref_index(policy, ret);
|
|
|
|
return ret ? ret : count;
|
|
@@ -1344,8 +1340,10 @@ int amd_pstate_update_status(const char
|
|
if (mode_idx < 0 || mode_idx >= AMD_PSTATE_MAX)
|
|
return -EINVAL;
|
|
|
|
- if (mode_state_machine[cppc_state][mode_idx])
|
|
+ if (mode_state_machine[cppc_state][mode_idx]) {
|
|
+ guard(mutex)(&amd_pstate_driver_lock);
|
|
return mode_state_machine[cppc_state][mode_idx](mode_idx);
|
|
+ }
|
|
|
|
return 0;
|
|
}
|
|
@@ -1366,7 +1364,6 @@ static ssize_t status_store(struct devic
|
|
char *p = memchr(buf, '\n', count);
|
|
int ret;
|
|
|
|
- guard(mutex)(&amd_pstate_driver_lock);
|
|
ret = amd_pstate_update_status(buf, p ? p - buf : count);
|
|
|
|
return ret < 0 ? ret : count;
|
|
@@ -1638,8 +1635,6 @@ static int amd_pstate_epp_cpu_offline(st
|
|
if (cpudata->suspended)
|
|
return 0;
|
|
|
|
- guard(mutex)(&amd_pstate_limits_lock);
|
|
-
|
|
if (trace_amd_pstate_epp_perf_enabled()) {
|
|
trace_amd_pstate_epp_perf(cpudata->cpu, perf.highest_perf,
|
|
AMD_CPPC_EPP_BALANCE_POWERSAVE,
|
|
@@ -1679,8 +1674,6 @@ static int amd_pstate_epp_resume(struct
|
|
struct amd_cpudata *cpudata = policy->driver_data;
|
|
|
|
if (cpudata->suspended) {
|
|
- guard(mutex)(&amd_pstate_limits_lock);
|
|
-
|
|
/* enable amd pstate from suspend state*/
|
|
amd_pstate_epp_reenable(policy);
|
|
|