>-----Original Message----- >From: Cédric Le Goater <c...@redhat.com> >Sent: Tuesday, November 7, 2023 1:19 AM >Subject: Re: [PATCH v4 30/41] vfio/iommufd: Add support for iova_ranges > >On 11/2/23 08:12, Zhenzhong Duan wrote: >> Some vIOMMU such as virtio-iommu use iova ranges from host side to >> setup reserved ranges for passthrough device, so that guest will not >> use an iova range beyond host support. >> >> Use an uAPI of IOMMUFD to get iova ranges of host side and pass to >> vIOMMU just like the legacy backend. >> >> Signed-off-by: Zhenzhong Duan <zhenzhong.d...@intel.com> >> --- >> v4: fix build error in 32bit fedora >> >> hw/vfio/iommufd.c | 47 >+++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 47 insertions(+) >> >> diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c >> index 1bb55ca2c4..22f02f92a9 100644 >> --- a/hw/vfio/iommufd.c >> +++ b/hw/vfio/iommufd.c >> @@ -341,6 +341,52 @@ static int iommufd_ram_block_discard_disable(bool >state) >> return ram_block_uncoordinated_discard_disable(state); >> } >> >> +static int vfio_get_info_iova_range(VFIOIOMMUFDContainer *container, >> + uint32_t ioas_id) >> +{ >> + VFIOContainerBase *bcontainer = &container->bcontainer; >> + struct iommu_ioas_iova_ranges *info; >> + struct iommu_iova_range *iova_ranges; >> + int ret, sz, fd = container->be->fd; >> + >> + info = g_malloc0(sizeof(*info)); >> + info->size = sizeof(*info); >> + info->ioas_id = ioas_id; >> + >> + ret = ioctl(fd, IOMMU_IOAS_IOVA_RANGES, info); >> + if (ret && errno != EMSGSIZE) { >> + goto error; >> + } >> + >> + sz = info->num_iovas * sizeof(struct iommu_iova_range); >> + info = g_realloc(info, sizeof(*info) + sz); >> + info->allowed_iovas = (uintptr_t)(info + 1); >> + >> + ret = ioctl(fd, IOMMU_IOAS_IOVA_RANGES, info); >> + if (ret) { >> + goto error; >> + } >> + >> + iova_ranges = (struct iommu_iova_range *)info->allowed_iovas; > >iova_ranges = (struct iommu_iova_range *)(uintptr_t)info->allowed_iovas;
Will fix, thanks for point out. BRs. Zhenzhong