kernel/sysctl: add panic_print into sysctl
[sfrench/cifs-2.6.git] / kernel / panic.c
index d10c340c43b0e169c42255b826c22d6ec3068637..f121e6ba7e114e10e7e11ac3fa1cd24ab8fef0c1 100644 (file)
@@ -46,6 +46,13 @@ int panic_on_warn __read_mostly;
 int panic_timeout = CONFIG_PANIC_TIMEOUT;
 EXPORT_SYMBOL_GPL(panic_timeout);
 
+#define PANIC_PRINT_TASK_INFO          0x00000001
+#define PANIC_PRINT_MEM_INFO           0x00000002
+#define PANIC_PRINT_TIMER_INFO         0x00000004
+#define PANIC_PRINT_LOCK_INFO          0x00000008
+#define PANIC_PRINT_FTRACE_INFO                0x00000010
+unsigned long panic_print;
+
 ATOMIC_NOTIFIER_HEAD(panic_notifier_list);
 
 EXPORT_SYMBOL(panic_notifier_list);
@@ -125,6 +132,24 @@ void nmi_panic(struct pt_regs *regs, const char *msg)
 }
 EXPORT_SYMBOL(nmi_panic);
 
+static void panic_print_sys_info(void)
+{
+       if (panic_print & PANIC_PRINT_TASK_INFO)
+               show_state();
+
+       if (panic_print & PANIC_PRINT_MEM_INFO)
+               show_mem(0, NULL);
+
+       if (panic_print & PANIC_PRINT_TIMER_INFO)
+               sysrq_timer_list_show();
+
+       if (panic_print & PANIC_PRINT_LOCK_INFO)
+               debug_show_all_locks();
+
+       if (panic_print & PANIC_PRINT_FTRACE_INFO)
+               ftrace_dump(DUMP_ALL);
+}
+
 /**
  *     panic - halt the system
  *     @fmt: The text string to print
@@ -254,6 +279,8 @@ void panic(const char *fmt, ...)
        debug_locks_off();
        console_flush_on_panic();
 
+       panic_print_sys_info();
+
        if (!panic_blink)
                panic_blink = no_blink;
 
@@ -658,6 +685,7 @@ void refcount_error_report(struct pt_regs *regs, const char *err)
 #endif
 
 core_param(panic, panic_timeout, int, 0644);
+core_param(panic_print, panic_print, ulong, 0644);
 core_param(pause_on_oops, pause_on_oops, int, 0644);
 core_param(panic_on_warn, panic_on_warn, int, 0644);
 core_param(crash_kexec_post_notifiers, crash_kexec_post_notifiers, bool, 0644);