• Jean-Philippe Brucker's avatar
    iommu/virtio: Fix interaction with VFIO · 91c98fe7
    Jean-Philippe Brucker authored
    Commit e8ae0e14 ("vfio: Require that devices support DMA cache
    coherence") requires IOMMU drivers to advertise
    IOMMU_CAP_CACHE_COHERENCY, in order to be used by VFIO. Since VFIO does
    not provide to userspace the ability to maintain coherency through cache
    invalidations, it requires hardware coherency. Advertise the capability
    in order to restore VFIO support.
    
    The meaning of IOMMU_CAP_CACHE_COHERENCY also changed from "IOMMU can
    enforce cache coherent DMA transactions" to "IOMMU_CACHE is supported".
    While virtio-iommu cannot enforce coherency (of PCIe no-snoop
    transactions), it does support IOMMU_CACHE.
    
    We can distinguish different cases of non-coherent DMA:
    
    (1) When accesses from a hardware endpoint are not coherent. The host
        would describe such a device using firmware methods ('dma-coherent'
        in device-tree, '_CCA' in ACPI), since they are also needed without
        a vIOMMU. In this case mappings are created without IOMMU_CACHE.
        virtio-iommu doesn't need any additional support. It sends the same
        requests as for coherent devices.
    
    (2) When the physical IOMMU supports non-cacheable mappings. Supporting
        those would require a new feature in virtio-iommu, new PROBE request
        property and MAP flags. Device drivers would use a new API to
        discover this since it depends on the architecture and the physical
        IOMMU.
    
    (3) When the hardware supports PCIe no-snoop. It is possible for
        assigned PCIe devices to issue no-snoop transactions, and the
        virtio-iommu specification is lacking any mention of this.
    
        Arm platforms don't necessarily support no-snoop, and those that do
        cannot enforce coherency of no-snoop transactions. Device drivers
        must be careful about assuming that no-snoop transactions won't end
        up cached; see commit e02f5c1b ("drm: disable uncached DMA
        optimization for ARM and arm64"). On x86 platforms, the host may or
        may not enforce coherency of no-snoop transactions with the physical
        IOMMU. But according to the above commit, on x86 a driver which
        assumes that no-snoop DMA is compatible with uncached CPU mappings
        will also work if the host enforces coherency.
    
        Although these issues are not specific to virtio-iommu, it could be
        used to facilitate discovery and configuration of no-snoop. This
        would require a new feature bit, PROBE property and ATTACH/MAP
        flags.
    
    Cc: stable@vger.kernel.org
    Fixes: e8ae0e14 ("vfio: Require that devices support DMA cache coherence")
    Signed-off-by: default avatarJean-Philippe Brucker <jean-philippe@linaro.org>
    Reviewed-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Link: https://lore.kernel.org/r/20220825154622.86759-1-jean-philippe@linaro.orgSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    91c98fe7
virtio-iommu.c 30.6 KB