* [PATCH v2] nvme: remove namespaces in parallel
@ 2026-11-03 6:28 Qiliang Yuan
2026-11-03 7:41 ` Nilay Shroff
2026-11-03 8:11 ` Christoph Hellwig
0 siblings, 2 replies; 3+ messages in thread
From: Qiliang Yuan @ 2026-11-03 6:28 UTC (permalink / raw)
To: Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg
Cc: linux-nvme, linux-kernel, linux-block, Hannes Reinecke, Ming Lei,
Nilay Shroff, Shin'ichiro Kawasaki, Stuart Hayes,
Qiliang Yuan
nvme_remove_namespaces() removes the namespaces of a controller one
after another. Each removal waits for RCU grace periods in
del_gendisk() for the namespace and for its multipath head, about
20 ms in all.
Deleting a controller, such as disconnecting from a fabrics target,
thus takes time proportional to its namespace count, over a second for
64 namespaces. Scanning had the same problem until commit 4e893ca81170
("nvme_core: scan namespaces asynchronously") made it add namespaces
in parallel.
Remove the namespaces through an async domain the same way, and wait
for all of them before returning. Each removal still waits about
20 ms, but the waits now overlap: a grace period is system-wide, so
removals that wait at the same time are released by the same grace
periods instead of each needing its own.
Disconnect time from a target on the same host, over tcp to 127.0.0.1
and over nvme-loop, with 4 I/O queues, median of 3 runs on each of two
boots per kernel:
namespaces transport before after
8 tcp 170 / 171 ms 85 / 91 ms
32 tcp 628 / 628 ms 294 / 293 ms
64 tcp 1201 / 1308 ms 533 / 550 ms
64 loop 1988 / 1913 ms 1283 / 1200 ms
Signed-off-by: Qiliang Yuan <odys.yuan@gmail.com>
---
V1 -> V2:
- Explain why removing the namespaces in parallel saves time
- Drop patch 2 until the elevator switch locking change settles:
https://lore.kernel.org/r/20261031044141.5569-1-laveeshb@laveeshbansal.com
v1: https://lore.kernel.org/r/20261102-bug-nvme-remove-ns-async-v1-0-61780fee111c@gmail.com
---
drivers/nvme/host/core.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index a7a4d09644c13..18948c2ba218d 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -4716,6 +4716,11 @@ static void nvme_scan_work(struct work_struct *work)
#endif
}
+static void nvme_ns_remove_async(void *data, async_cookie_t cookie)
+{
+ nvme_ns_remove(data);
+}
+
/*
* This function iterates the namespace list unlocked to allow recovery from
* controller failure. It is up to the caller to ensure the namespace list is
@@ -4725,6 +4730,7 @@ void nvme_remove_namespaces(struct nvme_ctrl *ctrl)
{
struct nvme_ns *ns, *next;
LIST_HEAD(ns_list);
+ ASYNC_DOMAIN(domain);
/*
* make sure to requeue I/O to all namespaces as these
@@ -4759,8 +4765,13 @@ void nvme_remove_namespaces(struct nvme_ctrl *ctrl)
mutex_unlock(&ctrl->namespaces_lock);
synchronize_srcu(&ctrl->srcu);
+ /*
+ * Remove the namespaces in parallel, as each removal waits for several
+ * RCU grace periods.
+ */
list_for_each_entry_safe(ns, next, &ns_list, list)
- nvme_ns_remove(ns);
+ async_schedule_domain(nvme_ns_remove_async, ns, &domain);
+ async_synchronize_full_domain(&domain);
}
EXPORT_SYMBOL_GPL(nvme_remove_namespaces);
---
base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
change-id: 20261102-bug-nvme-remove-ns-async-ceaaa1eda6a7
Best regards,
--
Qiliang Yuan <odys.yuan@gmail.com>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2] nvme: remove namespaces in parallel
2026-11-03 6:28 [PATCH v2] nvme: remove namespaces in parallel Qiliang Yuan
@ 2026-11-03 7:41 ` Nilay Shroff
2026-11-03 8:11 ` Christoph Hellwig
1 sibling, 0 replies; 3+ messages in thread
From: Nilay Shroff @ 2026-11-03 7:41 UTC (permalink / raw)
To: Qiliang Yuan, Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg
Cc: linux-nvme, linux-kernel, linux-block, Hannes Reinecke, Ming Lei,
Shin'ichiro Kawasaki, Stuart Hayes
On 11/3/26 11:58 AM, Qiliang Yuan wrote:
> nvme_remove_namespaces() removes the namespaces of a controller one
> after another. Each removal waits for RCU grace periods in
> del_gendisk() for the namespace and for its multipath head, about
> 20 ms in all.
>
> Deleting a controller, such as disconnecting from a fabrics target,
> thus takes time proportional to its namespace count, over a second for
> 64 namespaces. Scanning had the same problem until commit 4e893ca81170
> ("nvme_core: scan namespaces asynchronously") made it add namespaces
> in parallel.
>
> Remove the namespaces through an async domain the same way, and wait
> for all of them before returning. Each removal still waits about
> 20 ms, but the waits now overlap: a grace period is system-wide, so
> removals that wait at the same time are released by the same grace
> periods instead of each needing its own.
>
> Disconnect time from a target on the same host, over tcp to 127.0.0.1
> and over nvme-loop, with 4 I/O queues, median of 3 runs on each of two
> boots per kernel:
>
> namespaces transport before after
> 8 tcp 170 / 171 ms 85 / 91 ms
> 32 tcp 628 / 628 ms 294 / 293 ms
> 64 tcp 1201 / 1308 ms 533 / 550 ms
> 64 loop 1988 / 1913 ms 1283 / 1200 ms
>
> Signed-off-by: Qiliang Yuan<odys.yuan@gmail.com>
Looks good to me:
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v2] nvme: remove namespaces in parallel
2026-11-03 6:28 [PATCH v2] nvme: remove namespaces in parallel Qiliang Yuan
2026-11-03 7:41 ` Nilay Shroff
@ 2026-11-03 8:11 ` Christoph Hellwig
1 sibling, 0 replies; 3+ messages in thread
From: Christoph Hellwig @ 2026-11-03 8:11 UTC (permalink / raw)
To: Qiliang Yuan
Cc: Keith Busch, Jens Axboe, Christoph Hellwig, Sagi Grimberg,
linux-nvme, linux-kernel, linux-block, Hannes Reinecke, Ming Lei,
Nilay Shroff, Shin'ichiro Kawasaki, Stuart Hayes
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-11-03 8:11 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-03 6:28 [PATCH v2] nvme: remove namespaces in parallel Qiliang Yuan
2026-11-03 7:41 ` Nilay Shroff
2026-11-03 8:11 ` Christoph Hellwig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®