diff options
Diffstat (limited to 'kernel/panic.c')
-rw-r--r-- | kernel/panic.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/kernel/panic.c b/kernel/panic.c index d02fa9fef46a..62e16cef9cc2 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
@@ -32,6 +32,7 @@ static unsigned long tainted_mask; | |||
32 | static int pause_on_oops; | 32 | static int pause_on_oops; |
33 | static int pause_on_oops_flag; | 33 | static int pause_on_oops_flag; |
34 | static DEFINE_SPINLOCK(pause_on_oops_lock); | 34 | static DEFINE_SPINLOCK(pause_on_oops_lock); |
35 | static bool crash_kexec_post_notifiers; | ||
35 | 36 | ||
36 | int panic_timeout = CONFIG_PANIC_TIMEOUT; | 37 | int panic_timeout = CONFIG_PANIC_TIMEOUT; |
37 | EXPORT_SYMBOL_GPL(panic_timeout); | 38 | EXPORT_SYMBOL_GPL(panic_timeout); |
@@ -112,9 +113,11 @@ void panic(const char *fmt, ...) | |||
112 | /* | 113 | /* |
113 | * If we have crashed and we have a crash kernel loaded let it handle | 114 | * If we have crashed and we have a crash kernel loaded let it handle |
114 | * everything else. | 115 | * everything else. |
115 | * Do we want to call this before we try to display a message? | 116 | * If we want to run this after calling panic_notifiers, pass |
117 | * the "crash_kexec_post_notifiers" option to the kernel. | ||
116 | */ | 118 | */ |
117 | crash_kexec(NULL); | 119 | if (!crash_kexec_post_notifiers) |
120 | crash_kexec(NULL); | ||
118 | 121 | ||
119 | /* | 122 | /* |
120 | * Note smp_send_stop is the usual smp shutdown function, which | 123 | * Note smp_send_stop is the usual smp shutdown function, which |
@@ -131,6 +134,15 @@ void panic(const char *fmt, ...) | |||
131 | 134 | ||
132 | kmsg_dump(KMSG_DUMP_PANIC); | 135 | kmsg_dump(KMSG_DUMP_PANIC); |
133 | 136 | ||
137 | /* | ||
138 | * If you doubt kdump always works fine in any situation, | ||
139 | * "crash_kexec_post_notifiers" offers you a chance to run | ||
140 | * panic_notifiers and dumping kmsg before kdump. | ||
141 | * Note: since some panic_notifiers can make crashed kernel | ||
142 | * more unstable, it can increase risks of the kdump failure too. | ||
143 | */ | ||
144 | crash_kexec(NULL); | ||
145 | |||
134 | bust_spinlocks(0); | 146 | bust_spinlocks(0); |
135 | 147 | ||
136 | if (!panic_blink) | 148 | if (!panic_blink) |
@@ -472,6 +484,13 @@ EXPORT_SYMBOL(__stack_chk_fail); | |||
472 | core_param(panic, panic_timeout, int, 0644); | 484 | core_param(panic, panic_timeout, int, 0644); |
473 | core_param(pause_on_oops, pause_on_oops, int, 0644); | 485 | core_param(pause_on_oops, pause_on_oops, int, 0644); |
474 | 486 | ||
487 | static int __init setup_crash_kexec_post_notifiers(char *s) | ||
488 | { | ||
489 | crash_kexec_post_notifiers = true; | ||
490 | return 0; | ||
491 | } | ||
492 | early_param("crash_kexec_post_notifiers", setup_crash_kexec_post_notifiers); | ||
493 | |||
475 | static int __init oops_setup(char *s) | 494 | static int __init oops_setup(char *s) |
476 | { | 495 | { |
477 | if (!s) | 496 | if (!s) |