Skip to content

Commit

Permalink
panic: add options to print system info when panic happens
Browse files Browse the repository at this point in the history
Kernel panic issues are always painful to debug, partially because it's
not easy to get enough information of the context when panic happens.

And we have ramoops and kdump for that, while this commit tries to
provide a easier way to show the system info by adding a cmdline
parameter, referring some idea from sysrq handler.

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Feng Tang <[email protected]>
Reviewed-by: Kees Cook <[email protected]>
Acked-by: Steven Rostedt (VMware) <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: John Stultz <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Steven Rostedt <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
ftang1 authored and torvalds committed Jan 4, 2019
1 parent d187715 commit d999bd9
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
8 changes: 8 additions & 0 deletions Documentation/admin-guide/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3092,6 +3092,14 @@
timeout < 0: reboot immediately
Format: <timeout>

panic_print= Bitmask for printing system info when panic happens.
User can chose combination of the following bits:
bit 0: print all tasks info
bit 1: print system memory info
bit 2: print timer info
bit 3: print locks info if CONFIG_LOCKDEP is on
bit 4: print ftrace buffer

panic_on_warn panic() instead of WARN(). Useful to cause kdump
on a WARN().

Expand Down
28 changes: 28 additions & 0 deletions kernel/panic.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
static unsigned long panic_print;

ATOMIC_NOTIFIER_HEAD(panic_notifier_list);

EXPORT_SYMBOL(panic_notifier_list);
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit d999bd9

Please sign in to comment.