Commit 5cfff077 authored by Yi Liu's avatar Yi Liu Committed by Jason Gunthorpe

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.comReviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Reviewed-by: default avatarAlex Williamson <alex.williamson@redhat.com>
Tested-by: default avatarLixiao Yang <lixiao.yang@intel.com>
Tested-by: default avatarYu He <yu.he@intel.com>
Signed-off-by: default avatarYi Liu <yi.l.liu@intel.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 07b46586
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment