MIPS: Add arch_trigger_all_cpu_backtrace() function
authorEunbong Song <eunb.song@samsung.com>
Wed, 22 Oct 2014 06:39:56 +0000 (06:39 +0000)
committerRalf Baechle <ralf@linux-mips.org>
Mon, 24 Nov 2014 06:44:49 +0000 (07:44 +0100)
Currently, arch_trigger_all_cpu_backtrace() is defined in only x86 and
sparc which have an NMI.  But in case of softlockup, it could be possible
to dump backtrace of all cpus. and this could be helpful for debugging.

for example, if system has 2 cpus.

CPU 0 CPU 1
 acquire read_lock()

try to do write_lock()

 ,,,
 missing read_unlock()

In this case, softlockup will occur becasuse CPU 0 does not call
read_unlock().  And dump_stack() print only backtrace for "CPU 0". If
CPU1's backtrace is printed it's very helpful.

[ralf@linux-mips.org: Fixed whitespace and formatting issues.]

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/8200/

arch/mips/include/asm/irq.h
arch/mips/kernel/process.c

index 39f07aec640cf27b865d270e45f34fed6b547274..5a4e1bb8fb1be99e98c372efa5138b7f7681ebbc 100644 (file)
@@ -48,4 +48,7 @@ extern int cp0_compare_irq;
 extern int cp0_compare_irq_shift;
 extern int cp0_perfcount_irq;
 
+void arch_trigger_all_cpu_backtrace(bool);
+#define arch_trigger_all_cpu_backtrace arch_trigger_all_cpu_backtrace
+
 #endif /* _ASM_IRQ_H */
index d0e77b2470cbf3f5ca6bb4b7afe038aa4692b0e9..eb76434828e8b403e536ca6d496eeb00baf5a368 100644 (file)
@@ -42,6 +42,7 @@
 #include <asm/isadep.h>
 #include <asm/inst.h>
 #include <asm/stacktrace.h>
+#include <asm/irq_regs.h>
 
 #ifdef CONFIG_HOTPLUG_CPU
 void arch_cpu_idle_dead(void)
@@ -532,3 +533,20 @@ unsigned long arch_align_stack(unsigned long sp)
 
        return sp & ALMASK;
 }
+
+static void arch_dump_stack(void *info)
+{
+       struct pt_regs *regs;
+
+       regs = get_irq_regs();
+
+       if (regs)
+               show_regs(regs);
+
+       dump_stack();
+}
+
+void arch_trigger_all_cpu_backtrace(bool include_self)
+{
+       smp_call_function(arch_dump_stack, NULL, 1);
+}