• Guilherme G. Piccoli's avatar
    ARM: 9257/1: Disable FIQs (but not IRQs) on CPUs shutdown paths · 8fc0b333
    Guilherme G. Piccoli authored
    Currently the regular CPU shutdown path for ARM disables IRQs/FIQs
    in the secondary CPUs - smp_send_stop() calls ipi_cpu_stop(), which
    is responsible for that. IRQs are architecturally masked when we
    take an interrupt, but FIQs are high priority than IRQs, hence they
    aren't masked. With that said, it makes sense to disable FIQs here,
    but there's no need for (re-)disabling IRQs.
    
    More than that: there is an alternative path for disabling CPUs,
    in the form of function crash_smp_send_stop(), which is used for
    kexec/panic path. This function relies on a SMP call that also
    triggers a busy-wait loop [at machine_crash_nonpanic_core()], but
    without disabling FIQs. This might lead to odd scenarios, like
    early interrupts in the boot of kexec'd kernel or even interrupts
    in secondary "disabled" CPUs while the main one still works in the
    panic path and assumes all secondary CPUs are (really!) off.
    
    So, let's disable FIQs in both paths and *not* disable IRQs a second
    time, since they are already masked in both paths by the architecture.
    This way, we keep both CPU quiesce paths consistent and safe.
    
    Cc: Marc Zyngier <maz@kernel.org>
    Cc: Michael Kelley <mikelley@microsoft.com>
    Signed-off-by: default avatarGuilherme G. Piccoli <gpiccoli@igalia.com>
    Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
    8fc0b333
smp.c 19 KB