Re: [PATCH] intel_idle: Handle older CPUs, which stop the TSC in deeper C states, correctly

Rafael J. Wysocki
2025-02-26T10:24:31Z

On Tue, Feb 25, 2025 at 11:37 PM Thomas Gleixner <tglx@linutronix.de> wrote:
>
> The Intel idle driver is preferred over the ACPI processor idle driver,
> but fails to implement the work around for Core2 generation CPUs, where
> the TSC stops in C2 and deeper C-states. This causes stalls and boot
> delays, when the clocksource watchdog does not catch the unstable TSC
> before the CPU goes deep idle for the first time.
>
> The ACPI driver marks the TSC unstable when it detects that the CPU
> supports C2 or deeper and the CPU does not have a non-stop TSC.
>
> Add the equivivalent work around to the Intel idle driver to cure that.
>
> Fixes: 18734958e9bf ("intel_idle: Use ACPI _CST for processor models without C-state tables")
> Reported-by: Fab Stz <fabstz-it@yahoo.fr>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Tested-by: Fab Stz <fabstz-it@yahoo.fr>
> Cc: stable@vger.kernel.org
> Closes: https://lore.kernel.org/all/10cf96aa-1276-4bd4-8966-c890377030c3@yahoo.fr
> ---
> drivers/idle/intel_idle.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> --- a/drivers/idle/intel_idle.c
> +++ b/drivers/idle/intel_idle.c
> @@ -56,6 +56,7 @@
> #include <asm/intel-family.h>
> #include <asm/mwait.h>
> #include <asm/spec-ctrl.h>
> +#include <asm/tsc.h>
> #include <asm/fpu/api.h>
>
> #define INTEL_IDLE_VERSION "0.5.1"
> @@ -1799,6 +1800,9 @@ static void __init intel_idle_init_cstat
> if (intel_idle_state_needs_timer_stop(state))
> state->flags |= CPUIDLE_FLAG_TIMER_STOP;
>
> + if (cx->type > ACPI_STATE_C1 && !boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
> + mark_tsc_unstable("TSC halts in idle");
> +
> state->enter = intel_idle;
> state->enter_s2idle = intel_idle_s2idle;
> }

Applied as a fix for 6.14-rc5, thank you!