Hi Max, On 5/18/21 9:21 PM, Max Gurtovoy wrote: > Remove code duplication and move module refcounting to the subsystem > module. > > Signed-off-by: Max Gurtovoy <mgurtovoy@xxxxxxxxxx> Reviewed-by: Eric Auger <eric.auger@xxxxxxxxxx> Thanks Eric > --- > drivers/vfio/fsl-mc/vfio_fsl_mc.c | 16 +++------------- > drivers/vfio/mdev/vfio_mdev.c | 13 +------------ > drivers/vfio/pci/vfio_pci.c | 7 ------- > drivers/vfio/platform/vfio_platform_common.c | 6 ------ > drivers/vfio/vfio.c | 10 ++++++++++ > 5 files changed, 14 insertions(+), 38 deletions(-) > > diff --git a/drivers/vfio/fsl-mc/vfio_fsl_mc.c b/drivers/vfio/fsl-mc/vfio_fsl_mc.c > index 980e59551301..90cad109583b 100644 > --- a/drivers/vfio/fsl-mc/vfio_fsl_mc.c > +++ b/drivers/vfio/fsl-mc/vfio_fsl_mc.c > @@ -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, > diff --git a/drivers/vfio/mdev/vfio_mdev.c b/drivers/vfio/mdev/vfio_mdev.c > index 922729071c5a..5ef4815609ed 100644 > --- a/drivers/vfio/mdev/vfio_mdev.c > +++ b/drivers/vfio/mdev/vfio_mdev.c > @@ -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, > diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c > index bd7c482c948a..f6729baa1bf4 100644 > --- a/drivers/vfio/pci/vfio_pci.c > +++ b/drivers/vfio/pci/vfio_pci.c > @@ -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; > } > > diff --git a/drivers/vfio/platform/vfio_platform_common.c b/drivers/vfio/platform/vfio_platform_common.c > index 470fcf7dac56..703164df7637 100644 > --- a/drivers/vfio/platform/vfio_platform_common.c > +++ b/drivers/vfio/platform/vfio_platform_common.c > @@ -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; > } > > diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c > index 5e631c359ef2..02cc51ce6891 100644 > --- a/drivers/vfio/vfio.c > +++ b/drivers/vfio/vfio.c > @@ -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); >