]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/mce: Handle AMD threshold interrupt storms
authorSmita Koralahalli <Smita.KoralahalliChannabasappa@amd.com>
Fri, 21 Nov 2025 19:04:05 +0000 (19:04 +0000)
committerBorislav Petkov (AMD) <bp@alien8.de>
Fri, 21 Nov 2025 19:41:10 +0000 (20:41 +0100)
Extend the logic of handling CMCI storms to AMD threshold interrupts.

Rely on the similar approach as of Intel's CMCI to mitigate storms per CPU and
per bank. But, unlike CMCI, do not set thresholds and reduce interrupt rate on
a storm. Rather, disable the interrupt on the corresponding CPU and bank.
Re-enable back the interrupts if enough consecutive polls of the bank show no
corrected errors (30, as programmed by Intel).

Turning off the threshold interrupts would be a better solution on AMD systems
as other error severities will still be handled even if the threshold
interrupts are disabled.

  [ Tony: Small tweak because mce_handle_storm() isn't a pointer now ]
  [ Yazen: Rebase and simplify ]
  [ Avadhut: Remove check to not clear bank's bit in mce_poll_banks and fix
    checkpatch warnings. ]

Signed-off-by: Smita Koralahalli <Smita.KoralahalliChannabasappa@amd.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
Signed-off-by: Avadhut Naik <avadhut.naik@amd.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://patch.msgid.link/20251121190542.2447913-3-avadhut.naik@amd.com
arch/x86/kernel/cpu/mce/amd.c
arch/x86/kernel/cpu/mce/internal.h
arch/x86/kernel/cpu/mce/threshold.c

index 5c3287a46c8f4605fdbd75db603fa641289e0563..3f1dda355307590f259d629870ff4bd72e887ebc 100644 (file)
@@ -852,6 +852,11 @@ static void amd_deferred_error_interrupt(void)
        machine_check_poll(MCP_TIMESTAMP, &this_cpu_ptr(&mce_amd_data)->dfr_intr_banks);
 }
 
+void mce_amd_handle_storm(unsigned int bank, bool on)
+{
+       threshold_restart_bank(bank, on);
+}
+
 static void amd_reset_thr_limit(unsigned int bank)
 {
        threshold_restart_bank(bank, true);
index 4cf16fa7c2607aee8770873658365e63b1e3cbdb..a31cf984619ca81fc891fcf88487dd44f8be41b9 100644 (file)
@@ -269,6 +269,7 @@ void mce_prep_record_per_cpu(unsigned int cpu, struct mce *m);
 #ifdef CONFIG_X86_MCE_AMD
 void mce_threshold_create_device(unsigned int cpu);
 void mce_threshold_remove_device(unsigned int cpu);
+void mce_amd_handle_storm(unsigned int bank, bool on);
 extern bool amd_filter_mce(struct mce *m);
 bool amd_mce_usable_address(struct mce *m);
 void amd_clear_bank(struct mce *m);
@@ -301,6 +302,7 @@ void smca_bsp_init(void);
 #else
 static inline void mce_threshold_create_device(unsigned int cpu)       { }
 static inline void mce_threshold_remove_device(unsigned int cpu)       { }
+static inline void mce_amd_handle_storm(unsigned int bank, bool on)    { }
 static inline bool amd_filter_mce(struct mce *m) { return false; }
 static inline bool amd_mce_usable_address(struct mce *m) { return false; }
 static inline void amd_clear_bank(struct mce *m) { }
index f19dd5bc29691cbd5286c479b795a1fa8f25b091..0d13c9ffcba00554542c38734d17bdf62cc1d61f 100644 (file)
@@ -76,6 +76,9 @@ static void mce_handle_storm(unsigned int bank, bool on)
        case X86_VENDOR_INTEL:
                mce_intel_handle_storm(bank, on);
                break;
+       case X86_VENDOR_AMD:
+               mce_amd_handle_storm(bank, on);
+               break;
        }
 }