vfio: Move "device->open_count--" out of group_rwsem in vfio_device_open()
authorYi Liu <yi.l.liu@intel.com>
Mon, 27 Jun 2022 07:41:19 +0000 (00:41 -0700)
committerAlex Williamson <alex.williamson@redhat.com>
Thu, 30 Jun 2022 17:07:07 +0000 (11:07 -0600)
We do not protect the vfio_device::open_count with group_rwsem elsewhere (see
vfio_device_fops_release as a comparison, where we already drop group_rwsem
before open_count--). So move the group_rwsem unlock prior to open_count--.

This change now also drops group_rswem before setting device->kvm = NULL,
but that's also OK (again, just like vfio_device_fops_release). The setting
of device->kvm before open_device is technically done while holding the
group_rwsem, this is done to protect the group kvm value we are copying from,
and we should not be relying on that to protect the contents of device->kvm;
instead we assume this value will not change until after the device is closed
and while under the dev_set->lock.

Cc: Matthew Rosato <mjrosato@linux.ibm.com>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Link: https://lore.kernel.org/r/20220627074119.523274-1-yi.l.liu@intel.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/vfio.c

index 61e71c1..44c3bf8 100644 (file)
@@ -1146,10 +1146,10 @@ err_close_device:
        if (device->open_count == 1 && device->ops->close_device)
                device->ops->close_device(device);
 err_undo_count:
+       up_read(&device->group->group_rwsem);
        device->open_count--;
        if (device->open_count == 0 && device->kvm)
                device->kvm = NULL;
-       up_read(&device->group->group_rwsem);
        mutex_unlock(&device->dev_set->lock);
        module_put(device->dev->driver->owner);
 err_unassign_container: