Excuse the lack of context here, I have a headache.

References: https://bugs.freedesktop.org/show_bug.cgi?id=103160
---
 drivers/watchdog/softdog.c |  2 ++
 include/linux/watchdog.h   |  9 +++++++++
 kernel/watchdog.c          | 39 ++++++++++++++++++++++++---------------
 3 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/drivers/watchdog/softdog.c b/drivers/watchdog/softdog.c
index 060740625485..61b0bd333114 100644
--- a/drivers/watchdog/softdog.c
+++ b/drivers/watchdog/softdog.c
@@ -58,6 +58,8 @@ static struct hrtimer softdog_preticktock;
 
 static enum hrtimer_restart softdog_fire(struct hrtimer *timer)
 {
+       watchdog_softlockup(NULL, true);
+
        module_put(THIS_MODULE);
        if (soft_noboot) {
                pr_crit("Triggered - Reboot ignored\n");
diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h
index a786e5e8973b..811e15e08718 100644
--- a/include/linux/watchdog.h
+++ b/include/linux/watchdog.h
@@ -215,4 +215,13 @@ extern void watchdog_unregister_device(struct 
watchdog_device *);
 /* devres register variant */
 int devm_watchdog_register_device(struct device *dev, struct watchdog_device 
*);
 
+#if IS_ENABLED(CONFIG_LOCKUP_DETECTOR)
+extern void watchdog_softlockup(struct pt_regs *regs, bool show_backtrace);
+#else
+static inline void watchdog_softlockup(struct pt_regs *regs,
+                                      bool show_backtrace)
+{
+}
+#endif
+
 #endif  /* ifndef _LINUX_WATCHDOG_H */
diff --git a/kernel/watchdog.c b/kernel/watchdog.c
index 6bcb854909c0..a111c4d34798 100644
--- a/kernel/watchdog.c
+++ b/kernel/watchdog.c
@@ -24,6 +24,7 @@
 #include <linux/workqueue.h>
 #include <linux/sched/clock.h>
 #include <linux/sched/debug.h>
+#include <linux/watchdog.h>
 
 #include <asm/irq_regs.h>
 #include <linux/kvm_para.h>
@@ -415,30 +416,21 @@ static enum hrtimer_restart watchdog_timer_fn(struct 
hrtimer *hrtimer)
                }
 
                pr_emerg("BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n",
-                       smp_processor_id(), duration,
-                       current->comm, task_pid_nr(current));
-               __this_cpu_write(softlockup_task_ptr_saved, current);
-               print_modules();
-               print_irqtrace_events(current);
-               if (regs)
-                       show_regs(regs);
-               else
-                       dump_stack();
+                        smp_processor_id(), duration,
+                        current->comm, task_pid_nr(current));
+
+               watchdog_softlockup(regs, softlockup_all_cpu_backtrace);
+               if (softlockup_panic)
+                       panic("softlockup: hung tasks");
 
                if (softlockup_all_cpu_backtrace) {
                        /* Avoid generating two back traces for current
                         * given that one is already made above
                         */
-                       trigger_allbutself_cpu_backtrace();
-
                        clear_bit(0, &soft_lockup_nmi_warn);
                        /* Barrier to sync with other cpus */
                        smp_mb__after_atomic();
                }
-
-               add_taint(TAINT_SOFTLOCKUP, LOCKDEP_STILL_OK);
-               if (softlockup_panic)
-                       panic("softlockup: hung tasks");
                __this_cpu_write(soft_watchdog_warn, true);
        } else
                __this_cpu_write(soft_watchdog_warn, false);
@@ -787,3 +779,20 @@ void __init lockup_detector_init(void)
                nmi_watchdog_available = true;
        lockup_detector_setup();
 }
+
+void watchdog_softlockup(struct pt_regs *regs, bool show_backtrace)
+{
+       __this_cpu_write(softlockup_task_ptr_saved, current);
+       print_modules();
+       print_irqtrace_events(current);
+       if (regs)
+               show_regs(regs);
+       else
+               dump_stack();
+
+       if (show_backtrace)
+               trigger_allbutself_cpu_backtrace();
+
+       add_taint(TAINT_SOFTLOCKUP, LOCKDEP_STILL_OK);
+}
+EXPORT_SYMBOL(watchdog_softlockup);
-- 
2.15.0.rc0

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to