Message ID | 20240617063409.34393-9-clg@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vfio: QOMify VFIOContainer | expand |
On 6/17/24 08:34, Cédric Le Goater wrote: > Rework vfio_get_iommu_class() to return a literal class name instead > of a class object. We will need this name to instantiate the object > later on. Since the default case asserts, remove the error report as > QEMU will simply abort before. > > Signed-off-by: Cédric Le Goater <clg@redhat.com> > Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Eric > --- > hw/vfio/container.c | 18 ++++++------------ > 1 file changed, 6 insertions(+), 12 deletions(-) > > diff --git a/hw/vfio/container.c b/hw/vfio/container.c > index 589f37bc6d68dae18f9e46371f14d6952b2240c0..bb6abe60ee29d5b69b494523c9002f53e1b2a3c8 100644 > --- a/hw/vfio/container.c > +++ b/hw/vfio/container.c > @@ -373,24 +373,20 @@ static int vfio_get_iommu_type(int container_fd, > /* > * vfio_get_iommu_ops - get a VFIOIOMMUClass associated with a type > */ > -static const VFIOIOMMUClass *vfio_get_iommu_class(int iommu_type, Error **errp) > +static const char *vfio_get_iommu_class_name(int iommu_type) > { > - ObjectClass *klass = NULL; > - > switch (iommu_type) { > case VFIO_TYPE1v2_IOMMU: > case VFIO_TYPE1_IOMMU: > - klass = object_class_by_name(TYPE_VFIO_IOMMU_LEGACY); > + return TYPE_VFIO_IOMMU_LEGACY; > break; > case VFIO_SPAPR_TCE_v2_IOMMU: > case VFIO_SPAPR_TCE_IOMMU: > - klass = object_class_by_name(TYPE_VFIO_IOMMU_SPAPR); > + return TYPE_VFIO_IOMMU_SPAPR; > break; > default: > g_assert_not_reached(); > }; > - > - return VFIO_IOMMU_CLASS(klass); > } > > static bool vfio_set_iommu(VFIOContainer *container, int group_fd, > @@ -398,6 +394,7 @@ static bool vfio_set_iommu(VFIOContainer *container, int group_fd, > { > int iommu_type; > const VFIOIOMMUClass *vioc; > + const char *vioc_name; > > iommu_type = vfio_get_iommu_type(container->fd, errp); > if (iommu_type < 0) { > @@ -426,11 +423,8 @@ static bool vfio_set_iommu(VFIOContainer *container, int group_fd, > > container->iommu_type = iommu_type; > > - vioc = vfio_get_iommu_class(iommu_type, errp); > - if (!vioc) { > - error_setg(errp, "No available IOMMU models"); > - return false; > - } > + vioc_name = vfio_get_iommu_class_name(iommu_type); > + vioc = VFIO_IOMMU_CLASS(object_class_by_name(vioc_name)); > > vfio_container_init(&container->bcontainer, vioc); > return true;
diff --git a/hw/vfio/container.c b/hw/vfio/container.c index 589f37bc6d68dae18f9e46371f14d6952b2240c0..bb6abe60ee29d5b69b494523c9002f53e1b2a3c8 100644 --- a/hw/vfio/container.c +++ b/hw/vfio/container.c @@ -373,24 +373,20 @@ static int vfio_get_iommu_type(int container_fd, /* * vfio_get_iommu_ops - get a VFIOIOMMUClass associated with a type */ -static const VFIOIOMMUClass *vfio_get_iommu_class(int iommu_type, Error **errp) +static const char *vfio_get_iommu_class_name(int iommu_type) { - ObjectClass *klass = NULL; - switch (iommu_type) { case VFIO_TYPE1v2_IOMMU: case VFIO_TYPE1_IOMMU: - klass = object_class_by_name(TYPE_VFIO_IOMMU_LEGACY); + return TYPE_VFIO_IOMMU_LEGACY; break; case VFIO_SPAPR_TCE_v2_IOMMU: case VFIO_SPAPR_TCE_IOMMU: - klass = object_class_by_name(TYPE_VFIO_IOMMU_SPAPR); + return TYPE_VFIO_IOMMU_SPAPR; break; default: g_assert_not_reached(); }; - - return VFIO_IOMMU_CLASS(klass); } static bool vfio_set_iommu(VFIOContainer *container, int group_fd, @@ -398,6 +394,7 @@ static bool vfio_set_iommu(VFIOContainer *container, int group_fd, { int iommu_type; const VFIOIOMMUClass *vioc; + const char *vioc_name; iommu_type = vfio_get_iommu_type(container->fd, errp); if (iommu_type < 0) { @@ -426,11 +423,8 @@ static bool vfio_set_iommu(VFIOContainer *container, int group_fd, container->iommu_type = iommu_type; - vioc = vfio_get_iommu_class(iommu_type, errp); - if (!vioc) { - error_setg(errp, "No available IOMMU models"); - return false; - } + vioc_name = vfio_get_iommu_class_name(iommu_type); + vioc = VFIO_IOMMU_CLASS(object_class_by_name(vioc_name)); vfio_container_init(&container->bcontainer, vioc); return true;