summaryrefslogtreecommitdiffstats
path: root/drivers/vfio/vfio_main.c
diff options
context:
space:
mode:
authorYi Liu <yi.l.liu@intel.com>2022-09-30 12:22:55 +0200
committerJason Gunthorpe <jgg@nvidia.com>2022-12-05 13:56:01 +0100
commit5cfff0774353ee35601e3d3fe2f0bd95c33aa5db (patch)
treeac1ddf82de3139a294cdeec8033768ac7c6ae9ae /drivers/vfio/vfio_main.c
parentvfio: Swap order of vfio_device_container_register() and open_device() (diff)
downloadlinux-5cfff0774353ee35601e3d3fe2f0bd95c33aa5db.tar.xz
linux-5cfff0774353ee35601e3d3fe2f0bd95c33aa5db.zip
vfio: Make vfio_device_open() truly device specific
Then move group related logic into vfio_device_open_file(). Accordingly introduce a vfio_device_close() to pair up. Link: https://lore.kernel.org/r/20221201145535.589687-7-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/vfio_main.c')
-rw-r--r--drivers/vfio/vfio_main.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
index 5dddf962f650..37413ac254c0 100644
--- a/drivers/vfio/vfio_main.c
+++ b/drivers/vfio/vfio_main.c
@@ -855,20 +855,41 @@ static void vfio_device_last_close(struct vfio_device *device)
module_put(device->dev->driver->owner);
}
-static struct file *vfio_device_open(struct vfio_device *device)
+static int vfio_device_open(struct vfio_device *device)
{
- struct file *filep;
- int ret;
+ int ret = 0;
mutex_lock(&device->dev_set->lock);
device->open_count++;
if (device->open_count == 1) {
ret = vfio_device_first_open(device);
if (ret)
- goto err_unlock;
+ device->open_count--;
}
mutex_unlock(&device->dev_set->lock);
+ return ret;
+}
+
+static void vfio_device_close(struct vfio_device *device)
+{
+ mutex_lock(&device->dev_set->lock);
+ vfio_assert_device_open(device);
+ if (device->open_count == 1)
+ vfio_device_last_close(device);
+ device->open_count--;
+ mutex_unlock(&device->dev_set->lock);
+}
+
+static struct file *vfio_device_open_file(struct vfio_device *device)
+{
+ struct file *filep;
+ int ret;
+
+ ret = vfio_device_open(device);
+ if (ret)
+ goto err_out;
+
/*
* We can't use anon_inode_getfd() because we need to modify
* the f_mode flags directly to allow more than just ioctls
@@ -897,12 +918,8 @@ static struct file *vfio_device_open(struct vfio_device *device)
return filep;
err_close_device:
- mutex_lock(&device->dev_set->lock);
- if (device->open_count == 1)
- vfio_device_last_close(device);
-err_unlock:
- device->open_count--;
- mutex_unlock(&device->dev_set->lock);
+ vfio_device_close(device);
+err_out:
return ERR_PTR(ret);
}
@@ -930,7 +947,7 @@ static int vfio_group_ioctl_get_device_fd(struct vfio_group *group,
goto err_put_device;
}
- filep = vfio_device_open(device);
+ filep = vfio_device_open_file(device);
if (IS_ERR(filep)) {
ret = PTR_ERR(filep);
goto err_put_fdno;
@@ -1113,12 +1130,7 @@ static int vfio_device_fops_release(struct inode *inode, struct file *filep)
{
struct vfio_device *device = filep->private_data;
- mutex_lock(&device->dev_set->lock);
- vfio_assert_device_open(device);
- if (device->open_count == 1)
- vfio_device_last_close(device);
- device->open_count--;
- mutex_unlock(&device->dev_set->lock);
+ vfio_device_close(device);
vfio_device_put_registration(device);