vfio iommu: Add dma available capability
[ Upstream commit7d6e132965
] The following functional changes were needed for backport: - vfio_iommu_type1_get_info doesn't exist, call vfio_iommu_dma_avail_build_caps from vfio_iommu_type1_ioctl. - As further fallout from this, vfio_iommu_dma_avail_build_caps must acquire and release the iommu mutex lock. To do so, the return value is stored in a local variable as in vfio_iommu_iova_build_caps. Upstream commit description: Commit492855939b
("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
335104082c
commit
5597557244
|
@ -2303,6 +2303,24 @@ out_unlock:
|
|||
return ret;
|
||||
}
|
||||
|
||||
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;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&iommu->lock);
|
||||
cap_dma_avail.header.id = VFIO_IOMMU_TYPE1_INFO_DMA_AVAIL;
|
||||
cap_dma_avail.header.version = 1;
|
||||
|
||||
cap_dma_avail.avail = iommu->dma_avail;
|
||||
|
||||
ret = vfio_info_add_capability(caps, &cap_dma_avail.header,
|
||||
sizeof(cap_dma_avail));
|
||||
mutex_unlock(&iommu->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long vfio_iommu_type1_ioctl(void *iommu_data,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
|
@ -2349,6 +2367,10 @@ static long vfio_iommu_type1_ioctl(void *iommu_data,
|
|||
info.iova_pgsizes = vfio_pgsize_bitmap(iommu);
|
||||
|
||||
ret = vfio_iommu_iova_build_caps(iommu, &caps);
|
||||
|
||||
if (!ret)
|
||||
ret = vfio_iommu_dma_avail_build_caps(iommu, &caps);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -748,6 +748,21 @@ struct vfio_iommu_type1_info_cap_iova_range {
|
|||
struct vfio_iova_range iova_ranges[];
|
||||
};
|
||||
|
||||
/*
|
||||
* 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)
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue