[Intel-gfx] [PATCH] softdog-info
Chris Wilson
chris at chris-wilson.co.uk
Wed Oct 11 16:00:32 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
mailing list