lkml.org 
[lkml]   [2020]   [Jun]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.6 029/161] powerpc/xive: Clear the page tables for the ESB IO mapping
    Date
    From: Cédric Le Goater <clg@kaod.org>

    [ Upstream commit a101950fcb78b0ba20cd487be6627dea58d55c2b ]

    Commit 1ca3dec2b2df ("powerpc/xive: Prevent page fault issues in the
    machine crash handler") fixed an issue in the FW assisted dump of
    machines using hash MMU and the XIVE interrupt mode under the POWER
    hypervisor. It forced the mapping of the ESB page of interrupts being
    mapped in the Linux IRQ number space to make sure the 'crash kexec'
    sequence worked during such an event. But it didn't handle the
    un-mapping.

    This mapping is now blocking the removal of a passthrough IO adapter
    under the POWER hypervisor because it expects the guest OS to have
    cleared all page table entries related to the adapter. If some are
    still present, the RTAS call which isolates the PCI slot returns error
    9001 "valid outstanding translations".

    Remove these mapping in the IRQ data cleanup routine.

    Under KVM, this cleanup is not required because the ESB pages for the
    adapter interrupts are un-mapped from the guest by the hypervisor in
    the KVM XIVE native device. This is now redundant but it's harmless.

    Fixes: 1ca3dec2b2df ("powerpc/xive: Prevent page fault issues in the machine crash handler")
    Cc: stable@vger.kernel.org # v5.5+
    Signed-off-by: Cédric Le Goater <clg@kaod.org>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20200429075122.1216388-2-clg@kaod.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/powerpc/sysdev/xive/common.c | 5 +++++
    1 file changed, 5 insertions(+)

    diff --git a/arch/powerpc/sysdev/xive/common.c b/arch/powerpc/sysdev/xive/common.c
    index fe8d396e2301..16df9cc8f360 100644
    --- a/arch/powerpc/sysdev/xive/common.c
    +++ b/arch/powerpc/sysdev/xive/common.c
    @@ -19,6 +19,7 @@
    #include <linux/slab.h>
    #include <linux/spinlock.h>
    #include <linux/msi.h>
    +#include <linux/vmalloc.h>

    #include <asm/prom.h>
    #include <asm/io.h>
    @@ -1013,12 +1014,16 @@ EXPORT_SYMBOL_GPL(is_xive_irq);
    void xive_cleanup_irq_data(struct xive_irq_data *xd)
    {
    if (xd->eoi_mmio) {
    + unmap_kernel_range((unsigned long)xd->eoi_mmio,
    + 1u << xd->esb_shift);
    iounmap(xd->eoi_mmio);
    if (xd->eoi_mmio == xd->trig_mmio)
    xd->trig_mmio = NULL;
    xd->eoi_mmio = NULL;
    }
    if (xd->trig_mmio) {
    + unmap_kernel_range((unsigned long)xd->trig_mmio,
    + 1u << xd->esb_shift);
    iounmap(xd->trig_mmio);
    xd->trig_mmio = NULL;
    }
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-06-16 18:04    [W:5.288 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site