[PATCH 1/3] softdog-info

Chris Wilson chris at chris-wilson.co.uk
Thu Oct 12 09:00:21 UTC 2017


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



More information about the Intel-gfx-trybot mailing list