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

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: 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
Loading
Loading
Loading
Loading
+29 −17
Original line number Diff line number Diff line
@@ -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);