vfio iommu: Add dma available capability
authorMatthew Rosato <mjrosato@linux.ibm.com>
Tue, 15 Sep 2020 19:05:18 +0000 (15:05 -0400)
committerAlex Williamson <alex.williamson@redhat.com>
Mon, 21 Sep 2020 20:58:34 +0000 (14:58 -0600)
Commit 492855939bdb ("vfio/type1: Limit DMA mappings per container")
added the ability to limit the number of memory backed DMA mappings.
However on s390x, when lazy mapping is in use, we use a very large
number of concurrent mappings.  Let's provide the current allowable
number of DMA mappings to userspace via the IOMMU info chain so that
userspace can take appropriate mitigation.

Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/vfio_iommu_type1.c
include/uapi/linux/vfio.h

index 5fbf0c1..15e21db 100644 (file)
@@ -2609,6 +2609,20 @@ static int vfio_iommu_migration_build_caps(struct vfio_iommu *iommu,
        return vfio_info_add_capability(caps, &cap_mig.header, sizeof(cap_mig));
 }
 
+static int vfio_iommu_dma_avail_build_caps(struct vfio_iommu *iommu,
+                                          struct vfio_info_cap *caps)
+{
+       struct vfio_iommu_type1_info_dma_avail cap_dma_avail;
+
+       cap_dma_avail.header.id = VFIO_IOMMU_TYPE1_INFO_DMA_AVAIL;
+       cap_dma_avail.header.version = 1;
+
+       cap_dma_avail.avail = iommu->dma_avail;
+
+       return vfio_info_add_capability(caps, &cap_dma_avail.header,
+                                       sizeof(cap_dma_avail));
+}
+
 static int vfio_iommu_type1_get_info(struct vfio_iommu *iommu,
                                     unsigned long arg)
 {
@@ -2642,6 +2656,9 @@ static int vfio_iommu_type1_get_info(struct vfio_iommu *iommu,
        ret = vfio_iommu_migration_build_caps(iommu, &caps);
 
        if (!ret)
+               ret = vfio_iommu_dma_avail_build_caps(iommu, &caps);
+
+       if (!ret)
                ret = vfio_iommu_iova_build_caps(iommu, &caps);
 
        mutex_unlock(&iommu->lock);
index 9204705..3891e03 100644 (file)
@@ -1039,6 +1039,21 @@ struct vfio_iommu_type1_info_cap_migration {
        __u64   max_dirty_bitmap_size;          /* in bytes */
 };
 
+/*
+ * The DMA available capability allows to report the current number of
+ * simultaneously outstanding DMA mappings that are allowed.
+ *
+ * The structure below defines version 1 of this capability.
+ *
+ * avail: specifies the current number of outstanding DMA mappings allowed.
+ */
+#define VFIO_IOMMU_TYPE1_INFO_DMA_AVAIL 3
+
+struct vfio_iommu_type1_info_dma_avail {
+       struct  vfio_info_cap_header header;
+       __u32   avail;
+};
+
 #define VFIO_IOMMU_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12)
 
 /**