From: Sasha Levin Date: Tue, 5 Nov 2013 05:55:22 +0000 (+1100) Subject: watchdog: trigger all-cpu backtrace when locked up and going to panic X-Git-Tag: next-20131105~2^2~274 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=01b46f9cbbbfb80e5712ea0c61a6d12514fa1784;p=karo-tx-linux.git watchdog: trigger all-cpu backtrace when locked up and going to panic Send an NMI to all CPUs when a lockup is detected and the lockup watchdog code is configured to panic. This gives us a fairly uptodate snapshot of all CPUs in the system. This lets us get stack trace of all CPUs which makes life easier trying to debug a deadlock, and the NMI doesn't change anything since the next step is a kernel panic. Signed-off-by: Sasha Levin Cc: Ingo Molnar Signed-off-by: Andrew Morton --- diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 4431610f049a..373d3e1356b2 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -239,10 +239,12 @@ static void watchdog_overflow_callback(struct perf_event *event, if (__this_cpu_read(hard_watchdog_warn) == true) return; - if (hardlockup_panic) + if (hardlockup_panic) { + trigger_all_cpu_backtrace(); panic("Watchdog detected hard LOCKUP on cpu %d", this_cpu); - else + } else { WARN(1, "Watchdog detected hard LOCKUP on cpu %d", this_cpu); + } __this_cpu_write(hard_watchdog_warn, true); return; @@ -323,8 +325,10 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer) else dump_stack(); - if (softlockup_panic) + if (softlockup_panic) { + trigger_all_cpu_backtrace(); panic("softlockup: hung tasks"); + } __this_cpu_write(soft_watchdog_warn, true); } else __this_cpu_write(soft_watchdog_warn, false);