The powerpc watchdog prints all CPU backtraces itself. When the watchdog
mask contains only SYS_INFO_ALL_BT, stripping that bit leaves zero and
sys_info(0) falls back to kernel_sys_info.

Use sys_info_with_filter() so an explicit all_bt mask does not request
the global default.

Fixes: a9af76a78760 ("watchdog: add sys_info sysctls to dump sys info on system 
lockup")
Cc: [email protected]
Signed-off-by: Bradley Morgan <[email protected]>
---
 arch/powerpc/kernel/watchdog.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/kernel/watchdog.c b/arch/powerpc/kernel/watchdog.c
index c40c69368476..d3a9c6da962d 100644
--- a/arch/powerpc/kernel/watchdog.c
+++ b/arch/powerpc/kernel/watchdog.c
@@ -201,6 +201,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 +237,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 +253,7 @@ static void watchdog_smp_panic(int cpu)
                }
        }
 
-       sys_info(hardlockup_si_mask & ~SYS_INFO_ALL_BT);
+       sys_info_with_filter(si_mask, SYS_INFO_ALL_BT);
        if (hardlockup_panic)
                nmi_panic(NULL, "Hard LOCKUP");
 
@@ -371,6 +373,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 +421,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);
+               sys_info_with_filter(si_mask, SYS_INFO_ALL_BT);
                if (hardlockup_panic)
                        nmi_panic(regs, "Hard LOCKUP");
 
-- 
2.53.0


Reply via email to