From: Sasha Levin Date: Thu, 23 May 2013 00:37:05 +0000 (+1000) Subject: watchdog: trigger all-cpu backtrace when locked up and going to panic X-Git-Tag: next-20130527~1^2~234 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=ff79cedb68eb873e7e9a4dc1924a0b1cbc9c2e26;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 05039e348f07..ea741c32d596 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);