[PATCH v2 0/2] x86/mce: Fix timer list corruption and avoid redundant polling

From: Aaron Tomlin

Date: Tue Sep 01 2026 - 22:03:10 EST


This series addresses two distinct issues within the x86 Machine Check
Architecture (MCA) timer subsystem: a race condition during runtime CPU
reconfiguration that can corrupt the kernel timer wheel, and redundant
periodic software polling of banks that never log corrected errors.

Patch 1 fixes a concurrency race between sysfs configuration updates
(mce_restart()) and asynchronous CMCI interrupts. When mce_restart() runs,
a concurrent CMCI interrupt can arm mce_timer on a remote CPU before the
restart IPI arrives. By removing the redundant timer_setup() call from
__mcheck_cpu_init_timer(), Patch 1 ensures that mce_timer descriptors are
not re-initialised while actively linked in the timer wheel, avoiding
potential linked-list corruption and kernel crashes.

Patch 2 implements Tony Luck's suggested approach by recognising that banks
without CMCI support on modern Intel platforms (such as the PCU bank) never
report corrected or UCNA errors (per Intel SDM Vol 3B §18.5). It clears
these non-CMCI banks from mce_poll_banks and ensures mce_timer is never
armed when mce_poll_banks is empty. Additionally, it integrates a
housekeeping check (HK_TYPE_TIMER) so that on legacy platforms or
polling-only configurations where mce_poll_banks is non-empty, routine
polling is restricted to housekeeping CPUs, sparing isolated nohz_full
cores from timer interrupts. This eliminates polling timer jitter across
all CPUs in steady state on modern hardware while preserving full polling
capabilities and isolation guarantees.

Thank you.

Changes since v1:

- Fixed a pre-existing race condition in mce_restart() by removing the
redundant timer_setup() call in __mcheck_cpu_init_timer(), preventing
active timer wheel linked-list corruption

- Non-CMCI banks are cleared from mce_poll_banks in cmci_claim_bank(),
and should_enable_timer() verifies bitmap_empty(mce_poll_banks) before
checking HK_TYPE_TIMER

- Link to v1: https://lore.kernel.org/lkml/20260901151138.132950-1-atomlin@xxxxxxxxxxx/

Aaron Tomlin (2):
x86/mce: Do not reinitialise mce_timer structure on CPU restart
x86/mce: Avoid arming periodic polling timer when not required

arch/x86/kernel/cpu/mce/core.c | 8 +++++++-
arch/x86/kernel/cpu/mce/intel.c | 11 ++++++-----
2 files changed, 13 insertions(+), 6 deletions(-)

--
2.55.0