[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 28/37] vfio/iommufd: Add support for iova_ranges
|
From: |
Zhenzhong Duan |
|
Subject: |
[PATCH v3 28/37] vfio/iommufd: Add support for iova_ranges |
|
Date: |
Thu, 26 Oct 2023 18:30:55 +0800 |
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.duan@intel.com>
---
hw/vfio/iommufd.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
index c1daaf1c39..18a09d7f5a 100644
--- a/hw/vfio/iommufd.c
+++ b/hw/vfio/iommufd.c
@@ -348,6 +348,52 @@ static int vfio_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 = (uint64_t)(info + 1);
+
+ ret = ioctl(fd, IOMMU_IOAS_IOVA_RANGES, info);
+ if (ret) {
+ goto error;
+ }
+
+ iova_ranges = (struct iommu_iova_range *)info->allowed_iovas;
+
+ for (int i = 0; i < info->num_iovas; i++) {
+ Range *range = g_new(Range, 1);
+
+ range_set_bounds(range, iova_ranges[i].start, iova_ranges[i].last);
+ bcontainer->iova_ranges =
+ range_list_insert(bcontainer->iova_ranges, range);
+ }
+
+ g_free(info);
+ return 0;
+
+error:
+ ret = -errno;
+ g_free(info);
+ error_report("vfio/iommufd: Cannot get iova ranges: %m");
+ return ret;
+}
+
static int iommufd_attach_device(char *name, VFIODevice *vbasedev,
AddressSpace *as, Error **errp)
{
@@ -425,6 +471,7 @@ static int iommufd_attach_device(char *name, VFIODevice
*vbasedev,
}
bcontainer->pgsizes = qemu_real_host_page_size();
+ vfio_get_info_iova_range(container, ioas_id);
bcontainer->listener = vfio_memory_listener;
memory_listener_register(&bcontainer->listener, bcontainer->space->as);
--
2.34.1
- RE: [PATCH v3 24/37] backends/iommufd: Introduce the iommufd object, (continued)
- [PATCH v3 20/37] vfio/spapr: switch to spapr IOMMU BE add/del_section_window, Zhenzhong Duan, 2023/10/26
- [PATCH v3 22/37] vfio/spapr: Move hostwin_list into spapr container, Zhenzhong Duan, 2023/10/26
- [PATCH v3 21/37] vfio/spapr: Move prereg_listener into spapr container, Zhenzhong Duan, 2023/10/26
- [PATCH v3 23/37] Add iommufd configure option, Zhenzhong Duan, 2023/10/26
- [PATCH v3 26/37] vfio/iommufd: Implement the iommufd backend, Zhenzhong Duan, 2023/10/26
- [PATCH v3 27/37] vfio/iommufd: Switch to manual hwpt allocation, Zhenzhong Duan, 2023/10/26
- [PATCH v3 28/37] vfio/iommufd: Add support for iova_ranges,
Zhenzhong Duan <=
- [PATCH v3 30/37] vfio/pci: Extract out a helper vfio_pci_get_pci_hot_reset_info, Zhenzhong Duan, 2023/10/26
- [PATCH v3 31/37] vfio/pci: Adapt vfio pci hot reset support with iommufd BE, Zhenzhong Duan, 2023/10/26
- [PATCH v3 29/37] vfio/iommufd: Bypass EEH if iommufd backend, Zhenzhong Duan, 2023/10/26