public inbox for linux-edac@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86/mce: Fix timer interval adjustment after logging a MCE event
@ 2026-01-12  8:27 lirongqing
  2026-01-12  8:56 ` Nikolay Borisov
  0 siblings, 1 reply; 40+ messages in thread
From: lirongqing @ 2026-01-12  8:27 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
	H . Peter Anvin, Tony Luck, Yazen Ghannam, Nikolay Borisov,
	Qiuxu Zhuo, Avadhut Naik, linux-kernel, linux-edac
  Cc: Li RongQing

From: Li RongQing <lirongqing@baidu.com>

Since commit 011d82611172 ("RAS: Add a Corrected Errors Collector"),
mce_notify_irq() in should_enable_timer() always returns false even
when an MCE event is logged, because bit 0 of mce_need_notify is not
set in mce_log. This prevents the timer interval from being properly
adjusted.

Fix this by modifying machine_check_poll() to return a boolean indicating
whether an MCE was logged, and update mc_poll_banks() to propagate this
return value. The timer interval logic in mce_timer_fn() now uses this
return value directly instead of relying on mce_notify_irq().

Fixes: 011d82611172 ("RAS: Add a Corrected Errors Collector")
Signed-off-by: Li RongQing <lirongqing@baidu.com>
---
 arch/x86/include/asm/mce.h         |  2 +-
 arch/x86/kernel/cpu/mce/core.c     | 17 +++++++++++------
 arch/x86/kernel/cpu/mce/intel.c    |  8 ++++++--
 arch/x86/kernel/cpu/mce/internal.h |  2 +-
 4 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
index 2d98886..fb9eab4 100644
--- a/arch/x86/include/asm/mce.h
+++ b/arch/x86/include/asm/mce.h
@@ -303,7 +303,7 @@ enum mcp_flags {
 	MCP_QUEUE_LOG	= BIT(2),	/* only queue to genpool */
 };
 
-void machine_check_poll(enum mcp_flags flags, mce_banks_t *b);
+bool machine_check_poll(enum mcp_flags flags, mce_banks_t *b);
 
 DECLARE_PER_CPU(struct mce, injectm);
 
diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c
index 3444002..8d42691 100644
--- a/arch/x86/kernel/cpu/mce/core.c
+++ b/arch/x86/kernel/cpu/mce/core.c
@@ -813,10 +813,11 @@ static void clear_bank(struct mce *m)
  * is already totally * confused. In this case it's likely it will
  * not fully execute the machine check handler either.
  */
-void machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
+bool machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
 {
 	struct mce_bank *mce_banks = this_cpu_ptr(mce_banks_array);
 	struct mce_hw_err err;
+	bool logged = false;
 	struct mce *m;
 	int i;
 
@@ -868,6 +869,7 @@ void machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
 		else
 			mce_log(&err);
 
+		logged = true;
 clear_it:
 		clear_bank(m);
 	}
@@ -878,6 +880,8 @@ void machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
 	 */
 
 	sync_core();
+
+	return logged;
 }
 EXPORT_SYMBOL_GPL(machine_check_poll);
 
@@ -1776,12 +1780,12 @@ static void __start_timer(struct timer_list *t, unsigned long interval)
 	local_irq_restore(flags);
 }
 
-static void mc_poll_banks_default(void)
+static bool mc_poll_banks_default(void)
 {
-	machine_check_poll(0, this_cpu_ptr(&mce_poll_banks));
+	return machine_check_poll(0, this_cpu_ptr(&mce_poll_banks));
 }
 
-void (*mc_poll_banks)(void) = mc_poll_banks_default;
+bool (*mc_poll_banks)(void) = mc_poll_banks_default;
 
 static bool should_enable_timer(unsigned long iv)
 {
@@ -1792,19 +1796,20 @@ static void mce_timer_fn(struct timer_list *t)
 {
 	struct timer_list *cpu_t = this_cpu_ptr(&mce_timer);
 	unsigned long iv;
+	bool logged = false;
 
 	WARN_ON(cpu_t != t);
 
 	iv = __this_cpu_read(mce_next_interval);
 
 	if (mce_available(this_cpu_ptr(&cpu_info)))
-		mc_poll_banks();
+		logged = mc_poll_banks();
 
 	/*
 	 * Alert userspace if needed. If we logged an MCE, reduce the polling
 	 * interval, otherwise increase the polling interval.
 	 */
-	if (mce_notify_irq())
+	if (logged)
 		iv = max(iv / 2, (unsigned long) HZ/100);
 	else
 		iv = min(iv * 2, round_jiffies_relative(check_interval * HZ));
diff --git a/arch/x86/kernel/cpu/mce/intel.c b/arch/x86/kernel/cpu/mce/intel.c
index 4655223..a3d2730 100644
--- a/arch/x86/kernel/cpu/mce/intel.c
+++ b/arch/x86/kernel/cpu/mce/intel.c
@@ -395,11 +395,15 @@ void cmci_disable_bank(int bank)
 }
 
 /* Bank polling function when CMCI is disabled. */
-static void cmci_mc_poll_banks(void)
+static bool cmci_mc_poll_banks(void)
 {
+	bool logged;
+
 	spin_lock(&cmci_poll_lock);
-	machine_check_poll(0, this_cpu_ptr(&mce_poll_banks));
+	logged = machine_check_poll(0, this_cpu_ptr(&mce_poll_banks));
 	spin_unlock(&cmci_poll_lock);
+
+	return logged;
 }
 
 void intel_init_cmci(void)
diff --git a/arch/x86/kernel/cpu/mce/internal.h b/arch/x86/kernel/cpu/mce/internal.h
index a31cf98..7bf2360 100644
--- a/arch/x86/kernel/cpu/mce/internal.h
+++ b/arch/x86/kernel/cpu/mce/internal.h
@@ -348,5 +348,5 @@ static __always_inline u32 mca_msr_reg(int bank, enum mca_msr reg)
 	return 0;
 }
 
-extern void (*mc_poll_banks)(void);
+extern bool (*mc_poll_banks)(void);
 #endif /* __X86_MCE_INTERNAL_H__ */
-- 
2.9.4


^ permalink raw reply related	[flat|nested] 40+ messages in thread

end of thread, other threads:[~2026-03-16 13:44 UTC | newest]

Thread overview: 40+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-12  8:27 [PATCH] x86/mce: Fix timer interval adjustment after logging a MCE event lirongqing
2026-01-12  8:56 ` Nikolay Borisov
2026-01-12  9:36   ` 答复: [外部邮件] " Li,Rongqing
2026-01-12  9:51     ` Borislav Petkov
2026-01-12 10:24       ` 答复: " Li,Rongqing
2026-01-13  9:51         ` Borislav Petkov
     [not found]           ` <39cfb093256f4da78fe0bc9e814ce5d0@baidu.com>
2026-01-13 12:48             ` 答复: " Borislav Petkov
2026-01-13 18:53               ` Luck, Tony
2026-01-13 18:55                 ` Nikolay Borisov
2026-01-13 19:13                   ` Borislav Petkov
2026-01-13 19:25                     ` Nikolay Borisov
2026-01-13 19:33                       ` Borislav Petkov
2026-01-13 19:37                         ` Nikolay Borisov
2026-01-13 19:44                           ` Borislav Petkov
2026-01-13 19:51                             ` Nikolay Borisov
2026-01-13 20:33                               ` Borislav Petkov
2026-01-13 19:10                 ` Borislav Petkov
2026-01-13 19:31                 ` Nikolay Borisov
2026-01-13 20:30                 ` Thomas Gleixner
2026-01-13 20:56                 ` Borislav Petkov
2026-01-13 21:05                   ` Luck, Tony
2026-01-13 21:31                     ` Borislav Petkov
2026-01-13 22:41                       ` Borislav Petkov
2026-01-14  0:30                         ` Luck, Tony
2026-01-14 13:50                           ` Borislav Petkov
2026-01-14 14:48                             ` Borislav Petkov
2026-02-02 15:18                               ` Borislav Petkov
2026-02-02 23:49                                 ` 答复: [外部邮件] " Li,Rongqing
2026-02-06 22:03                                   ` Borislav Petkov
2026-02-07 11:51                             ` Borislav Petkov
2026-02-09 17:37                               ` Luck, Tony
2026-02-10 15:01                                 ` Borislav Petkov
2026-03-06  7:37                                   ` 答复: [外部邮件] " Li,Rongqing(ACG CCN)
2026-03-06 14:00                                     ` Borislav Petkov
2026-03-06 14:38                                       ` 答复: " Li,Rongqing(ACG CCN)
2026-03-06 15:29                                         ` Borislav Petkov
2026-03-07  1:18                                           ` 答复: " Li,Rongqing(ACG CCN)
2026-03-16 13:44                                             ` Borislav Petkov
2026-01-14  6:17                         ` Nikolay Borisov
2026-01-14 13:52                           ` Borislav Petkov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox