Re: [PATCH V2] nvme: Add module reference counting for multipath devices
Nares Bannoth <[email protected]>
| Newsgroups | org.infradead.lists.linux-nvme |
|---|---|
| Message-ID | <[email protected]> |
On 13/08/26 4:02 am, [email protected] wrote: > From: Wen Xiong <[email protected]> > > Add proper module reference counting to prevent premature unloading of > NVMe transport modules while multipath namespaces are still active. > > When a namespace is added to a multipath device via nvme_mpath_add_disk(), > the underlying transport module (PCIe, FC, RDMA, TCP, etc.) must remain > loaded as long as the multipath device references that namespace. Without > proper reference counting, the transport module could be unloaded while > the multipath device is still using resources from that module, leading > to the potential system crashes. > > This ensures the transport module remains loaded for the entire lifetime > of the multipath namespace association. > > Signed-off-by: Wen Xiong <[email protected]> > --- Hi Wen, I tested this patch and it is working as expected. Patch Validation Results -------------------------------- # lsmod | grep -i nvme nvme_tcp 262144 0 nvme 262144 9 nvme_fabrics 262144 1 nvme_tcp nvme_core 458752 8 nvme_tcp,nvme,nvme_fabrics nvme_keyring 262144 3 nvme_tcp,nvme_core,nvme_fabrics nvme_auth 262144 1 nvme_core # rmmod nvme rmmod: ERROR: Module nvme is in use. # # rmmod nvme_tcp # # lsmod | grep -i nvme nvme 262144 9 nvme_fabrics 262144 0 nvme_core 458752 7 nvme,nvme_fabrics nvme_keyring 262144 2 nvme_core,nvme_fabrics nvme_auth 262144 1 nvme_core # rmmod nvme_core rmmod: ERROR: Module nvme_core is in use by: nvme nvme_fabrics # # rmmod nvme_fabrics # # rmmod nvme_core rmmod: ERROR: Module nvme_core is in use by: nvme # # lsmod | grep -i nvme nvme 262144 9 nvme_core 458752 6 nvme nvme_keyring 262144 1 nvme_core nvme_auth 262144 1 nvme_core # Please add below tag : Tested-by: Naresh Bannoth <[email protected]> Thanks and Regards, Naresh. > drivers/nvme/host/multipath.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c > index 9b9a657fa330..707b8f95727d 100644 > --- a/drivers/nvme/host/multipath.c > +++ b/drivers/nvme/host/multipath.c > @@ -1348,6 +1348,8 @@ void nvme_mpath_remove_sysfs_link(struct nvme_ns *ns) > sysfs_remove_link_from_group(kobj, nvme_ns_mpath_attr_group.name, > dev_name(target)); > clear_bit(NVME_NS_SYSFS_ATTR_LINK, &ns->flags); > + > + module_put(ns->ctrl->ops->module); > } > > void nvme_mpath_add_disk(struct nvme_ns *ns, __le32 anagrpid) > @@ -1379,6 +1381,9 @@ void nvme_mpath_add_disk(struct nvme_ns *ns, __le32 anagrpid) > if (blk_queue_is_zoned(ns->queue) && ns->head->disk) > ns->head->disk->nr_zones = ns->disk->nr_zones; > #endif > + if (!try_module_get(ns->ctrl->ops->module)) > + dev_err(disk_to_dev(ns->disk), > + "Failed to get module reference\n"); > } > > void nvme_mpath_remove_disk(struct nvme_ns_head *head)