Message ID | 20240227073924.3573398-1-li.meng@amd.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 8164f743326404fbe00a721a12efd86b2a8d74d2 |
Headers | show |
Series | cpufreq: amd-pstate: adjust min/max limit perf | expand |
On 2/27/2024 01:39, Meng Li wrote: > The min/max limit perf values calculated based on frequency > may exceed the reasonable range of perf(highest perf, lowest perf). > > Signed-off-by: Meng Li <li.meng@amd.com> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> > --- > drivers/cpufreq/amd-pstate.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c > index aa5e57e27d2b..2015c9fcc3c9 100644 > --- a/drivers/cpufreq/amd-pstate.c > +++ b/drivers/cpufreq/amd-pstate.c > @@ -484,12 +484,19 @@ static int amd_pstate_verify(struct cpufreq_policy_data *policy) > > static int amd_pstate_update_min_max_limit(struct cpufreq_policy *policy) > { > - u32 max_limit_perf, min_limit_perf; > + u32 max_limit_perf, min_limit_perf, lowest_perf; > struct amd_cpudata *cpudata = policy->driver_data; > > max_limit_perf = div_u64(policy->max * cpudata->highest_perf, cpudata->max_freq); > min_limit_perf = div_u64(policy->min * cpudata->highest_perf, cpudata->max_freq); > > + lowest_perf = READ_ONCE(cpudata->lowest_perf); > + if (min_limit_perf < lowest_perf) > + min_limit_perf = lowest_perf; > + > + if (max_limit_perf < min_limit_perf) > + max_limit_perf = min_limit_perf; > + > WRITE_ONCE(cpudata->max_limit_perf, max_limit_perf); > WRITE_ONCE(cpudata->min_limit_perf, min_limit_perf); > WRITE_ONCE(cpudata->max_limit_freq, policy->max); > @@ -1387,6 +1394,12 @@ static void amd_pstate_epp_update_limit(struct cpufreq_policy *policy) > max_limit_perf = div_u64(policy->max * cpudata->highest_perf, cpudata->max_freq); > min_limit_perf = div_u64(policy->min * cpudata->highest_perf, cpudata->max_freq); > > + if (min_limit_perf < min_perf) > + min_limit_perf = min_perf; > + > + if (max_limit_perf < min_limit_perf) > + max_limit_perf = min_limit_perf; > + > WRITE_ONCE(cpudata->max_limit_perf, max_limit_perf); > WRITE_ONCE(cpudata->min_limit_perf, min_limit_perf); >
On Tue, Feb 27, 2024 at 4:36 PM Mario Limonciello <mario.limonciello@amd.com> wrote: > > On 2/27/2024 01:39, Meng Li wrote: > > The min/max limit perf values calculated based on frequency > > may exceed the reasonable range of perf(highest perf, lowest perf). > > > > Signed-off-by: Meng Li <li.meng@amd.com> > Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> Applied as 6.9 material, thanks!
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c index aa5e57e27d2b..2015c9fcc3c9 100644 --- a/drivers/cpufreq/amd-pstate.c +++ b/drivers/cpufreq/amd-pstate.c @@ -484,12 +484,19 @@ static int amd_pstate_verify(struct cpufreq_policy_data *policy) static int amd_pstate_update_min_max_limit(struct cpufreq_policy *policy) { - u32 max_limit_perf, min_limit_perf; + u32 max_limit_perf, min_limit_perf, lowest_perf; struct amd_cpudata *cpudata = policy->driver_data; max_limit_perf = div_u64(policy->max * cpudata->highest_perf, cpudata->max_freq); min_limit_perf = div_u64(policy->min * cpudata->highest_perf, cpudata->max_freq); + lowest_perf = READ_ONCE(cpudata->lowest_perf); + if (min_limit_perf < lowest_perf) + min_limit_perf = lowest_perf; + + if (max_limit_perf < min_limit_perf) + max_limit_perf = min_limit_perf; + WRITE_ONCE(cpudata->max_limit_perf, max_limit_perf); WRITE_ONCE(cpudata->min_limit_perf, min_limit_perf); WRITE_ONCE(cpudata->max_limit_freq, policy->max); @@ -1387,6 +1394,12 @@ static void amd_pstate_epp_update_limit(struct cpufreq_policy *policy) max_limit_perf = div_u64(policy->max * cpudata->highest_perf, cpudata->max_freq); min_limit_perf = div_u64(policy->min * cpudata->highest_perf, cpudata->max_freq); + if (min_limit_perf < min_perf) + min_limit_perf = min_perf; + + if (max_limit_perf < min_limit_perf) + max_limit_perf = min_limit_perf; + WRITE_ONCE(cpudata->max_limit_perf, max_limit_perf); WRITE_ONCE(cpudata->min_limit_perf, min_limit_perf);
The min/max limit perf values calculated based on frequency may exceed the reasonable range of perf(highest perf, lowest perf). Signed-off-by: Meng Li <li.meng@amd.com> --- drivers/cpufreq/amd-pstate.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)