mirror of https://gitee.com/openkylin/linux.git
vfio iommu: Add dma available capability
Commit 492855939b
("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>
This commit is contained in:
parent
ba4f184e12
commit
7d6e132965
|
@ -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));
|
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,
|
static int vfio_iommu_type1_get_info(struct vfio_iommu *iommu,
|
||||||
unsigned long arg)
|
unsigned long arg)
|
||||||
{
|
{
|
||||||
|
@ -2641,6 +2655,9 @@ static int vfio_iommu_type1_get_info(struct vfio_iommu *iommu,
|
||||||
|
|
||||||
ret = vfio_iommu_migration_build_caps(iommu, &caps);
|
ret = vfio_iommu_migration_build_caps(iommu, &caps);
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
ret = vfio_iommu_dma_avail_build_caps(iommu, &caps);
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = vfio_iommu_iova_build_caps(iommu, &caps);
|
ret = vfio_iommu_iova_build_caps(iommu, &caps);
|
||||||
|
|
||||||
|
|
|
@ -1039,6 +1039,21 @@ struct vfio_iommu_type1_info_cap_migration {
|
||||||
__u64 max_dirty_bitmap_size; /* in bytes */
|
__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)
|
#define VFIO_IOMMU_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue