| From stable+bounces-177948-greg=kroah.com@vger.kernel.org Sat Sep 6 15:12:30 2025 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 6 Sep 2025 09:12:21 -0400 |
| Subject: cpufreq: intel_pstate: Revise global turbo disable check |
| To: stable@vger.kernel.org |
| Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>, "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>, Sasha Levin <sashal@kernel.org> |
| Message-ID: <20250906131224.3883544-1-sashal@kernel.org> |
| |
| From: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> |
| |
| [ Upstream commit 37b6ddba967c601479bea418a7ac6ff16b6232b7 ] |
| |
| Setting global turbo flag based on CPU 0 P-state limits is problematic |
| as it limits max P-state request on every CPU on the system just based |
| on its P-state limits. |
| |
| There are two cases in which global.turbo_disabled flag is set: |
| - When the MSR_IA32_MISC_ENABLE_TURBO_DISABLE bit is set to 1 |
| in the MSR MSR_IA32_MISC_ENABLE. This bit can be only changed by |
| the system BIOS before power up. |
| - When the max non turbo P-state is same as max turbo P-state for CPU 0. |
| |
| The second check is not a valid to decide global turbo state based on |
| the CPU 0. CPU 0 max turbo P-state can be same as max non turbo P-state, |
| but for other CPUs this may not be true. |
| |
| There is no guarantee that max P-state limits are same for every CPU. This |
| is possible that during fusing max P-state for a CPU is constrained. Also |
| with the Intel Speed Select performance profile, CPU 0 may not be present |
| in all profiles. In this case the max non turbo and turbo P-state can be |
| set to the lowest possible P-state by the hardware when switched to |
| such profile. Since max non turbo and turbo P-state is same, |
| global.turbo_disabled flag will be set. |
| |
| Once global.turbo_disabled is set, any scaling max and min frequency |
| update for any CPU will result in its max P-state constrained to the max |
| non turbo P-state. |
| |
| Hence remove the check of max non turbo P-state equal to max turbo P-state |
| of CPU 0 to set global turbo disabled flag. |
| |
| Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> |
| [ rjw: Subject edit ] |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Stable-dep-of: ac4e04d9e378 ("cpufreq: intel_pstate: Unchecked MSR aceess in legacy mode") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/cpufreq/intel_pstate.c | 6 +----- |
| 1 file changed, 1 insertion(+), 5 deletions(-) |
| |
| --- a/drivers/cpufreq/intel_pstate.c |
| +++ b/drivers/cpufreq/intel_pstate.c |
| @@ -595,13 +595,9 @@ static void intel_pstate_hybrid_hwp_adju |
| static inline void update_turbo_state(void) |
| { |
| u64 misc_en; |
| - struct cpudata *cpu; |
| |
| - cpu = all_cpu_data[0]; |
| rdmsrl(MSR_IA32_MISC_ENABLE, misc_en); |
| - global.turbo_disabled = |
| - (misc_en & MSR_IA32_MISC_ENABLE_TURBO_DISABLE || |
| - cpu->pstate.max_pstate == cpu->pstate.turbo_pstate); |
| + global.turbo_disabled = misc_en & MSR_IA32_MISC_ENABLE_TURBO_DISABLE; |
| } |
| |
| static int min_perf_pct_min(void) |