Hi Zhenzhong, On 6/27/24 05:06, Duan, Zhenzhong wrote: > Hi Eric, > >> -----Original Message----- >> From: Eric Auger <eric.au...@redhat.com> >> Subject: [PATCH 4/7] HostIOMMUDevice: Introduce get_page_size_mask() >> callback >> >> This callback will be used to retrieve the page size mask supported >> along a given Host IOMMU device. >> >> Signed-off-by: Eric Auger <eric.au...@redhat.com> >> --- >> include/hw/vfio/vfio-container-base.h | 7 +++++++ >> include/sysemu/host_iommu_device.h | 8 ++++++++ >> hw/vfio/container.c | 10 ++++++++++ >> hw/vfio/iommufd.c | 11 +++++++++++ >> 4 files changed, 36 insertions(+) >> >> diff --git a/include/hw/vfio/vfio-container-base.h b/include/hw/vfio/vfio- >> container-base.h >> index 45d7c40fce..62a8b60d87 100644 >> --- a/include/hw/vfio/vfio-container-base.h >> +++ b/include/hw/vfio/vfio-container-base.h >> @@ -88,6 +88,13 @@ int vfio_container_query_dirty_bitmap(const >> VFIOContainerBase *bcontainer, >> >> GList *vfio_container_get_iova_ranges(const VFIOContainerBase >> *bcontainer); >> >> +static inline uint64_t >> +vfio_container_get_page_size_mask(const VFIOContainerBase *bcontainer) >> +{ >> + assert(bcontainer); >> + return bcontainer->pgsizes; >> +} >> + >> #define TYPE_VFIO_IOMMU "vfio-iommu" >> #define TYPE_VFIO_IOMMU_LEGACY TYPE_VFIO_IOMMU "-legacy" >> #define TYPE_VFIO_IOMMU_SPAPR TYPE_VFIO_IOMMU "-spapr" >> diff --git a/include/sysemu/host_iommu_device.h >> b/include/sysemu/host_iommu_device.h >> index 05c7324a0d..c1bf74ae2c 100644 >> --- a/include/sysemu/host_iommu_device.h >> +++ b/include/sysemu/host_iommu_device.h >> @@ -89,6 +89,14 @@ struct HostIOMMUDeviceClass { >> * @hiod: handle to the host IOMMU device >> */ >> GList* (*get_iova_ranges)(HostIOMMUDevice *hiod); >> + /** >> + * >> + * @get_page_size_mask: Return the page size mask supported along >> this >> + * @hiod Host IOMMU device >> + * >> + * @hiod: handle to the host IOMMU device >> + */ >> + uint64_t (*get_page_size_mask)(HostIOMMUDevice *hiod); > Not sure if it's simpler to utilize existing .get_cap() to get pgsizes. I chose to introduce a new callback because the page_mask can be U64_MAX and get_cap is likely to return a negative value. So we could not distinguish between an error and a full mask.
Thanks Eric > > Thanks > Zhenzhong > >> }; >> >> /* >> diff --git a/hw/vfio/container.c b/hw/vfio/container.c >> index adeab1ac89..b5ce559a0d 100644 >> --- a/hw/vfio/container.c >> +++ b/hw/vfio/container.c >> @@ -1174,6 +1174,15 @@ >> hiod_legacy_vfio_get_iova_ranges(HostIOMMUDevice *hiod) >> return vfio_container_get_iova_ranges(vdev->bcontainer); >> } >> >> +static uint64_t >> +hiod_legacy_vfio_get_page_size_mask(HostIOMMUDevice *hiod) >> +{ >> + VFIODevice *vdev = hiod->agent; >> + >> + g_assert(vdev); >> + return vfio_container_get_page_size_mask(vdev->bcontainer); >> +} >> + >> static void vfio_iommu_legacy_instance_init(Object *obj) >> { >> VFIOContainer *container = VFIO_IOMMU_LEGACY(obj); >> @@ -1188,6 +1197,7 @@ static void >> hiod_legacy_vfio_class_init(ObjectClass *oc, void *data) >> hioc->realize = hiod_legacy_vfio_realize; >> hioc->get_cap = hiod_legacy_vfio_get_cap; >> hioc->get_iova_ranges = hiod_legacy_vfio_get_iova_ranges; >> + hioc->get_page_size_mask = hiod_legacy_vfio_get_page_size_mask; >> }; >> >> static const TypeInfo types[] = { >> diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c >> index 211e7223f1..7b5f87a148 100644 >> --- a/hw/vfio/iommufd.c >> +++ b/hw/vfio/iommufd.c >> @@ -652,12 +652,23 @@ >> hiod_iommufd_vfio_get_iova_ranges(HostIOMMUDevice *hiod) >> return vfio_container_get_iova_ranges(vdev->bcontainer); >> } >> >> +static uint64_t >> +hiod_iommufd_vfio_get_page_size_mask(HostIOMMUDevice *hiod) >> +{ >> + VFIODevice *vdev = hiod->agent; >> + >> + g_assert(vdev); >> + return vfio_container_get_page_size_mask(vdev->bcontainer); >> +} >> + >> + >> 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; >> + hiodc->get_page_size_mask = hiod_iommufd_vfio_get_page_size_mask; >> }; >> >> static const TypeInfo types[] = { >> -- >> 2.41.0