vfio: Move vfio_device_group_unregister() to be the first operation in unregister
authorYi Liu <yi.l.liu@intel.com>
Tue, 18 Jul 2023 13:55:41 +0000 (06:55 -0700)
committerAlex Williamson <alex.williamson@redhat.com>
Tue, 25 Jul 2023 16:19:22 +0000 (10:19 -0600)
This avoids endless vfio_device refcount increment by userspace, which
would keep blocking the vfio_unregister_group_dev().

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
Tested-by: Matthew Rosato <mjrosato@linux.ibm.com>
Tested-by: Yanting Jiang <yanting.jiang@intel.com>
Tested-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Tested-by: Terrence Xu <terrence.xu@intel.com>
Tested-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Link: https://lore.kernel.org/r/20230718135551.6592-17-yi.l.liu@intel.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/vfio_main.c

index c71c0d1..6d45caa 100644 (file)
@@ -332,6 +332,12 @@ void vfio_unregister_group_dev(struct vfio_device *device)
        bool interrupted = false;
        long rc;
 
+       /*
+        * Prevent new device opened by userspace via the
+        * VFIO_GROUP_GET_DEVICE_FD in the group path.
+        */
+       vfio_device_group_unregister(device);
+
        vfio_device_put_registration(device);
        rc = try_wait_for_completion(&device->comp);
        while (rc <= 0) {
@@ -355,8 +361,6 @@ void vfio_unregister_group_dev(struct vfio_device *device)
                }
        }
 
-       vfio_device_group_unregister(device);
-
        /* Balances device_add in register path */
        device_del(&device->device);