]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
powerpc/watchdog: add support for hardlockup_sys_info sysctl
authorFeng Tang <feng.tang@linux.alibaba.com>
Wed, 31 Dec 2025 08:03:09 +0000 (16:03 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 15 Jan 2026 06:16:22 +0000 (22:16 -0800)
Commit a9af76a78760 ("watchdog: add sys_info sysctls to dump sys info on
system lockup") adds 'hardlock_sys_info' systcl knob for general kernel
watchdog to control what kinds of system debug info to be dumped on
hardlockup.

Add similar support in powerpc watchdog code to make the sysctl knob more
general, which also fixes a compiling warning in general watchdog code
reported by 0day bot.

Link: https://lkml.kernel.org/r/20251231080309.39642-1-feng.tang@linux.alibaba.com
Fixes: a9af76a78760 ("watchdog: add sys_info sysctls to dump sys info on system lockup")
Signed-off-by: Feng Tang <feng.tang@linux.alibaba.com>
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202512030920.NFKtekA7-lkp@intel.com/
Suggested-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
arch/powerpc/kernel/watchdog.c
include/linux/nmi.h
kernel/watchdog.c

index 2429cb1c7baa7f77256ad93376ce1a1c15935112..764001deb0605fa5d34ac09575086f8f796562ce 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/delay.h>
 #include <linux/processor.h>
 #include <linux/smp.h>
+#include <linux/sys_info.h>
 
 #include <asm/interrupt.h>
 #include <asm/paca.h>
@@ -235,7 +236,11 @@ 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);
 
-       if (!sysctl_hardlockup_all_cpu_backtrace) {
+       if (sysctl_hardlockup_all_cpu_backtrace ||
+           (hardlockup_si_mask & SYS_INFO_ALL_BT)) {
+               trigger_allbutcpu_cpu_backtrace(cpu);
+               cpumask_clear(&wd_smp_cpus_ipi);
+       } else {
                /*
                 * Try to trigger the stuck CPUs, unless we are going to
                 * get a backtrace on all of them anyway.
@@ -244,11 +249,9 @@ static void watchdog_smp_panic(int cpu)
                        smp_send_nmi_ipi(c, wd_lockup_ipi, 1000000);
                        __cpumask_clear_cpu(c, &wd_smp_cpus_ipi);
                }
-       } else {
-               trigger_allbutcpu_cpu_backtrace(cpu);
-               cpumask_clear(&wd_smp_cpus_ipi);
        }
 
+       sys_info(hardlockup_si_mask & ~SYS_INFO_ALL_BT);
        if (hardlockup_panic)
                nmi_panic(NULL, "Hard LOCKUP");
 
@@ -415,9 +418,11 @@ DEFINE_INTERRUPT_HANDLER_NMI(soft_nmi_interrupt)
 
                xchg(&__wd_nmi_output, 1); // see wd_lockup_ipi
 
-               if (sysctl_hardlockup_all_cpu_backtrace)
+               if (sysctl_hardlockup_all_cpu_backtrace ||
+                   (hardlockup_si_mask & SYS_INFO_ALL_BT))
                        trigger_allbutcpu_cpu_backtrace(cpu);
 
+               sys_info(hardlockup_si_mask & ~SYS_INFO_ALL_BT);
                if (hardlockup_panic)
                        nmi_panic(regs, "Hard LOCKUP");
 
index cf3c6ab408aacac839aec5c4c24a3ad16e032461..207156f2143c5f43e89e81cbf0215331eae9bd49 100644 (file)
@@ -83,6 +83,7 @@ static inline void reset_hung_task_detector(void) { }
 #if defined(CONFIG_HARDLOCKUP_DETECTOR)
 extern void hardlockup_detector_disable(void);
 extern unsigned int hardlockup_panic;
+extern unsigned long hardlockup_si_mask;
 #else
 static inline void hardlockup_detector_disable(void) {}
 #endif
index 0685e3a8aa0a801eb2eed30b60251342e16b8573..366122f4a0f87158dca9ea30157801396a93ec27 100644 (file)
@@ -71,7 +71,7 @@ unsigned int __read_mostly hardlockup_panic =
  * hard lockup is detected, it could be task, memory, lock etc.
  * Refer include/linux/sys_info.h for detailed bit definition.
  */
-static unsigned long hardlockup_si_mask;
+unsigned long hardlockup_si_mask;
 
 #ifdef CONFIG_SYSFS