This avoids endless vfio_device refcount increasement by userspace,
which would keep blocking the vfio_unregister_group_dev().

Tested-by: Nicolin Chen <nicol...@nvidia.com>
Tested-by: Matthew Rosato <mjros...@linux.ibm.com>
Tested-by: Yanting Jiang <yanting.ji...@intel.com>
Tested-by: Shameer Kolothum <shameerali.kolothum.th...@huawei.com>
Tested-by: Terrence Xu <terrence...@intel.com>
Signed-off-by: Yi Liu <yi.l....@intel.com>
---
 drivers/vfio/vfio_main.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
index c71c0d1a079f..6d45caa1f9a0 100644
--- a/drivers/vfio/vfio_main.c
+++ b/drivers/vfio/vfio_main.c
@@ -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);
 
-- 
2.34.1

Reply via email to