powerpc/xive: Prevent page fault issues in the machine crash handler
authorCédric Le Goater <clg@kaod.org>
Thu, 31 Oct 2019 06:31:00 +0000 (07:31 +0100)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 13 Nov 2019 05:58:10 +0000 (16:58 +1100)
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.

Fixes: 243e25112d06 ("powerpc/xive: Native exploitation of the XIVE interrupt controller")
Cc: stable@vger.kernel.org # v4.12+
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Greg Kurz <groug@kaod.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20191031063100.3864-1-clg@kaod.org
arch/powerpc/sysdev/xive/common.c

index df832b09e3e9ce28c19d1e08d8530d1ef52ee149..f5fadbd2533a8f1c5b5512fba1423a22b714bd34 100644 (file)
@@ -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;
 }