vfio: remove the iommudata hack for noiommu groups
Just pass a noiommu argument to vfio_create_group and set up the ->noiommu flag directly. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Link: https://lore.kernel.org/r/20210924155705.4258-7-hch@lst.de Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
parent
3af9177132
commit
c04ac34078
|
@ -335,7 +335,8 @@ static void vfio_group_unlock_and_free(struct vfio_group *group)
|
|||
/**
|
||||
* Group objects - create, release, get, put, search
|
||||
*/
|
||||
static struct vfio_group *vfio_create_group(struct iommu_group *iommu_group)
|
||||
static struct vfio_group *vfio_create_group(struct iommu_group *iommu_group,
|
||||
bool noiommu)
|
||||
{
|
||||
struct vfio_group *group, *tmp;
|
||||
struct device *dev;
|
||||
|
@ -354,9 +355,7 @@ static struct vfio_group *vfio_create_group(struct iommu_group *iommu_group)
|
|||
atomic_set(&group->opened, 0);
|
||||
init_waitqueue_head(&group->container_q);
|
||||
group->iommu_group = iommu_group;
|
||||
#ifdef CONFIG_VFIO_NOIOMMU
|
||||
group->noiommu = (iommu_group_get_iommudata(iommu_group) == &noiommu);
|
||||
#endif
|
||||
group->noiommu = noiommu;
|
||||
BLOCKING_INIT_NOTIFIER_HEAD(&group->notifier);
|
||||
|
||||
group->nb.notifier_call = vfio_iommu_group_notifier;
|
||||
|
@ -791,12 +790,11 @@ static struct vfio_group *vfio_noiommu_group_alloc(struct device *dev)
|
|||
return ERR_CAST(iommu_group);
|
||||
|
||||
iommu_group_set_name(iommu_group, "vfio-noiommu");
|
||||
iommu_group_set_iommudata(iommu_group, &noiommu, NULL);
|
||||
ret = iommu_group_add_device(iommu_group, dev);
|
||||
if (ret)
|
||||
goto out_put_group;
|
||||
|
||||
group = vfio_create_group(iommu_group);
|
||||
group = vfio_create_group(iommu_group, true);
|
||||
if (IS_ERR(group)) {
|
||||
ret = PTR_ERR(group);
|
||||
goto out_remove_device;
|
||||
|
@ -843,7 +841,7 @@ static struct vfio_group *vfio_group_find_or_alloc(struct device *dev)
|
|||
goto out_put;
|
||||
|
||||
/* a newly created vfio_group keeps the reference. */
|
||||
group = vfio_create_group(iommu_group);
|
||||
group = vfio_create_group(iommu_group, false);
|
||||
if (IS_ERR(group))
|
||||
goto out_put;
|
||||
return group;
|
||||
|
@ -874,10 +872,8 @@ int vfio_register_group_dev(struct vfio_device *device)
|
|||
dev_WARN(device->dev, "Device already exists on group %d\n",
|
||||
iommu_group_id(group->iommu_group));
|
||||
vfio_device_put(existing_device);
|
||||
#ifdef CONFIG_VFIO_NOIOMMU
|
||||
if (iommu_group_get_iommudata(group->iommu_group) == &noiommu)
|
||||
if (group->noiommu)
|
||||
iommu_group_remove_device(device->dev);
|
||||
#endif
|
||||
vfio_group_put(group);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
@ -1023,10 +1019,9 @@ void vfio_unregister_group_dev(struct vfio_device *device)
|
|||
if (list_empty(&group->device_list))
|
||||
wait_event(group->container_q, !group->container);
|
||||
|
||||
#ifdef CONFIG_VFIO_NOIOMMU
|
||||
if (iommu_group_get_iommudata(group->iommu_group) == &noiommu)
|
||||
if (group->noiommu)
|
||||
iommu_group_remove_device(device->dev);
|
||||
#endif
|
||||
|
||||
/* Matches the get in vfio_register_group_dev() */
|
||||
vfio_group_put(group);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue