ACK: [SRU][H, I][PATCH 1/1] cpufreq: intel_pstate: Clear HWP desired on suspend/shutdown and offline
Stefan Bader
stefan.bader at canonical.com
Fri Nov 19 08:35:52 UTC 2021
On 17.11.21 20:44, Philip Cox wrote:
> From: "Rafael J. Wysocki" <rafael.j.wysocki at intel.com>
>
> BugLink: https://bugs.launchpad.net/bugs/1950584
>
> Commit a365ab6b9dfb ("cpufreq: intel_pstate: Implement the
> ->adjust_perf() callback") caused intel_pstate to use nonzero HWP
> desired values in certain usage scenarios, but it did not prevent
> them from being leaked into the confugirations in which HWP desired
> is expected to be 0.
>
> The failing scenarios are switching the driver from the passive
> mode to the active mode and starting a new kernel via kexec() while
> intel_pstate is running in the passive mode.
>
> To address this issue, ensure that HWP desired will be cleared on
> offline and suspend/shutdown.
>
> Fixes: a365ab6b9dfb ("cpufreq: intel_pstate: Implement the ->adjust_perf() callback")
> Reported-by: Julia Lawall <julia.lawall at inria.fr>
> Tested-by: Julia Lawall <julia.lawall at inria.fr>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
> (cherry picked from commit dbea75fe18f60e364de6d994fc938a24ba249d81)
> Signed-off-by: Philip Cox <philip.cox at canonical.com>
Acked-by: Stefan Bader <stefan.bader at canonical.com>
> ---
> drivers/cpufreq/intel_pstate.c | 32 ++++++++++++++++++++++++++++++--
> 1 file changed, 30 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
> index d483383dcfb9..d2089adcebc3 100644
> --- a/drivers/cpufreq/intel_pstate.c
> +++ b/drivers/cpufreq/intel_pstate.c
> @@ -910,9 +910,16 @@ static void intel_pstate_hwp_offline(struct cpudata *cpu)
> */
> value &= ~GENMASK_ULL(31, 24);
> value |= HWP_ENERGY_PERF_PREFERENCE(cpu->epp_cached);
> - WRITE_ONCE(cpu->hwp_req_cached, value);
> }
>
> + /*
> + * Clear the desired perf field in the cached HWP request value to
> + * prevent nonzero desired values from being leaked into the active
> + * mode.
> + */
> + value &= ~HWP_DESIRED_PERF(~0L);
> + WRITE_ONCE(cpu->hwp_req_cached, value);
> +
> value &= ~GENMASK_ULL(31, 0);
> min_perf = HWP_LOWEST_PERF(cpu->hwp_cap_cached);
>
> @@ -2766,6 +2773,27 @@ static int intel_cpufreq_cpu_exit(struct cpufreq_policy *policy)
> return intel_pstate_cpu_exit(policy);
> }
>
> +static int intel_cpufreq_suspend(struct cpufreq_policy *policy)
> +{
> + intel_pstate_suspend(policy);
> +
> + if (hwp_active) {
> + struct cpudata *cpu = all_cpu_data[policy->cpu];
> + u64 value = READ_ONCE(cpu->hwp_req_cached);
> +
> + /*
> + * Clear the desired perf field in MSR_HWP_REQUEST in case
> + * intel_cpufreq_adjust_perf() is in use and the last value
> + * written by it may not be suitable.
> + */
> + value &= ~HWP_DESIRED_PERF(~0L);
> + wrmsrl_on_cpu(cpu->cpu, MSR_HWP_REQUEST, value);
> + WRITE_ONCE(cpu->hwp_req_cached, value);
> + }
> +
> + return 0;
> +}
> +
> static struct cpufreq_driver intel_cpufreq = {
> .flags = CPUFREQ_CONST_LOOPS,
> .verify = intel_cpufreq_verify_policy,
> @@ -2775,7 +2803,7 @@ static struct cpufreq_driver intel_cpufreq = {
> .exit = intel_cpufreq_cpu_exit,
> .offline = intel_pstate_cpu_offline,
> .online = intel_pstate_cpu_online,
> - .suspend = intel_pstate_suspend,
> + .suspend = intel_cpufreq_suspend,
> .resume = intel_pstate_resume,
> .update_limits = intel_pstate_update_limits,
> .name = "intel_cpufreq",
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20211119/483bbe36/attachment-0001.sig>
More information about the kernel-team
mailing list