Hi, On 6/11/24 05:24, Duan, Zhenzhong wrote: > >> -----Original Message----- >> From: Eric Auger <eric.au...@redhat.com> >> Subject: [RFC v2 3/7] HostIOMMUDevice: Introduce get_iova_ranges >> callback >> >> Introduce a new HostIOMMUDevice callback that allows to >> retrieve the usable IOVA ranges. >> >> Implement this callback in the legacy VFIO and IOMMUFD VFIO >> host iommu devices. This relies on the VFIODevice agent's >> base container iova_ranges resource. >> >> Signed-off-by: Eric Auger <eric.au...@redhat.com> >> --- >> include/sysemu/host_iommu_device.h | 8 ++++++++ >> hw/vfio/container.c | 14 ++++++++++++++ >> hw/vfio/iommufd.c | 14 ++++++++++++++ >> 3 files changed, 36 insertions(+) >> >> diff --git a/include/sysemu/host_iommu_device.h >> b/include/sysemu/host_iommu_device.h >> index 3e5f058e7b..40e0fa13ef 100644 >> --- a/include/sysemu/host_iommu_device.h >> +++ b/include/sysemu/host_iommu_device.h >> @@ -80,6 +80,14 @@ struct HostIOMMUDeviceClass { >> * i.e., HOST_IOMMU_DEVICE_CAP_AW_BITS. >> */ >> int (*get_cap)(HostIOMMUDevice *hiod, int cap, Error **errp); >> + /** >> + * @get_iova_ranges: Return the list of usable iova_ranges along with >> + * @hiod Host IOMMU device >> + * >> + * @hiod: handle to the host IOMMU device >> + * @errp: error handle >> + */ >> + GList* (*get_iova_ranges)(HostIOMMUDevice *hiod, Error **errp); > Previous I thought expose iova_ranges directly in > HostIOMMUDevice::caps.iova_ranges, > But a new callback looks better for a Glist pointer. OK so we are aligned. > >> }; >> >> /* >> diff --git a/hw/vfio/container.c b/hw/vfio/container.c >> index b728b978a2..edd0df6262 100644 >> --- a/hw/vfio/container.c >> +++ b/hw/vfio/container.c >> @@ -1164,12 +1164,26 @@ static int >> hiod_legacy_vfio_get_cap(HostIOMMUDevice *hiod, int cap, >> } >> } >> >> +static GList * >> +hiod_legacy_vfio_get_iova_ranges(HostIOMMUDevice *hiod, Error **errp) >> +{ >> + VFIODevice *vdev = hiod->agent; >> + GList *l = NULL; > g_assert(vdev)? yes > >> + >> + if (vdev && vdev->bcontainer) { >> + l = g_list_copy(vdev->bcontainer->iova_ranges); >> + } >> + >> + return l; >> +} >> + >> static void hiod_legacy_vfio_class_init(ObjectClass *oc, void *data) >> { >> HostIOMMUDeviceClass *hioc = HOST_IOMMU_DEVICE_CLASS(oc); >> >> hioc->realize = hiod_legacy_vfio_realize; >> hioc->get_cap = hiod_legacy_vfio_get_cap; >> + hioc->get_iova_ranges = hiod_legacy_vfio_get_iova_ranges; >> }; >> >> static const TypeInfo types[] = { >> diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c >> index dbdae1adbb..1706784063 100644 >> --- a/hw/vfio/iommufd.c >> +++ b/hw/vfio/iommufd.c >> @@ -645,11 +645,25 @@ static bool >> hiod_iommufd_vfio_realize(HostIOMMUDevice *hiod, void *opaque, >> return true; >> } >> >> +static GList * >> +hiod_iommufd_vfio_get_iova_ranges(HostIOMMUDevice *hiod, Error >> **errp) >> +{ >> + VFIODevice *vdev = hiod->agent; >> + GList *l = NULL; >> + > Same here. yes
Thanks Eric > > Thanks > Zhenzhong > >> + if (vdev && vdev->bcontainer) { >> + l = g_list_copy(vdev->bcontainer->iova_ranges); >> + } >> + >> + return l; >> +} >> + >> static void hiod_iommufd_vfio_class_init(ObjectClass *oc, void *data) >> { >> HostIOMMUDeviceClass *hiodc = HOST_IOMMU_DEVICE_CLASS(oc); >> >> hiodc->realize = hiod_iommufd_vfio_realize; >> + hiodc->get_iova_ranges = hiod_iommufd_vfio_get_iova_ranges; >> }; >> >> static const TypeInfo types[] = { >> -- >> 2.41.0