|
@@ -127,14 +127,13 @@ machine_crash_shutdown(struct pt_regs *pt)
|
|
|
* If an INIT is asserted here:
|
|
|
* - All receivers might be slaves, since some of cpus could already
|
|
|
* be frozen and INIT might be masked on monarch. In this case,
|
|
|
- * all slaves will park in while (monarch_cpu == -1) loop before
|
|
|
- * DIE_INIT_SLAVE_ENTER that for waiting monarch enters.
|
|
|
- * => TBD: freeze all slaves
|
|
|
+ * all slaves will be frozen soon since kdump_in_progress will let
|
|
|
+ * them into DIE_INIT_SLAVE_LEAVE.
|
|
|
* - One might be a monarch, but INIT rendezvous will fail since
|
|
|
* at least this cpu already have INIT masked so it never join
|
|
|
* to the rendezvous. In this case, all slaves and monarch will
|
|
|
- * be frozen after timeout of the INIT rendezvous.
|
|
|
- * => TBD: freeze them without waiting timeout
|
|
|
+ * be frozen soon with no wait since the INIT rendezvous is skipped
|
|
|
+ * by kdump_in_progress.
|
|
|
*/
|
|
|
kdump_smp_send_stop();
|
|
|
/* 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)
|
|
|
break;
|
|
|
/* fall through */
|
|
|
case DIE_INIT_SLAVE_LEAVE:
|
|
|
+ case DIE_INIT_MONARCH_ENTER:
|
|
|
case DIE_MCA_RENDZVOUS_LEAVE:
|
|
|
unw_init_running(kdump_cpu_freeze, NULL);
|
|
|
break;
|
|
@@ -217,7 +217,6 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
|
|
|
if (kdump_on_init && (nd->sos->rv_rc != 1)) {
|
|
|
if (atomic_inc_return(&kdump_in_progress) != 1)
|
|
|
kdump_freeze_monarch = 1;
|
|
|
- *(nd->monarch_cpu) = -1;
|
|
|
}
|
|
|
break;
|
|
|
case DIE_INIT_MONARCH_LEAVE:
|
|
@@ -228,10 +227,8 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
|
|
|
case DIE_MCA_MONARCH_LEAVE:
|
|
|
/* *(nd->data) indicate if MCA is recoverable */
|
|
|
if (kdump_on_fatal_mca && !(*(nd->data))) {
|
|
|
- if (atomic_inc_return(&kdump_in_progress) == 1) {
|
|
|
- *(nd->monarch_cpu) = -1;
|
|
|
+ if (atomic_inc_return(&kdump_in_progress) == 1)
|
|
|
machine_kdump_on_init();
|
|
|
- }
|
|
|
/* We got fatal MCA while kdump!? No way!! */
|
|
|
}
|
|
|
break;
|