Skip to content

Commit

Permalink
vfio/container: Introduce a VFIOIOMMU legacy QOM interface
Browse files Browse the repository at this point in the history
Convert the legacy VFIOIOMMUOps struct to the new VFIOIOMMU QOM
interface. The set of of operations for this backend can be referenced
with a literal typename instead of a C struct. This will simplify
support of multiple backends.

Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Tested-by: Eric Farman <farman@linux.ibm.com>
Signed-off-by: Cédric Le Goater <clg@redhat.com>
  • Loading branch information
legoater committed Jan 5, 2024
1 parent fdaa774 commit 9812fee
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 11 deletions.
6 changes: 5 additions & 1 deletion hw/vfio/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -1503,13 +1503,17 @@ struct vfio_device_info *vfio_get_device_info(int fd)
int vfio_attach_device(char *name, VFIODevice *vbasedev,
AddressSpace *as, Error **errp)
{
const VFIOIOMMUClass *ops = &vfio_legacy_ops;
const VFIOIOMMUClass *ops =
VFIO_IOMMU_CLASS(object_class_by_name(TYPE_VFIO_IOMMU_LEGACY));

#ifdef CONFIG_IOMMUFD
if (vbasedev->iommufd) {
ops = &vfio_iommufd_ops;
}
#endif

assert(ops);

return ops->attach_device(name, vbasedev, as, errp);
}

Expand Down
58 changes: 49 additions & 9 deletions hw/vfio/container.c
Original file line number Diff line number Diff line change
Expand Up @@ -369,10 +369,30 @@ static int vfio_get_iommu_type(VFIOContainer *container,
return -EINVAL;
}

/*
* vfio_get_iommu_ops - get a VFIOIOMMUClass associated with a type
*/
static const VFIOIOMMUClass *vfio_get_iommu_class(int iommu_type, Error **errp)
{
ObjectClass *klass = NULL;

switch (iommu_type) {
case VFIO_TYPE1v2_IOMMU:
case VFIO_TYPE1_IOMMU:
klass = object_class_by_name(TYPE_VFIO_IOMMU_LEGACY);
break;
default:
g_assert_not_reached();
};

return VFIO_IOMMU_CLASS(klass);
}

static int vfio_init_container(VFIOContainer *container, int group_fd,
VFIOAddressSpace *space, Error **errp)
{
int iommu_type, ret;
const VFIOIOMMUClass *vioc;

iommu_type = vfio_get_iommu_type(container, errp);
if (iommu_type < 0) {
Expand Down Expand Up @@ -401,7 +421,14 @@ static int vfio_init_container(VFIOContainer *container, int group_fd,
}

container->iommu_type = iommu_type;
vfio_container_init(&container->bcontainer, space, &vfio_legacy_ops);

vioc = vfio_get_iommu_class(iommu_type, errp);
if (!vioc) {
error_setg(errp, "No available IOMMU models");
return -EINVAL;
}

vfio_container_init(&container->bcontainer, space, vioc);
return 0;
}

Expand Down Expand Up @@ -1098,12 +1125,25 @@ static int vfio_legacy_pci_hot_reset(VFIODevice *vbasedev, bool single)
return ret;
}

const VFIOIOMMUOps vfio_legacy_ops = {
.dma_map = vfio_legacy_dma_map,
.dma_unmap = vfio_legacy_dma_unmap,
.attach_device = vfio_legacy_attach_device,
.detach_device = vfio_legacy_detach_device,
.set_dirty_page_tracking = vfio_legacy_set_dirty_page_tracking,
.query_dirty_bitmap = vfio_legacy_query_dirty_bitmap,
.pci_hot_reset = vfio_legacy_pci_hot_reset,
static void vfio_iommu_legacy_class_init(ObjectClass *klass, void *data)
{
VFIOIOMMUClass *vioc = VFIO_IOMMU_CLASS(klass);

vioc->dma_map = vfio_legacy_dma_map;
vioc->dma_unmap = vfio_legacy_dma_unmap;
vioc->attach_device = vfio_legacy_attach_device;
vioc->detach_device = vfio_legacy_detach_device;
vioc->set_dirty_page_tracking = vfio_legacy_set_dirty_page_tracking;
vioc->query_dirty_bitmap = vfio_legacy_query_dirty_bitmap;
vioc->pci_hot_reset = vfio_legacy_pci_hot_reset;
};

static const TypeInfo types[] = {
{
.name = TYPE_VFIO_IOMMU_LEGACY,
.parent = TYPE_VFIO_IOMMU,
.class_init = vfio_iommu_legacy_class_init,
},
};

DEFINE_TYPES(types)
1 change: 0 additions & 1 deletion include/hw/vfio/vfio-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,6 @@ typedef QLIST_HEAD(VFIOGroupList, VFIOGroup) VFIOGroupList;
typedef QLIST_HEAD(VFIODeviceList, VFIODevice) VFIODeviceList;
extern VFIOGroupList vfio_group_list;
extern VFIODeviceList vfio_device_list;
extern const VFIOIOMMUOps vfio_legacy_ops;
extern const VFIOIOMMUOps vfio_iommufd_ops;
extern const MemoryListener vfio_memory_listener;
extern int vfio_kvm_device_fd;
Expand Down
1 change: 1 addition & 0 deletions include/hw/vfio/vfio-container-base.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ void vfio_container_destroy(VFIOContainerBase *bcontainer);


#define TYPE_VFIO_IOMMU "vfio-iommu"
#define TYPE_VFIO_IOMMU_LEGACY TYPE_VFIO_IOMMU "-legacy"

/*
* VFIOContainerBase is not an abstract QOM object because it felt
Expand Down

0 comments on commit 9812fee

Please sign in to comment.