On Wed, Mar 23, 2022 at 05:34:18PM -0300, Jason Gunthorpe wrote:
> Stated another way, any platform that wires dev_is_dma_coherent() to
> true, like all x86 does, must support IOMMU_CACHE and report
> IOMMU_CAP_CACHE_COHERENCY for every iommu_domain the platform
> supports. The platform obviously declares it support this in order to
> support the in-kernel DMA API.
That gives me a nice simple idea:
diff --git a/drivers/iommu/iommufd/device.c b/drivers/iommu/iommufd/device.c
index 3c6b95ad026829..8366884df4a030 100644
--- a/drivers/iommu/iommufd/device.c
+++ b/drivers/iommu/iommufd/device.c
@@ -8,6 +8,7 @@
#include <linux/pci.h>
#include <linux/irqdomain.h>
#include <linux/dma-iommu.h>
+#include <linux/dma-map-ops.h>
#include "iommufd_private.h"
@@ -61,6 +62,10 @@ struct iommufd_device *iommufd_bind_pci_device(int fd,
struct pci_dev *pdev,
struct iommu_group *group;
int rc;
+ /* iommufd always uses IOMMU_CACHE */
+ if (!dev_is_dma_coherent(&pdev->dev))
+ return ERR_PTR(-EINVAL);
+
ictx = iommufd_fget(fd);
if (!ictx)
return ERR_PTR(-EINVAL);
diff --git a/drivers/iommu/iommufd/ioas.c b/drivers/iommu/iommufd/ioas.c
index 48149988c84bbc..3d6df1ffbf93e6 100644
--- a/drivers/iommu/iommufd/ioas.c
+++ b/drivers/iommu/iommufd/ioas.c
@@ -129,7 +129,8 @@ static int conv_iommu_prot(u32 map_flags)
* We provide no manual cache coherency ioctls to userspace and most
* architectures make the CPU ops for cache flushing privileged.
* Therefore we require the underlying IOMMU to support CPU coherent
- * operation.
+ * operation. Support for IOMMU_CACHE is enforced by the
+ * dev_is_dma_coherent() test during bind.
*/
iommu_prot = IOMMU_CACHE;
if (map_flags & IOMMU_IOAS_MAP_WRITEABLE)
Looking at it I would say all the places that test
IOMMU_CAP_CACHE_COHERENCY can be replaced with dev_is_dma_coherent()
except for the one call in VFIO that is supporting the Intel no-snoop
behavior.
Then we can rename IOMMU_CAP_CACHE_COHERENCY to something like
IOMMU_CAP_ENFORCE_CACHE_COHERENCY and just create a
IOMMU_ENFORCE_CACHE prot flag for Intel IOMMU to use instead of
abusing IOMMU_CACHE.
Jason
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu