vfio/container: Introduce vfio_get_iommu_class_name()

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.

Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Tested-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
Cédric Le Goater 2024-06-17 08:34:00 +02:00
parent 55974f35ea
commit 17401879c4

View File

@ -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;