• Alexey Kardashevskiy's avatar
    powerpc/powernv: Fix stale iommu table base after VFIO · ffd20075
    Alexey Kardashevskiy authored
    commit 5636427d upstream.
    
    The powernv platform uses @dma_iommu_ops for non-bypass DMA. These ops
    need an iommu_table pointer which is stored in
    dev->archdata.iommu_table_base. It is initialized during
    pcibios_setup_device() which handles boot time devices. However when a
    device is taken from the system in order to pass it through, the
    default IOMMU table is destroyed but the pointer in a device is not
    updated; also when a device is returned back to the system, a new
    table pointer is not stored in dev->archdata.iommu_table_base either.
    So when a just returned device tries using IOMMU, it crashes on
    accessing stale iommu_table or its members.
    
    This calls set_iommu_table_base() when the default window is created.
    Note it used to be there before but was wrongly removed (see "fixes").
    It did not appear before as these days most devices simply use bypass.
    
    This adds set_iommu_table_base(NULL) when a device is taken from the
    system to make it clear that IOMMU DMA cannot be used past that point.
    
    Fixes: c4e9d3c1 ("powerpc/powernv/pseries: Rework device adding to IOMMU groups")
    Cc: stable@vger.kernel.org # v5.0+
    Signed-off-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ffd20075
pci-ioda.c 106 KB