vfio: add vfio_device_prepare()

Commonize some initialization code shared by the legacy and iommufd vfio
implementations.

Reviewed-by: Cédric Le Goater <clg@redhat.com>
Signed-off-by: John Levon <john.levon@nutanix.com>
Link: https://lore.kernel.org/qemu-devel/20250507152020.1254632-2-john.levon@nutanix.com
Signed-off-by: Cédric Le Goater <clg@redhat.com>
This commit is contained in:
John Levon 2025-05-07 16:20:06 +01:00 committed by Cédric Le Goater
parent 1cab5a02ab
commit a901682f53
4 changed files with 20 additions and 20 deletions

View file

@ -826,18 +826,14 @@ static bool vfio_device_get(VFIOGroup *group, const char *name,
} }
} }
vfio_device_prepare(vbasedev, &group->container->bcontainer, info);
vbasedev->fd = fd; vbasedev->fd = fd;
vbasedev->group = group; vbasedev->group = group;
QLIST_INSERT_HEAD(&group->device_list, vbasedev, next); QLIST_INSERT_HEAD(&group->device_list, vbasedev, next);
vbasedev->num_irqs = info->num_irqs;
vbasedev->num_regions = info->num_regions;
vbasedev->flags = info->flags;
trace_vfio_device_get(name, info->flags, info->num_regions, info->num_irqs); trace_vfio_device_get(name, info->flags, info->num_regions, info->num_irqs);
vbasedev->reset_works = !!(info->flags & VFIO_DEVICE_FLAGS_RESET);
return true; return true;
} }
@ -890,7 +886,6 @@ static bool vfio_legacy_attach_device(const char *name, VFIODevice *vbasedev,
int groupid = vfio_device_get_groupid(vbasedev, errp); int groupid = vfio_device_get_groupid(vbasedev, errp);
VFIODevice *vbasedev_iter; VFIODevice *vbasedev_iter;
VFIOGroup *group; VFIOGroup *group;
VFIOContainerBase *bcontainer;
if (groupid < 0) { if (groupid < 0) {
return false; return false;
@ -919,11 +914,6 @@ static bool vfio_legacy_attach_device(const char *name, VFIODevice *vbasedev,
goto device_put_exit; goto device_put_exit;
} }
bcontainer = &group->container->bcontainer;
vbasedev->bcontainer = bcontainer;
QLIST_INSERT_HEAD(&bcontainer->device_list, vbasedev, container_next);
QLIST_INSERT_HEAD(&vfio_device_list, vbasedev, global_next);
return true; return true;
device_put_exit: device_put_exit:

View file

@ -398,3 +398,17 @@ void vfio_device_detach(VFIODevice *vbasedev)
} }
VFIO_IOMMU_GET_CLASS(vbasedev->bcontainer)->detach_device(vbasedev); VFIO_IOMMU_GET_CLASS(vbasedev->bcontainer)->detach_device(vbasedev);
} }
void vfio_device_prepare(VFIODevice *vbasedev, VFIOContainerBase *bcontainer,
struct vfio_device_info *info)
{
vbasedev->num_irqs = info->num_irqs;
vbasedev->num_regions = info->num_regions;
vbasedev->flags = info->flags;
vbasedev->reset_works = !!(info->flags & VFIO_DEVICE_FLAGS_RESET);
vbasedev->bcontainer = bcontainer;
QLIST_INSERT_HEAD(&bcontainer->device_list, vbasedev, container_next);
QLIST_INSERT_HEAD(&vfio_device_list, vbasedev, global_next);
}

View file

@ -588,14 +588,7 @@ found_container:
iommufd_cdev_ram_block_discard_disable(false); iommufd_cdev_ram_block_discard_disable(false);
} }
vbasedev->group = 0; vfio_device_prepare(vbasedev, bcontainer, &dev_info);
vbasedev->num_irqs = dev_info.num_irqs;
vbasedev->num_regions = dev_info.num_regions;
vbasedev->flags = dev_info.flags;
vbasedev->reset_works = !!(dev_info.flags & VFIO_DEVICE_FLAGS_RESET);
vbasedev->bcontainer = bcontainer;
QLIST_INSERT_HEAD(&bcontainer->device_list, vbasedev, container_next);
QLIST_INSERT_HEAD(&vfio_device_list, vbasedev, global_next);
trace_iommufd_cdev_device_info(vbasedev->name, devfd, vbasedev->num_irqs, trace_iommufd_cdev_device_info(vbasedev->name, devfd, vbasedev->num_irqs,
vbasedev->num_regions, vbasedev->flags); vbasedev->num_regions, vbasedev->flags);

View file

@ -134,6 +134,9 @@ typedef QLIST_HEAD(VFIODeviceList, VFIODevice) VFIODeviceList;
extern VFIODeviceList vfio_device_list; extern VFIODeviceList vfio_device_list;
#ifdef CONFIG_LINUX #ifdef CONFIG_LINUX
void vfio_device_prepare(VFIODevice *vbasedev, VFIOContainerBase *bcontainer,
struct vfio_device_info *info);
int vfio_device_get_region_info(VFIODevice *vbasedev, int index, int vfio_device_get_region_info(VFIODevice *vbasedev, int index,
struct vfio_region_info **info); struct vfio_region_info **info);
int vfio_device_get_region_info_type(VFIODevice *vbasedev, uint32_t type, int vfio_device_get_region_info_type(VFIODevice *vbasedev, uint32_t type,