Commit 9dcf01d9 authored by Max Gurtovoy's avatar Max Gurtovoy Committed by Alex Williamson
Browse files

vfio: centralize module refcount in subsystem layer



Remove code duplication and move module refcounting to the subsystem
module.

Signed-off-by: default avatarMax Gurtovoy <mgurtovoy@nvidia.com>
Reviewed-by: default avatarEric Auger <eric.auger@redhat.com>
Link: https://lore.kernel.org/r/20210518192133.59195-2-mgurtovoy@nvidia.com


Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 009c9aa5
Loading
Loading
Loading
Loading
+3 −13
Original line number Diff line number Diff line
@@ -140,26 +140,18 @@ static int vfio_fsl_mc_open(struct vfio_device *core_vdev)
{
	struct vfio_fsl_mc_device *vdev =
		container_of(core_vdev, struct vfio_fsl_mc_device, vdev);
	int ret;

	if (!try_module_get(THIS_MODULE))
		return -ENODEV;
	int ret = 0;

	mutex_lock(&vdev->reflck->lock);
	if (!vdev->refcnt) {
		ret = vfio_fsl_mc_regions_init(vdev);
		if (ret)
			goto err_reg_init;
			goto out;
	}
	vdev->refcnt++;

out:
	mutex_unlock(&vdev->reflck->lock);

	return 0;

err_reg_init:
	mutex_unlock(&vdev->reflck->lock);
	module_put(THIS_MODULE);
	return ret;
}

@@ -196,8 +188,6 @@ static void vfio_fsl_mc_release(struct vfio_device *core_vdev)
	}

	mutex_unlock(&vdev->reflck->lock);

	module_put(THIS_MODULE);
}

static long vfio_fsl_mc_ioctl(struct vfio_device *core_vdev,
+1 −12
Original line number Diff line number Diff line
@@ -26,19 +26,10 @@ static int vfio_mdev_open(struct vfio_device *core_vdev)
	struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
	struct mdev_parent *parent = mdev->type->parent;

	int ret;

	if (unlikely(!parent->ops->open))
		return -EINVAL;

	if (!try_module_get(THIS_MODULE))
		return -ENODEV;

	ret = parent->ops->open(mdev);
	if (ret)
		module_put(THIS_MODULE);

	return ret;
	return parent->ops->open(mdev);
}

static void vfio_mdev_release(struct vfio_device *core_vdev)
@@ -48,8 +39,6 @@ static void vfio_mdev_release(struct vfio_device *core_vdev)

	if (likely(parent->ops->release))
		parent->ops->release(mdev);

	module_put(THIS_MODULE);
}

static long vfio_mdev_unlocked_ioctl(struct vfio_device *core_vdev,
+0 −7
Original line number Diff line number Diff line
@@ -558,8 +558,6 @@ static void vfio_pci_release(struct vfio_device *core_vdev)
	}

	mutex_unlock(&vdev->reflck->lock);

	module_put(THIS_MODULE);
}

static int vfio_pci_open(struct vfio_device *core_vdev)
@@ -568,9 +566,6 @@ static int vfio_pci_open(struct vfio_device *core_vdev)
		container_of(core_vdev, struct vfio_pci_device, vdev);
	int ret = 0;

	if (!try_module_get(THIS_MODULE))
		return -ENODEV;

	mutex_lock(&vdev->reflck->lock);

	if (!vdev->refcnt) {
@@ -584,8 +579,6 @@ static int vfio_pci_open(struct vfio_device *core_vdev)
	vdev->refcnt++;
error:
	mutex_unlock(&vdev->reflck->lock);
	if (ret)
		module_put(THIS_MODULE);
	return ret;
}

+0 −6
Original line number Diff line number Diff line
@@ -241,8 +241,6 @@ static void vfio_platform_release(struct vfio_device *core_vdev)
	}

	mutex_unlock(&driver_lock);

	module_put(vdev->parent_module);
}

static int vfio_platform_open(struct vfio_device *core_vdev)
@@ -251,9 +249,6 @@ static int vfio_platform_open(struct vfio_device *core_vdev)
		container_of(core_vdev, struct vfio_platform_device, vdev);
	int ret;

	if (!try_module_get(vdev->parent_module))
		return -ENODEV;

	mutex_lock(&driver_lock);

	if (!vdev->refcnt) {
@@ -291,7 +286,6 @@ static int vfio_platform_open(struct vfio_device *core_vdev)
	vfio_platform_regions_cleanup(vdev);
err_reg:
	mutex_unlock(&driver_lock);
	module_put(vdev->parent_module);
	return ret;
}

+10 −0
Original line number Diff line number Diff line
@@ -1369,8 +1369,14 @@ static int vfio_group_get_device_fd(struct vfio_group *group, char *buf)
	if (IS_ERR(device))
		return PTR_ERR(device);

	if (!try_module_get(device->dev->driver->owner)) {
		vfio_device_put(device);
		return -ENODEV;
	}

	ret = device->ops->open(device);
	if (ret) {
		module_put(device->dev->driver->owner);
		vfio_device_put(device);
		return ret;
	}
@@ -1382,6 +1388,7 @@ static int vfio_group_get_device_fd(struct vfio_group *group, char *buf)
	ret = get_unused_fd_flags(O_CLOEXEC);
	if (ret < 0) {
		device->ops->release(device);
		module_put(device->dev->driver->owner);
		vfio_device_put(device);
		return ret;
	}
@@ -1392,6 +1399,7 @@ static int vfio_group_get_device_fd(struct vfio_group *group, char *buf)
		put_unused_fd(ret);
		ret = PTR_ERR(filep);
		device->ops->release(device);
		module_put(device->dev->driver->owner);
		vfio_device_put(device);
		return ret;
	}
@@ -1550,6 +1558,8 @@ static int vfio_device_fops_release(struct inode *inode, struct file *filep)

	device->ops->release(device);

	module_put(device->dev->driver->owner);

	vfio_group_try_dissolve_container(device->group);

	vfio_device_put(device);