summaryrefslogtreecommitdiff
path: root/drivers/vfio
diff options
context:
space:
mode:
authorYi Liu <yi.l.liu@intel.com>2022-11-10 18:26:09 +0300
committerJason Gunthorpe <jgg@nvidia.com>2022-12-05 15:56:01 +0300
commit07b465863325faceb865871ff5f22c1ebba6df54 (patch)
tree629065f997b0ef062480f2f96100602b5284618b /drivers/vfio
parent49ea02d390a34a538a3f54b9ce5665e474690bc7 (diff)
downloadlinux-07b465863325faceb865871ff5f22c1ebba6df54.tar.xz
vfio: Swap order of vfio_device_container_register() and open_device()
This makes the DMA unmap callback registration to container be consistent across the vfio iommufd compat mode and the legacy container mode. In the vfio iommufd compat mode, this registration is done in the vfio_iommufd_bind() when creating access which has an unmap callback. This is prior to calling the open_device() op. The existing mdev drivers have been converted to be OK with this order. So it is ok to swap the order of vfio_device_container_register() and open_device() for legacy mode. This also prepares for further moving group specific code into separate source file. Link: https://lore.kernel.org/r/20221201145535.589687-6-yi.l.liu@intel.com Reviewed-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Reviewed-by: Alex Williamson <alex.williamson@redhat.com> Tested-by: Lixiao Yang <lixiao.yang@intel.com> Tested-by: Yu He <yu.he@intel.com> Signed-off-by: Yi Liu <yi.l.liu@intel.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Diffstat (limited to 'drivers/vfio')
-rw-r--r--drivers/vfio/vfio_main.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
index 7e42ee0ee1bc..5dddf962f650 100644
--- a/drivers/vfio/vfio_main.c
+++ b/drivers/vfio/vfio_main.c
@@ -807,6 +807,7 @@ static int vfio_device_first_open(struct vfio_device *device)
ret = vfio_group_use_container(device->group);
if (ret)
goto err_module_put;
+ vfio_device_container_register(device);
} else if (device->group->iommufd) {
ret = vfio_iommufd_bind(device, device->group->iommufd);
if (ret)
@@ -819,17 +820,17 @@ static int vfio_device_first_open(struct vfio_device *device)
if (ret)
goto err_container;
}
- if (device->group->container)
- vfio_device_container_register(device);
mutex_unlock(&device->group->group_lock);
return 0;
err_container:
device->kvm = NULL;
- if (device->group->container)
+ if (device->group->container) {
+ vfio_device_container_unregister(device);
vfio_group_unuse_container(device->group);
- else if (device->group->iommufd)
+ } else if (device->group->iommufd) {
vfio_iommufd_unbind(device);
+ }
err_module_put:
mutex_unlock(&device->group->group_lock);
module_put(device->dev->driver->owner);
@@ -841,15 +842,15 @@ static void vfio_device_last_close(struct vfio_device *device)
lockdep_assert_held(&device->dev_set->lock);
mutex_lock(&device->group->group_lock);
- if (device->group->container)
- vfio_device_container_unregister(device);
if (device->ops->close_device)
device->ops->close_device(device);
device->kvm = NULL;
- if (device->group->container)
+ if (device->group->container) {
+ vfio_device_container_unregister(device);
vfio_group_unuse_container(device->group);
- else if (device->group->iommufd)
+ } else if (device->group->iommufd) {
vfio_iommufd_unbind(device);
+ }
mutex_unlock(&device->group->group_lock);
module_put(device->dev->driver->owner);
}