diff mbox series

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

Message ID 20250407081925.850473-1-dhananjay.ugwekar@amd.com (mailing list archive)
State New
Delegated to: Mario Limonciello
Headers show
Series cpufreq/amd-pstate: Fix min_limit perf and freq updation for performance governor | expand

Commit Message

Dhananjay Ugwekar April 7, 2025, 8:19 a.m. UTC
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(-)

Comments

Mario Limonciello April 7, 2025, 1:25 p.m. UTC | #1
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);
>   }
>
diff mbox series

Patch

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);
 }