The way to get vfio device pointer is different between legacy container and iommufd container, with iommufd backend support added, it's time to add the iterator support for iommufd.
Signed-off-by: Zhenzhong Duan <zhenzhong.d...@intel.com> --- hw/vfio/iommufd.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c index 876d0e4928..dd24e76e39 100644 --- a/hw/vfio/iommufd.c +++ b/hw/vfio/iommufd.c @@ -36,6 +36,34 @@ #include "qemu/cutils.h" #include "qemu/char_dev.h" +static VFIODevice *iommufd_dev_iter_next(VFIOContainer *bcontainer, + VFIODevice *curr) +{ + + VFIOIOASHwpt *hwpt; + + assert(object_class_dynamic_cast(OBJECT_CLASS(bcontainer->ops), + TYPE_VFIO_IOMMU_BACKEND_IOMMUFD_OPS)); + + VFIOIOMMUFDContainer *container = container_of(bcontainer, + VFIOIOMMUFDContainer, + bcontainer); + + if (!curr) { + hwpt = QLIST_FIRST(&container->hwpt_list); + } else { + if (curr->next.le_next) { + return curr->next.le_next; + } + hwpt = curr->hwpt->next.le_next; + } + + if (!hwpt) { + return NULL; + } + return QLIST_FIRST(&hwpt->device_list); +} + static int iommufd_map(VFIOContainer *bcontainer, hwaddr iova, ram_addr_t size, void *vaddr, bool readonly) { @@ -501,6 +529,7 @@ static void vfio_iommu_backend_iommufd_ops_class_init(ObjectClass *oc, void *data) { VFIOIOMMUBackendOpsClass *ops = VFIO_IOMMU_BACKEND_OPS_CLASS(oc); + ops->dev_iter_next = iommufd_dev_iter_next; ops->dma_map = iommufd_map; ops->dma_unmap = iommufd_unmap; ops->attach_device = iommufd_attach_device; -- 2.34.1