Message ID | 20240626082727.1278530-5-eric.auger@redhat.com |
---|---|
State | New |
Headers | show |
Series | VIRTIO-IOMMU/HostIOMMUDevice: Fixes and page size mask rework | expand |
On 6/26/24 10:26 AM, Eric Auger wrote: > This callback will be used to retrieve the page size mask supported > along a given Host IOMMU device. > > Signed-off-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Thanks, C. > --- > 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); > }; > > /* > 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[] = {
Hi Eric, >-----Original Message----- >From: Eric Auger <eric.auger@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.auger@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. 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
Hi Zhenzhong, On 6/27/24 05:06, Duan, Zhenzhong wrote: > Hi Eric, > >> -----Original Message----- >> From: Eric Auger <eric.auger@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.auger@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
>-----Original Message----- >From: Eric Auger <eric.auger@redhat.com> >Subject: Re: [PATCH 4/7] HostIOMMUDevice: Introduce >get_page_size_mask() callback > >Hi Zhenzhong, > >On 6/27/24 05:06, Duan, Zhenzhong wrote: >> Hi Eric, >> >>> -----Original Message----- >>> From: Eric Auger <eric.auger@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.auger@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. I see, you are right. Thanks Zhenzhong
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); }; /* 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[] = {
This callback will be used to retrieve the page size mask supported along a given Host IOMMU device. Signed-off-by: Eric Auger <eric.auger@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(+)