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) |
