On Thu, 31 Oct 2019 07:31:00 +0100 Cédric Le Goater <c...@kaod.org> wrote:
> When the machine crash handler is invoked, all interrupts are masked > but interrupts which have not been started yet do not have an ESB page > mapped in the Linux address space. This crashes the 'crash kexec' > sequence on sPAPR guests. > > To fix, force the mapping of the ESB page when an interrupt is being > mapped in the Linux IRQ number space. This is done by setting the > initial state of the interrupt to OFF which is not necessarily the > case on PowerNV. > > Signed-off-by: Cédric Le Goater <c...@kaod.org> > --- Reviewed-by: Greg Kurz <gr...@kaod.org> > arch/powerpc/sysdev/xive/common.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/arch/powerpc/sysdev/xive/common.c > b/arch/powerpc/sysdev/xive/common.c > index df832b09e3e9..f5fadbd2533a 100644 > --- a/arch/powerpc/sysdev/xive/common.c > +++ b/arch/powerpc/sysdev/xive/common.c > @@ -1035,6 +1035,15 @@ static int xive_irq_alloc_data(unsigned int virq, > irq_hw_number_t hw) > xd->target = XIVE_INVALID_TARGET; > irq_set_handler_data(virq, xd); > > + /* > + * Turn OFF by default the interrupt being mapped. A side > + * effect of this check is the mapping the ESB page of the > + * interrupt in the Linux address space. This prevents page > + * fault issues in the crash handler which masks all > + * interrupts. > + */ > + xive_esb_read(xd, XIVE_ESB_SET_PQ_01); > + > return 0; > } >