[PATCH] cpufreq/amd-pstate: Fix min_limit perf and freq updation for performance governor

Dhananjay Ugwekar posted 1 patch 10 months ago
drivers/cpufreq/amd-pstate.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
[PATCH] cpufreq/amd-pstate: Fix min_limit perf and freq updation for performance governor
Posted by Dhananjay Ugwekar 10 months ago
The min_limit perf and freq values can get disconnected with performance
governor, as we only modify the perf value in the special case. Fix that
by modifying the perf and freq values together

Fixes: 009d1c29a451 ("cpufreq/amd-pstate: Move perf values into a union")
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
---
 drivers/cpufreq/amd-pstate.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index 024d33d5e367..76aa4a3698c3 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -607,13 +607,16 @@ static void amd_pstate_update_min_max_limit(struct cpufreq_policy *policy)
 	union perf_cached perf = READ_ONCE(cpudata->perf);
 
 	perf.max_limit_perf = freq_to_perf(perf, cpudata->nominal_freq, policy->max);
-	perf.min_limit_perf = freq_to_perf(perf, cpudata->nominal_freq, policy->min);
+	WRITE_ONCE(cpudata->max_limit_freq, policy->max);
 
-	if (cpudata->policy == CPUFREQ_POLICY_PERFORMANCE)
+	if (cpudata->policy == CPUFREQ_POLICY_PERFORMANCE) {
 		perf.min_limit_perf = min(perf.nominal_perf, perf.max_limit_perf);
+		WRITE_ONCE(cpudata->min_limit_freq, min(cpudata->nominal_freq, cpudata->max_limit_freq));
+	} else {
+		perf.min_limit_perf = freq_to_perf(perf, cpudata->nominal_freq, policy->min);
+		WRITE_ONCE(cpudata->min_limit_freq, policy->min);
+	}
 
-	WRITE_ONCE(cpudata->max_limit_freq, policy->max);
-	WRITE_ONCE(cpudata->min_limit_freq, policy->min);
 	WRITE_ONCE(cpudata->perf, perf);
 }
 
-- 
2.34.1
Re: [PATCH] cpufreq/amd-pstate: Fix min_limit perf and freq updation for performance governor
Posted by Mario Limonciello 10 months ago
On 4/7/2025 3:19 AM, Dhananjay Ugwekar wrote:
> The min_limit perf and freq values can get disconnected with performance
> governor, as we only modify the perf value in the special case. Fix that
> by modifying the perf and freq values together
> 
> Fixes: 009d1c29a451 ("cpufreq/amd-pstate: Move perf values into a union")
> Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>

Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>

Thanks!  I'll get this added to bleeding-edge and move it to fixes in a 
few days.

> ---
>   drivers/cpufreq/amd-pstate.c | 11 +++++++----
>   1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
> index 024d33d5e367..76aa4a3698c3 100644
> --- a/drivers/cpufreq/amd-pstate.c
> +++ b/drivers/cpufreq/amd-pstate.c
> @@ -607,13 +607,16 @@ static void amd_pstate_update_min_max_limit(struct cpufreq_policy *policy)
>   	union perf_cached perf = READ_ONCE(cpudata->perf);
>   
>   	perf.max_limit_perf = freq_to_perf(perf, cpudata->nominal_freq, policy->max);
> -	perf.min_limit_perf = freq_to_perf(perf, cpudata->nominal_freq, policy->min);
> +	WRITE_ONCE(cpudata->max_limit_freq, policy->max);
>   
> -	if (cpudata->policy == CPUFREQ_POLICY_PERFORMANCE)
> +	if (cpudata->policy == CPUFREQ_POLICY_PERFORMANCE) {
>   		perf.min_limit_perf = min(perf.nominal_perf, perf.max_limit_perf);
> +		WRITE_ONCE(cpudata->min_limit_freq, min(cpudata->nominal_freq, cpudata->max_limit_freq));
> +	} else {
> +		perf.min_limit_perf = freq_to_perf(perf, cpudata->nominal_freq, policy->min);
> +		WRITE_ONCE(cpudata->min_limit_freq, policy->min);
> +	}
>   
> -	WRITE_ONCE(cpudata->max_limit_freq, policy->max);
> -	WRITE_ONCE(cpudata->min_limit_freq, policy->min);
>   	WRITE_ONCE(cpudata->perf, perf);
>   }
>