[PATCH 1/1] powerpc/watchdog: avoid extra sys_info dumps for all_bt
From: Bradley Morgan <hidden>
Date: 2026-06-20 22:02:09
Also in:
lkml
Subsystem:
linux for powerpc (32-bit and 64-bit), the rest · Maintainers:
Madhavan Srinivasan, Michael Ellerman, Linus Torvalds
The powerpc watchdog handles SYS_INFO_ALL_BT itself. When that is the
only hardlockup_sys_info bit, sys_info(0) falls back to kernel_sys_info.
Skip sys_info() for that case.
Fixes: e561383a39ed ("powerpc/watchdog: add support for hardlockup_sys_info sysctl")
Signed-off-by: Bradley Morgan <redacted>
---
arch/powerpc/kernel/watchdog.c | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
diff --git a/arch/powerpc/kernel/watchdog.c b/arch/powerpc/kernel/watchdog.c
index c40c69368476..6338e12651e3 100644
--- a/arch/powerpc/kernel/watchdog.c
+++ b/arch/powerpc/kernel/watchdog.c@@ -92,6 +92,16 @@ static cpumask_t wd_smp_cpus_pending; static cpumask_t wd_smp_cpus_stuck; static u64 wd_smp_last_reset_tb; +static void watchdog_sys_info(unsigned long si_mask) +{ + unsigned long dump_mask = si_mask & ~SYS_INFO_ALL_BT; + + if (si_mask && !dump_mask) + return; + + sys_info(dump_mask); +} + #ifdef CONFIG_PPC_PSERIES static u64 wd_timeout_pct; #endif
@@ -201,6 +211,7 @@ static bool set_cpu_stuck(int cpu) static void watchdog_smp_panic(int cpu) { static cpumask_t wd_smp_cpus_ipi; // protected by reporting + unsigned long si_mask; unsigned long flags; u64 tb, last_reset; int c;
@@ -236,8 +247,9 @@ static void watchdog_smp_panic(int cpu) pr_emerg("CPU %d TB:%lld, last SMP heartbeat TB:%lld (%lldms ago)\n", cpu, tb, last_reset, tb_to_ns(tb - last_reset) / 1000000); + si_mask = READ_ONCE(hardlockup_si_mask); if (sysctl_hardlockup_all_cpu_backtrace || - (hardlockup_si_mask & SYS_INFO_ALL_BT)) { + (si_mask & SYS_INFO_ALL_BT)) { trigger_allbutcpu_cpu_backtrace(cpu); cpumask_clear(&wd_smp_cpus_ipi); } else {
@@ -251,7 +263,7 @@ static void watchdog_smp_panic(int cpu) } } - sys_info(hardlockup_si_mask & ~SYS_INFO_ALL_BT); + watchdog_sys_info(si_mask); if (hardlockup_panic) nmi_panic(NULL, "Hard LOCKUP");
@@ -371,6 +383,7 @@ static void watchdog_timer_interrupt(int cpu) DEFINE_INTERRUPT_HANDLER_NMI(soft_nmi_interrupt) { + unsigned long si_mask; unsigned long flags; int cpu = raw_smp_processor_id(); u64 tb;
@@ -418,11 +431,12 @@ DEFINE_INTERRUPT_HANDLER_NMI(soft_nmi_interrupt) xchg(&__wd_nmi_output, 1); // see wd_lockup_ipi + si_mask = READ_ONCE(hardlockup_si_mask); if (sysctl_hardlockup_all_cpu_backtrace || - (hardlockup_si_mask & SYS_INFO_ALL_BT)) + (si_mask & SYS_INFO_ALL_BT)) trigger_allbutcpu_cpu_backtrace(cpu); - sys_info(hardlockup_si_mask & ~SYS_INFO_ALL_BT); + watchdog_sys_info(si_mask); if (hardlockup_panic) nmi_panic(regs, "Hard LOCKUP");
--
2.53.0