Re: problem in changing from active to passive mode

From: Rafael J. Wysocki
Date: Thu Oct 28 2021 - 13:57:28 EST


On Thu, Oct 28, 2021 at 7:29 PM Rafael J. Wysocki <rafael@xxxxxxxxxx> wrote:
>
> On Thu, Oct 28, 2021 at 7:10 PM Julia Lawall <julia.lawall@xxxxxxxx> wrote:
> >
> > > Now, for your graph 3, are you saying this pseudo
> > > code of the process is repeatable?:
> > >
> > > Power up the system, booting kernel 5.9
> > > switch to passive/schedutil.
> > > wait X minutes for system to settle
> > > do benchmark, result ~13 seconds
> > > re-boot to kernel 5.15-RC
> > > switch to passive/schedutil.
> > > wait X minutes for system to settle
> > > do benchmark, result ~40 seconds
> > > re-boot to kernel 5.9
> > > switch to passive/schedutil.
> > > wait X minutes for system to settle
> > > do benchmark, result ~28 seconds
> >
> > In the first boot of 5.9, the des (desired?) field of the HWP_REQUEST
> > register is 0 and in the second boot (after booting 5.15 and entering
> > passive mode) it is 10. I don't know though if this is a bug or a
> > feature...
>
> It looks like a bug.
>
> I think that the desired value is not cleared on driver exit which
> should happen. Let me see if I can do a quick patch for that.

Please check the behavior with the attached patch applied.
---
drivers/cpufreq/intel_pstate.c | 3 +++
1 file changed, 3 insertions(+)

Index: linux-pm/drivers/cpufreq/intel_pstate.c
===================================================================
--- linux-pm.orig/drivers/cpufreq/intel_pstate.c
+++ linux-pm/drivers/cpufreq/intel_pstate.c
@@ -1015,6 +1015,9 @@ static void intel_pstate_hwp_offline(str
value |= HWP_MAX_PERF(min_perf);
value |= HWP_MIN_PERF(min_perf);

+ /* Clear DESIRED_PERF */
+ value &= ~HWP_DESIRED_PERF(~0L);
+
/* Set EPP to min */
if (boot_cpu_has(X86_FEATURE_HWP_EPP))
value |= HWP_ENERGY_PERF_PREFERENCE(HWP_EPP_POWERSAVE);