diff options
Diffstat (limited to 'arch/ia64/kernel/crash.c')
-rw-r--r-- | arch/ia64/kernel/crash.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c index 0995fdc7b299..6631a9dfafdc 100644 --- a/arch/ia64/kernel/crash.c +++ b/arch/ia64/kernel/crash.c | |||
@@ -127,14 +127,13 @@ machine_crash_shutdown(struct pt_regs *pt) | |||
127 | * If an INIT is asserted here: | 127 | * If an INIT is asserted here: |
128 | * - All receivers might be slaves, since some of cpus could already | 128 | * - All receivers might be slaves, since some of cpus could already |
129 | * be frozen and INIT might be masked on monarch. In this case, | 129 | * be frozen and INIT might be masked on monarch. In this case, |
130 | * all slaves will park in while (monarch_cpu == -1) loop before | 130 | * all slaves will be frozen soon since kdump_in_progress will let |
131 | * DIE_INIT_SLAVE_ENTER that for waiting monarch enters. | 131 | * them into DIE_INIT_SLAVE_LEAVE. |
132 | * => TBD: freeze all slaves | ||
133 | * - One might be a monarch, but INIT rendezvous will fail since | 132 | * - One might be a monarch, but INIT rendezvous will fail since |
134 | * at least this cpu already have INIT masked so it never join | 133 | * at least this cpu already have INIT masked so it never join |
135 | * to the rendezvous. In this case, all slaves and monarch will | 134 | * to the rendezvous. In this case, all slaves and monarch will |
136 | * be frozen after timeout of the INIT rendezvous. | 135 | * be frozen soon with no wait since the INIT rendezvous is skipped |
137 | * => TBD: freeze them without waiting timeout | 136 | * by kdump_in_progress. |
138 | */ | 137 | */ |
139 | kdump_smp_send_stop(); | 138 | kdump_smp_send_stop(); |
140 | /* not all cpu response to IPI, send INIT to freeze them */ | 139 | /* not all cpu response to IPI, send INIT to freeze them */ |
@@ -187,6 +186,7 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data) | |||
187 | break; | 186 | break; |
188 | /* fall through */ | 187 | /* fall through */ |
189 | case DIE_INIT_SLAVE_LEAVE: | 188 | case DIE_INIT_SLAVE_LEAVE: |
189 | case DIE_INIT_MONARCH_ENTER: | ||
190 | case DIE_MCA_RENDZVOUS_LEAVE: | 190 | case DIE_MCA_RENDZVOUS_LEAVE: |
191 | unw_init_running(kdump_cpu_freeze, NULL); | 191 | unw_init_running(kdump_cpu_freeze, NULL); |
192 | break; | 192 | break; |
@@ -217,7 +217,6 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data) | |||
217 | if (kdump_on_init && (nd->sos->rv_rc != 1)) { | 217 | if (kdump_on_init && (nd->sos->rv_rc != 1)) { |
218 | if (atomic_inc_return(&kdump_in_progress) != 1) | 218 | if (atomic_inc_return(&kdump_in_progress) != 1) |
219 | kdump_freeze_monarch = 1; | 219 | kdump_freeze_monarch = 1; |
220 | *(nd->monarch_cpu) = -1; | ||
221 | } | 220 | } |
222 | break; | 221 | break; |
223 | case DIE_INIT_MONARCH_LEAVE: | 222 | case DIE_INIT_MONARCH_LEAVE: |
@@ -228,10 +227,8 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data) | |||
228 | case DIE_MCA_MONARCH_LEAVE: | 227 | case DIE_MCA_MONARCH_LEAVE: |
229 | /* *(nd->data) indicate if MCA is recoverable */ | 228 | /* *(nd->data) indicate if MCA is recoverable */ |
230 | if (kdump_on_fatal_mca && !(*(nd->data))) { | 229 | if (kdump_on_fatal_mca && !(*(nd->data))) { |
231 | if (atomic_inc_return(&kdump_in_progress) == 1) { | 230 | if (atomic_inc_return(&kdump_in_progress) == 1) |
232 | *(nd->monarch_cpu) = -1; | ||
233 | machine_kdump_on_init(); | 231 | machine_kdump_on_init(); |
234 | } | ||
235 | /* We got fatal MCA while kdump!? No way!! */ | 232 | /* We got fatal MCA while kdump!? No way!! */ |
236 | } | 233 | } |
237 | break; | 234 | break; |