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.
In order to implement it, a pointer to hwpt is added in vbasedev.
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
---
hw/vfio/iommufd.c | 31 +++++++++++++++++++++++++++++++
include/hw/vfio/vfio-common.h | 1 +
2 files changed, 32 insertions(+)
diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
index 286ad0b766..e532eed2ac 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)
{
@@ -218,6 +246,7 @@ static void vfio_device_detach_container(VFIODevice *vbasedev,
hwpt = vfio_find_hwpt_for_dev(container, vbasedev);
if (hwpt) {
QLIST_REMOVE(vbasedev, next);
+ vbasedev->hwpt = NULL;
if (QLIST_EMPTY(&hwpt->device_list)) {
vfio_container_put_hwpt(hwpt);
}
@@ -281,6 +310,7 @@ static int vfio_device_attach_container(VFIODevice *vbasedev,
hwpt = vfio_container_get_hwpt(container, attach_data.pt_id);
QLIST_INSERT_HEAD(&hwpt->device_list, vbasedev, next);
+ vbasedev->hwpt = hwpt;
return 0;
}
@@ -490,6 +520,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;
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
index 6434a442fd..d596e802b0 100644
--- a/include/hw/vfio/vfio-common.h
+++ b/include/hw/vfio/vfio-common.h
@@ -133,6 +133,7 @@ typedef struct VFIODevice {
#ifdef CONFIG_IOMMUFD
int devid;
IOMMUFDBackend *iommufd;
+ VFIOIOASHwpt *hwpt;
#endif
} VFIODevice;
--
2.34.1