diff options
Diffstat (limited to 'kernel/panic.c')
-rw-r--r-- | kernel/panic.c | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/kernel/panic.c b/kernel/panic.c index ca8cea1ef673..e6480e20379e 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
@@ -71,6 +71,32 @@ void __weak nmi_panic_self_stop(struct pt_regs *regs) | |||
71 | panic_smp_self_stop(); | 71 | panic_smp_self_stop(); |
72 | } | 72 | } |
73 | 73 | ||
74 | /* | ||
75 | * Stop other CPUs in panic. Architecture dependent code may override this | ||
76 | * with more suitable version. For example, if the architecture supports | ||
77 | * crash dump, it should save registers of each stopped CPU and disable | ||
78 | * per-CPU features such as virtualization extensions. | ||
79 | */ | ||
80 | void __weak crash_smp_send_stop(void) | ||
81 | { | ||
82 | static int cpus_stopped; | ||
83 | |||
84 | /* | ||
85 | * This function can be called twice in panic path, but obviously | ||
86 | * we execute this only once. | ||
87 | */ | ||
88 | if (cpus_stopped) | ||
89 | return; | ||
90 | |||
91 | /* | ||
92 | * Note smp_send_stop is the usual smp shutdown function, which | ||
93 | * unfortunately means it may not be hardened to work in a panic | ||
94 | * situation. | ||
95 | */ | ||
96 | smp_send_stop(); | ||
97 | cpus_stopped = 1; | ||
98 | } | ||
99 | |||
74 | atomic_t panic_cpu = ATOMIC_INIT(PANIC_CPU_INVALID); | 100 | atomic_t panic_cpu = ATOMIC_INIT(PANIC_CPU_INVALID); |
75 | 101 | ||
76 | /* | 102 | /* |
@@ -164,14 +190,21 @@ void panic(const char *fmt, ...) | |||
164 | if (!_crash_kexec_post_notifiers) { | 190 | if (!_crash_kexec_post_notifiers) { |
165 | printk_nmi_flush_on_panic(); | 191 | printk_nmi_flush_on_panic(); |
166 | __crash_kexec(NULL); | 192 | __crash_kexec(NULL); |
167 | } | ||
168 | 193 | ||
169 | /* | 194 | /* |
170 | * Note smp_send_stop is the usual smp shutdown function, which | 195 | * Note smp_send_stop is the usual smp shutdown function, which |
171 | * unfortunately means it may not be hardened to work in a panic | 196 | * unfortunately means it may not be hardened to work in a |
172 | * situation. | 197 | * panic situation. |
173 | */ | 198 | */ |
174 | smp_send_stop(); | 199 | smp_send_stop(); |
200 | } else { | ||
201 | /* | ||
202 | * If we want to do crash dump after notifier calls and | ||
203 | * kmsg_dump, we will need architecture dependent extra | ||
204 | * works in addition to stopping other CPUs. | ||
205 | */ | ||
206 | crash_smp_send_stop(); | ||
207 | } | ||
175 | 208 | ||
176 | /* | 209 | /* |
177 | * Run any panic handlers, including those that might need to | 210 | * Run any panic handlers, including those that might need to |