diff mbox series

cpufreq: intel_pstate: Fix unchecked HWP MSR access

Message ID 20240531230004.1334127-1-srinivas.pandruvada@linux.intel.com
State Accepted
Commit 1e24c31351787e24b7eebe84866bd55fd62a0aef
Headers show
Series cpufreq: intel_pstate: Fix unchecked HWP MSR access | expand

Commit Message

Srinivas Pandruvada May 31, 2024, 11 p.m. UTC
Fix unchecked MSR access error for processors with no HWP support. On
such processors, maximum frequency can be changed by the system firmware
using ACPI event ACPI_PROCESSOR_NOTIFY_HIGEST_PERF_CHANGED. This results
in accessing HWP MSR 0x771.

Call Trace:
	<TASK>
	generic_exec_single+0x58/0x120
	smp_call_function_single+0xbf/0x110
	rdmsrl_on_cpu+0x46/0x60
	intel_pstate_get_hwp_cap+0x1b/0x70
	intel_pstate_update_limits+0x2a/0x60
	acpi_processor_notify+0xb7/0x140
	acpi_ev_notify_dispatch+0x3b/0x60

HWP MSR 0x771 can be only read on a CPU which supports HWP and enabled.
Hence intel_pstate_get_hwp_cap() can only be called when hwp_active is
true.

Reported-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Closes: https://lore.kernel.org/linux-pm/20240529155740.Hq2Hw7be@linutronix.de/
Fixes: e8217b4bece3 ("cpufreq: intel_pstate: Update the maximum CPU frequency consistently")
Tested-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
 drivers/cpufreq/intel_pstate.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Rafael J. Wysocki June 3, 2024, 4:03 p.m. UTC | #1
On Sat, Jun 1, 2024 at 1:00 AM Srinivas Pandruvada
<srinivas.pandruvada@linux.intel.com> wrote:
>
> Fix unchecked MSR access error for processors with no HWP support. On
> such processors, maximum frequency can be changed by the system firmware
> using ACPI event ACPI_PROCESSOR_NOTIFY_HIGEST_PERF_CHANGED. This results
> in accessing HWP MSR 0x771.
>
> Call Trace:
>         <TASK>
>         generic_exec_single+0x58/0x120
>         smp_call_function_single+0xbf/0x110
>         rdmsrl_on_cpu+0x46/0x60
>         intel_pstate_get_hwp_cap+0x1b/0x70
>         intel_pstate_update_limits+0x2a/0x60
>         acpi_processor_notify+0xb7/0x140
>         acpi_ev_notify_dispatch+0x3b/0x60
>
> HWP MSR 0x771 can be only read on a CPU which supports HWP and enabled.
> Hence intel_pstate_get_hwp_cap() can only be called when hwp_active is
> true.
>
> Reported-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Closes: https://lore.kernel.org/linux-pm/20240529155740.Hq2Hw7be@linutronix.de/
> Fixes: e8217b4bece3 ("cpufreq: intel_pstate: Update the maximum CPU frequency consistently")
> Tested-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> ---
>  drivers/cpufreq/intel_pstate.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
> index 4b986c044741..65d3f79104bd 100644
> --- a/drivers/cpufreq/intel_pstate.c
> +++ b/drivers/cpufreq/intel_pstate.c
> @@ -1153,7 +1153,8 @@ static void intel_pstate_update_policies(void)
>  static void __intel_pstate_update_max_freq(struct cpudata *cpudata,
>                                            struct cpufreq_policy *policy)
>  {
> -       intel_pstate_get_hwp_cap(cpudata);
> +       if (hwp_active)
> +               intel_pstate_get_hwp_cap(cpudata);
>
>         policy->cpuinfo.max_freq = READ_ONCE(global.no_turbo) ?
>                         cpudata->pstate.max_freq : cpudata->pstate.turbo_freq;
> --

Applied as 6.10-rc material, thanks!
diff mbox series

Patch

diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
index 4b986c044741..65d3f79104bd 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -1153,7 +1153,8 @@  static void intel_pstate_update_policies(void)
 static void __intel_pstate_update_max_freq(struct cpudata *cpudata,
 					   struct cpufreq_policy *policy)
 {
-	intel_pstate_get_hwp_cap(cpudata);
+	if (hwp_active)
+		intel_pstate_get_hwp_cap(cpudata);
 
 	policy->cpuinfo.max_freq = READ_ONCE(global.no_turbo) ?
 			cpudata->pstate.max_freq : cpudata->pstate.turbo_freq;