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

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.comSigned-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 009c9aa5
...@@ -140,26 +140,18 @@ static int vfio_fsl_mc_open(struct vfio_device *core_vdev) ...@@ -140,26 +140,18 @@ static int vfio_fsl_mc_open(struct vfio_device *core_vdev)
{ {
struct vfio_fsl_mc_device *vdev = struct vfio_fsl_mc_device *vdev =
container_of(core_vdev, struct vfio_fsl_mc_device, vdev); container_of(core_vdev, struct vfio_fsl_mc_device, vdev);
int ret; int ret = 0;
if (!try_module_get(THIS_MODULE))
return -ENODEV;
mutex_lock(&vdev->reflck->lock); mutex_lock(&vdev->reflck->lock);
if (!vdev->refcnt) { if (!vdev->refcnt) {
ret = vfio_fsl_mc_regions_init(vdev); ret = vfio_fsl_mc_regions_init(vdev);
if (ret) if (ret)
goto err_reg_init; goto out;
} }
vdev->refcnt++; vdev->refcnt++;
out:
mutex_unlock(&vdev->reflck->lock); mutex_unlock(&vdev->reflck->lock);
return 0;
err_reg_init:
mutex_unlock(&vdev->reflck->lock);
module_put(THIS_MODULE);
return ret; return ret;
} }
...@@ -196,8 +188,6 @@ static void vfio_fsl_mc_release(struct vfio_device *core_vdev) ...@@ -196,8 +188,6 @@ static void vfio_fsl_mc_release(struct vfio_device *core_vdev)
} }
mutex_unlock(&vdev->reflck->lock); mutex_unlock(&vdev->reflck->lock);
module_put(THIS_MODULE);
} }
static long vfio_fsl_mc_ioctl(struct vfio_device *core_vdev, static long vfio_fsl_mc_ioctl(struct vfio_device *core_vdev,
......
...@@ -26,19 +26,10 @@ static int vfio_mdev_open(struct vfio_device *core_vdev) ...@@ -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_device *mdev = to_mdev_device(core_vdev->dev);
struct mdev_parent *parent = mdev->type->parent; struct mdev_parent *parent = mdev->type->parent;
int ret;
if (unlikely(!parent->ops->open)) if (unlikely(!parent->ops->open))
return -EINVAL; return -EINVAL;
if (!try_module_get(THIS_MODULE)) return parent->ops->open(mdev);
return -ENODEV;
ret = parent->ops->open(mdev);
if (ret)
module_put(THIS_MODULE);
return ret;
} }
static void vfio_mdev_release(struct vfio_device *core_vdev) static void vfio_mdev_release(struct vfio_device *core_vdev)
...@@ -48,8 +39,6 @@ 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)) if (likely(parent->ops->release))
parent->ops->release(mdev); parent->ops->release(mdev);
module_put(THIS_MODULE);
} }
static long vfio_mdev_unlocked_ioctl(struct vfio_device *core_vdev, static long vfio_mdev_unlocked_ioctl(struct vfio_device *core_vdev,
......
...@@ -558,8 +558,6 @@ static void vfio_pci_release(struct vfio_device *core_vdev) ...@@ -558,8 +558,6 @@ static void vfio_pci_release(struct vfio_device *core_vdev)
} }
mutex_unlock(&vdev->reflck->lock); mutex_unlock(&vdev->reflck->lock);
module_put(THIS_MODULE);
} }
static int vfio_pci_open(struct vfio_device *core_vdev) static int vfio_pci_open(struct vfio_device *core_vdev)
...@@ -568,9 +566,6 @@ 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); container_of(core_vdev, struct vfio_pci_device, vdev);
int ret = 0; int ret = 0;
if (!try_module_get(THIS_MODULE))
return -ENODEV;
mutex_lock(&vdev->reflck->lock); mutex_lock(&vdev->reflck->lock);
if (!vdev->refcnt) { if (!vdev->refcnt) {
...@@ -584,8 +579,6 @@ static int vfio_pci_open(struct vfio_device *core_vdev) ...@@ -584,8 +579,6 @@ static int vfio_pci_open(struct vfio_device *core_vdev)
vdev->refcnt++; vdev->refcnt++;
error: error:
mutex_unlock(&vdev->reflck->lock); mutex_unlock(&vdev->reflck->lock);
if (ret)
module_put(THIS_MODULE);
return ret; return ret;
} }
......
...@@ -241,8 +241,6 @@ static void vfio_platform_release(struct vfio_device *core_vdev) ...@@ -241,8 +241,6 @@ static void vfio_platform_release(struct vfio_device *core_vdev)
} }
mutex_unlock(&driver_lock); mutex_unlock(&driver_lock);
module_put(vdev->parent_module);
} }
static int vfio_platform_open(struct vfio_device *core_vdev) static int vfio_platform_open(struct vfio_device *core_vdev)
...@@ -251,9 +249,6 @@ 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); container_of(core_vdev, struct vfio_platform_device, vdev);
int ret; int ret;
if (!try_module_get(vdev->parent_module))
return -ENODEV;
mutex_lock(&driver_lock); mutex_lock(&driver_lock);
if (!vdev->refcnt) { if (!vdev->refcnt) {
...@@ -291,7 +286,6 @@ static int vfio_platform_open(struct vfio_device *core_vdev) ...@@ -291,7 +286,6 @@ static int vfio_platform_open(struct vfio_device *core_vdev)
vfio_platform_regions_cleanup(vdev); vfio_platform_regions_cleanup(vdev);
err_reg: err_reg:
mutex_unlock(&driver_lock); mutex_unlock(&driver_lock);
module_put(vdev->parent_module);
return ret; return ret;
} }
......
...@@ -1369,8 +1369,14 @@ static int vfio_group_get_device_fd(struct vfio_group *group, char *buf) ...@@ -1369,8 +1369,14 @@ static int vfio_group_get_device_fd(struct vfio_group *group, char *buf)
if (IS_ERR(device)) if (IS_ERR(device))
return PTR_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); ret = device->ops->open(device);
if (ret) { if (ret) {
module_put(device->dev->driver->owner);
vfio_device_put(device); vfio_device_put(device);
return ret; return ret;
} }
...@@ -1382,6 +1388,7 @@ static int vfio_group_get_device_fd(struct vfio_group *group, char *buf) ...@@ -1382,6 +1388,7 @@ static int vfio_group_get_device_fd(struct vfio_group *group, char *buf)
ret = get_unused_fd_flags(O_CLOEXEC); ret = get_unused_fd_flags(O_CLOEXEC);
if (ret < 0) { if (ret < 0) {
device->ops->release(device); device->ops->release(device);
module_put(device->dev->driver->owner);
vfio_device_put(device); vfio_device_put(device);
return ret; return ret;
} }
...@@ -1392,6 +1399,7 @@ static int vfio_group_get_device_fd(struct vfio_group *group, char *buf) ...@@ -1392,6 +1399,7 @@ static int vfio_group_get_device_fd(struct vfio_group *group, char *buf)
put_unused_fd(ret); put_unused_fd(ret);
ret = PTR_ERR(filep); ret = PTR_ERR(filep);
device->ops->release(device); device->ops->release(device);
module_put(device->dev->driver->owner);
vfio_device_put(device); vfio_device_put(device);
return ret; return ret;
} }
...@@ -1550,6 +1558,8 @@ static int vfio_device_fops_release(struct inode *inode, struct file *filep) ...@@ -1550,6 +1558,8 @@ static int vfio_device_fops_release(struct inode *inode, struct file *filep)
device->ops->release(device); device->ops->release(device);
module_put(device->dev->driver->owner);
vfio_group_try_dissolve_container(device->group); vfio_group_try_dissolve_container(device->group);
vfio_device_put(device); vfio_device_put(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