Commit d2b04b0c authored by Cédric Le Goater's avatar Cédric Le Goater Committed by Michael Ellerman

powerpc/64/kexec: fix race in kexec when XIVE is shutdown

The kexec_state KEXEC_STATE_IRQS_OFF barrier is reached by all
secondary CPUs before the kexec_cpu_down() operation is called on
secondaries. This can raise conflicts and provoque errors in the XIVE
hcalls when XIVE is shutdown with H_INT_RESET on the primary CPU.

To synchronize the kexec_cpu_down() operations and make sure the
secondaries have completed their task before the primary starts doing
the same, let's move the primary kexec_cpu_down() after the
KEXEC_STATE_REAL_MODE barrier.

This change of the ending sequence of kexec is mostly useful on the
pseries platform but it impacts also the powernv, ps3 and 85xx
platforms. powernv can be easily tested and fixed but some caution is
required for the other two.
Signed-off-by: default avatarCédric Le Goater <clg@kaod.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 9a018fb1
...@@ -231,16 +231,16 @@ static void kexec_prepare_cpus(void) ...@@ -231,16 +231,16 @@ static void kexec_prepare_cpus(void)
/* we are sure every CPU has IRQs off at this point */ /* we are sure every CPU has IRQs off at this point */
kexec_all_irq_disabled = 1; kexec_all_irq_disabled = 1;
/* after we tell the others to go down */
if (ppc_md.kexec_cpu_down)
ppc_md.kexec_cpu_down(0, 0);
/* /*
* Before removing MMU mappings make sure all CPUs have entered real * Before removing MMU mappings make sure all CPUs have entered real
* mode: * mode:
*/ */
kexec_prepare_cpus_wait(KEXEC_STATE_REAL_MODE); kexec_prepare_cpus_wait(KEXEC_STATE_REAL_MODE);
/* after we tell the others to go down */
if (ppc_md.kexec_cpu_down)
ppc_md.kexec_cpu_down(0, 0);
put_cpu(); put_cpu();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment