Hi Cédric,

>-----Original Message-----
>From: Cédric Le Goater <c...@redhat.com>
>Subject: [PATCH v1 11/16] vfio/container: Change VFIOContainerBase to use
>QOM
>
>VFIOContainerBase was made a QOM interface because we believed that a
>QOM object would expose all the IOMMU backends to the QEMU machine
>and
>human interface. This only applies to user creatable devices or objects.
>
>Change the VFIOContainerBase nature from interface to object and make
>the necessary adjustments in the VFIO_IOMMU hierarchy.
>
>Signed-off-by: Cédric Le Goater <c...@redhat.com>
>---
> include/hw/vfio/vfio-common.h         |  4 ++++
> include/hw/vfio/vfio-container-base.h | 12 +++---------
> hw/vfio/container-base.c              |  4 +++-
> hw/vfio/container.c                   |  1 +
> hw/vfio/iommufd.c                     |  1 +
> hw/vfio/spapr.c                       |  3 +++
> 6 files changed, 15 insertions(+), 10 deletions(-)
>
>diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-
>common.h
>index
>825d80130bd435fe50830c8ae5b7905d18104dd6..5d0b8496cf85bac8d4ea
>770fae04acc02d84df82 100644
>--- a/include/hw/vfio/vfio-common.h
>+++ b/include/hw/vfio/vfio-common.h
>@@ -84,6 +84,8 @@ typedef struct VFIOContainer {
>     QLIST_HEAD(, VFIOGroup) group_list;
> } VFIOContainer;
>
>+OBJECT_DECLARE_TYPE(VFIOContainer, VFIOIOMMUClass,
>VFIO_IOMMU_LEGACY);

What about using OBJECT_DECLARE_SIMPLE_TYPE?

>+
> typedef struct VFIOHostDMAWindow {
>     hwaddr min_iova;
>     hwaddr max_iova;
>@@ -99,6 +101,8 @@ typedef struct VFIOIOMMUFDContainer {
>     uint32_t ioas_id;
> } VFIOIOMMUFDContainer;
>
>+OBJECT_DECLARE_TYPE(VFIOIOMMUFDContainer, VFIOIOMMUClass,
>VFIO_IOMMU_IOMMUFD);

Same here.

>+
> typedef struct VFIODeviceOps VFIODeviceOps;
>
> typedef struct VFIODevice {
>diff --git a/include/hw/vfio/vfio-container-base.h b/include/hw/vfio/vfio-
>container-base.h
>index
>d505f63607ec40e6aa44aeb3e20848ac780562a1..b079b76f68975c5701a28
>9ce9012e912a8e44fc6 100644
>--- a/include/hw/vfio/vfio-container-base.h
>+++ b/include/hw/vfio/vfio-container-base.h
>@@ -34,6 +34,7 @@ typedef struct VFIOAddressSpace {
>  * This is the base object for vfio container backends
>  */
> typedef struct VFIOContainerBase {
>+    Object parent;
>     const VFIOIOMMUClass *ops;
>     VFIOAddressSpace *space;
>     MemoryListener listener;
>@@ -96,17 +97,10 @@ void vfio_container_destroy(VFIOContainerBase
>*bcontainer);
> #define TYPE_VFIO_IOMMU_SPAPR TYPE_VFIO_IOMMU "-spapr"
> #define TYPE_VFIO_IOMMU_IOMMUFD TYPE_VFIO_IOMMU "-iommufd"
>
>-/*
>- * VFIOContainerBase is not an abstract QOM object because it felt
>- * unnecessary to expose all the IOMMU backends to the QEMU machine
>- * and human interface. However, we can still abstract the IOMMU
>- * backend handlers using a QOM interface class. This provides more
>- * flexibility when referencing the various implementations.
>- */
>-DECLARE_CLASS_CHECKERS(VFIOIOMMUClass, VFIO_IOMMU,
>TYPE_VFIO_IOMMU)
>+OBJECT_DECLARE_TYPE(VFIOContainerBase, VFIOIOMMUClass,
>VFIO_IOMMU)
>
> struct VFIOIOMMUClass {
>-    InterfaceClass parent_class;
>+    ObjectClass parent_class;
>
>     /* Properties */
>     const char *hiod_typename;
>diff --git a/hw/vfio/container-base.c b/hw/vfio/container-base.c
>index
>280f0dd2db1fc3939fe9925ce00a2c50d0e14196..98c15e174dd78df5146ee8
>3c05c98f3ea9c1e52c 100644
>--- a/hw/vfio/container-base.c
>+++ b/hw/vfio/container-base.c
>@@ -102,8 +102,10 @@ void vfio_container_destroy(VFIOContainerBase
>*bcontainer)
> static const TypeInfo types[] = {
>     {
>         .name = TYPE_VFIO_IOMMU,
>-        .parent = TYPE_INTERFACE,
>+        .parent = TYPE_OBJECT,
>+        .instance_size = sizeof(VFIOContainerBase),
>         .class_size = sizeof(VFIOIOMMUClass),
>+        .abstract = true,
>     },
> };
>
>diff --git a/hw/vfio/container.c b/hw/vfio/container.c
>index
>983726f9514ec1106d521c9711a46a4780688ee1..f1519518d0b7efd2a6086
>f07bc497596a5236abf 100644
>--- a/hw/vfio/container.c
>+++ b/hw/vfio/container.c
>@@ -1194,6 +1194,7 @@ static const TypeInfo types[] = {
>     {
>         .name = TYPE_VFIO_IOMMU_LEGACY,
>         .parent = TYPE_VFIO_IOMMU,
>+        .instance_size = sizeof(VFIOContainer),
>         .class_init = vfio_iommu_legacy_class_init,
>     }, {
>         .name = TYPE_HOST_IOMMU_DEVICE_LEGACY_VFIO,
>diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c
>index
>d97a4f7393791660b90e340436c6e084c0781444..80ba09b859a02bb89823
>460064a9f099fd98cff0 100644
>--- a/hw/vfio/iommufd.c
>+++ b/hw/vfio/iommufd.c
>@@ -670,6 +670,7 @@ static const TypeInfo types[] = {
>     {
>         .name = TYPE_VFIO_IOMMU_IOMMUFD,
>         .parent = TYPE_VFIO_IOMMU,
>+        .instance_size = sizeof(VFIOIOMMUFDContainer),
>         .class_init = vfio_iommu_iommufd_class_init,
>     }, {
>         .name = TYPE_HOST_IOMMU_DEVICE_IOMMUFD_VFIO,
>diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c
>index
>47b040f1bcca7dd0b5cf052d941b43541e98a3c5..05a3cedc4b1703a615737
>30bc77fc15d44f7a9eb 100644
>--- a/hw/vfio/spapr.c
>+++ b/hw/vfio/spapr.c
>@@ -30,6 +30,8 @@ typedef struct VFIOSpaprContainer {
>     QLIST_HEAD(, VFIOHostDMAWindow) hostwin_list;
> } VFIOSpaprContainer;
>
>+OBJECT_DECLARE_TYPE(VFIOSpaprContainer, VFIOIOMMUClass,
>VFIO_IOMMU_SPAPR);

Same here.

Thanks
Zhenzhong

>+
> static bool vfio_prereg_listener_skipped_section(MemoryRegionSection
>*section)
> {
>     if (memory_region_is_iommu(section->mr)) {
>@@ -548,6 +550,7 @@ static const TypeInfo types[] = {
>     {
>         .name = TYPE_VFIO_IOMMU_SPAPR,
>         .parent = TYPE_VFIO_IOMMU_LEGACY,
>+        .instance_size = sizeof(VFIOSpaprContainer),
>         .class_init = vfio_iommu_spapr_class_init,
>     },
> };
>--
>2.45.2

Reply via email to