aboutsummaryrefslogtreecommitdiff
path: root/kmod
diff options
context:
space:
mode:
authorSwapnil Ingle <swapnil.ingle@nutanix.com>2020-01-28 12:22:41 -0500
committerSwapnil Ingle <swapnil.ingle@nutanix.com>2020-01-28 15:06:40 -0500
commitb4e11914ed612417ac9913617de1296c2219ebdf (patch)
treee952b4d04bca546bfbc29a2cd1d10a961a49417b /kmod
parent4f3786aeed6141f6f10ff314241311be9288176d (diff)
downloadlibvfio-user-b4e11914ed612417ac9913617de1296c2219ebdf.zip
libvfio-user-b4e11914ed612417ac9913617de1296c2219ebdf.tar.gz
libvfio-user-b4e11914ed612417ac9913617de1296c2219ebdf.tar.bz2
muser: protect module unload if mudev is opened by vfio
Grab the module reference if mudev is opened from vfio side. We need to protect module unloads if, 1> mudev is opened by qemu 2> mudev is opened by device emulation Signed-off-by: Swapnil Ingle <swapnil.ingle@nutanix.com>
Diffstat (limited to 'kmod')
-rw-r--r--kmod/muser.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/kmod/muser.c b/kmod/muser.c
index 25c4e32..f92a3af 100644
--- a/kmod/muser.c
+++ b/kmod/muser.c
@@ -898,6 +898,11 @@ int muser_open(struct mdev_device *mdev)
return -EBUSY;
}
+ if (!try_module_get(THIS_MODULE)) {
+ atomic_dec(&mudev->mdev_opened);
+ return -ENODEV;
+ }
+
err = register_notifier(mdev);
if (unlikely(err)) {
int err2;
@@ -908,6 +913,8 @@ int muser_open(struct mdev_device *mdev)
* vfio_unpin etc.)?
*/
atomic_dec(&mudev->mdev_opened);
+ module_put(THIS_MODULE);
+
muser_dbg("failed to register notifier: %d", err);
err2 = dma_unmap_all(mudev);
if (unlikely(err2))
@@ -917,9 +924,9 @@ int muser_open(struct mdev_device *mdev)
&mudev->iommu_notifier);
if (unlikely(err2))
muser_info("failed to unregister notifier: %d", err);
-
}
+
return err;
}
@@ -941,6 +948,7 @@ void muser_close(struct mdev_device *mdev)
atomic_dec(&mudev->mdev_opened);
/* TODO: Replace any pending mucmd back in cmd_list. */
+ module_put(THIS_MODULE);
}
static int