diff options
author | Swapnil Ingle <swapnil.ingle@nutanix.com> | 2020-01-28 12:22:41 -0500 |
---|---|---|
committer | Swapnil Ingle <swapnil.ingle@nutanix.com> | 2020-01-28 15:06:40 -0500 |
commit | b4e11914ed612417ac9913617de1296c2219ebdf (patch) | |
tree | e952b4d04bca546bfbc29a2cd1d10a961a49417b /kmod | |
parent | 4f3786aeed6141f6f10ff314241311be9288176d (diff) | |
download | libvfio-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.c | 10 |
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 |