Linux-NVME Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] nvme-multipath: fix suspicious RCU usage warning
@ 2025-06-30  7:48 Geliang Tang
  2025-06-30  9:30 ` Hannes Reinecke
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Geliang Tang @ 2025-06-30  7:48 UTC (permalink / raw)
  To: Hannes Reinecke, Keith Busch, Jens Axboe, Christoph Hellwig,
	Sagi Grimberg, Nilay Shroff
  Cc: geliang, Geliang Tang, linux-nvme

From: Geliang Tang <tanggeliang@kylinos.cn>

When I run the NVME over TCP test in virtme-ng, I get the following
"suspicious RCU usage" warning in nvme_mpath_add_sysfs_link():

'''
[    5.024557][   T44] nvmet: Created nvm controller 1 for subsystem nqn.2025-06.org.nvmexpress.mptcp for NQN nqn.2014-08.org.nvmexpress:uuid:f7f6b5e0-ff97-4894-98ac-c85309e0bc77.
[    5.027401][  T183] nvme nvme0: creating 2 I/O queues.
[    5.029017][  T183] nvme nvme0: mapped 2/0/0 default/read/poll queues.
[    5.032587][  T183] nvme nvme0: new ctrl: NQN "nqn.2025-06.org.nvmexpress.mptcp", addr 127.0.0.1:4420, hostnqn: nqn.2014-08.org.nvmexpress:uuid:f7f6b5e0-ff97-4894-98ac-c85309e0bc77
[    5.042214][   T25]
[    5.042440][   T25] =============================
[    5.042579][   T25] WARNING: suspicious RCU usage
[    5.042705][   T25] 6.16.0-rc3+ #23 Not tainted
[    5.042812][   T25] -----------------------------
[    5.042934][   T25] drivers/nvme/host/multipath.c:1203 RCU-list traversed in non-reader section!!
[    5.043111][   T25]
[    5.043111][   T25] other info that might help us debug this:
[    5.043111][   T25]
[    5.043341][   T25]
[    5.043341][   T25] rcu_scheduler_active = 2, debug_locks = 1
[    5.043502][   T25] 3 locks held by kworker/u9:0/25:
[    5.043615][   T25]  #0: ffff888008730948 ((wq_completion)async){+.+.}-{0:0}, at: process_one_work+0x7ed/0x1350
[    5.043830][   T25]  #1: ffffc900001afd40 ((work_completion)(&entry->work)){+.+.}-{0:0}, at: process_one_work+0xcf3/0x1350
[    5.044084][   T25]  #2: ffff888013ee0020 (&head->srcu){.+.+}-{0:0}, at: nvme_mpath_add_sysfs_link.part.0+0xb4/0x3a0
[    5.044300][   T25]
[    5.044300][   T25] stack backtrace:
[    5.044439][   T25] CPU: 0 UID: 0 PID: 25 Comm: kworker/u9:0 Not tainted 6.16.0-rc3+ #23 PREEMPT(full)
[    5.044441][   T25] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
[    5.044442][   T25] Workqueue: async async_run_entry_fn
[    5.044445][   T25] Call Trace:
[    5.044446][   T25]  <TASK>
[    5.044449][   T25]  dump_stack_lvl+0x6f/0xb0
[    5.044453][   T25]  lockdep_rcu_suspicious.cold+0x4f/0xb1
[    5.044457][   T25]  nvme_mpath_add_sysfs_link.part.0+0x2fb/0x3a0
[    5.044459][   T25]  ? queue_work_on+0x90/0xf0
[    5.044461][   T25]  ? lockdep_hardirqs_on+0x78/0x110
[    5.044466][   T25]  nvme_mpath_set_live+0x1e9/0x4f0
[    5.044470][   T25]  nvme_mpath_add_disk+0x240/0x2f0
[    5.044472][   T25]  ? __pfx_nvme_mpath_add_disk+0x10/0x10
[    5.044475][   T25]  ? add_disk_fwnode+0x361/0x580
[    5.044480][   T25]  nvme_alloc_ns+0x81c/0x17c0
[    5.044483][   T25]  ? kasan_quarantine_put+0x104/0x240
[    5.044487][   T25]  ? __pfx_nvme_alloc_ns+0x10/0x10
[    5.044495][   T25]  ? __pfx_nvme_find_get_ns+0x10/0x10
[    5.044496][   T25]  ? rcu_read_lock_any_held+0x45/0xa0
[    5.044498][   T25]  ? validate_chain+0x232/0x4f0
[    5.044503][   T25]  nvme_scan_ns+0x4c8/0x810
[    5.044506][   T25]  ? __pfx_nvme_scan_ns+0x10/0x10
[    5.044508][   T25]  ? find_held_lock+0x2b/0x80
[    5.044512][   T25]  ? ktime_get+0x16d/0x220
[    5.044517][   T25]  ? kvm_clock_get_cycles+0x18/0x30
[    5.044520][   T25]  ? __pfx_nvme_scan_ns_async+0x10/0x10
[    5.044522][   T25]  async_run_entry_fn+0x97/0x560
[    5.044523][   T25]  ? rcu_is_watching+0x12/0xc0
[    5.044526][   T25]  process_one_work+0xd3c/0x1350
[    5.044532][   T25]  ? __pfx_process_one_work+0x10/0x10
[    5.044536][   T25]  ? assign_work+0x16c/0x240
[    5.044539][   T25]  worker_thread+0x4da/0xd50
[    5.044545][   T25]  ? __pfx_worker_thread+0x10/0x10
[    5.044546][   T25]  kthread+0x356/0x5c0
[    5.044548][   T25]  ? __pfx_kthread+0x10/0x10
[    5.044549][   T25]  ? ret_from_fork+0x1b/0x2e0
[    5.044552][   T25]  ? __lock_release.isra.0+0x5d/0x180
[    5.044553][   T25]  ? ret_from_fork+0x1b/0x2e0
[    5.044555][   T25]  ? rcu_is_watching+0x12/0xc0
[    5.044557][   T25]  ? __pfx_kthread+0x10/0x10
[    5.044559][   T25]  ret_from_fork+0x218/0x2e0
[    5.044561][   T25]  ? __pfx_kthread+0x10/0x10
[    5.044562][   T25]  ret_from_fork_asm+0x1a/0x30
[    5.044570][   T25]  </TASK>
'''

This patch uses sleepable RCU version of helper list_for_each_entry_srcu()
instead of list_for_each_entry_rcu() to fix it.

Fixes: 4dbd2b2ebe4c ("nvme-multipath: Add visibility for round-robin io-policy")
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 drivers/nvme/host/multipath.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
index e040e467f9fa..5e11b0fdf250 100644
--- a/drivers/nvme/host/multipath.c
+++ b/drivers/nvme/host/multipath.c
@@ -1200,7 +1200,8 @@ void nvme_mpath_add_sysfs_link(struct nvme_ns_head *head)
 	 */
 	srcu_idx = srcu_read_lock(&head->srcu);
 
-	list_for_each_entry_rcu(ns, &head->list, siblings) {
+	list_for_each_entry_srcu(ns, &head->list, siblings,
+				 srcu_read_lock_held(&head->srcu)) {
 		/*
 		 * Ensure that ns path disk node is already added otherwise we
 		 * may get invalid kobj name for target
-- 
2.48.1



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] nvme-multipath: fix suspicious RCU usage warning
  2025-06-30  7:48 [PATCH] nvme-multipath: fix suspicious RCU usage warning Geliang Tang
@ 2025-06-30  9:30 ` Hannes Reinecke
  2025-06-30 10:45 ` Nilay Shroff
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Hannes Reinecke @ 2025-06-30  9:30 UTC (permalink / raw)
  To: Geliang Tang, Keith Busch, Jens Axboe, Christoph Hellwig,
	Sagi Grimberg, Nilay Shroff
  Cc: Geliang Tang, linux-nvme

On 6/30/25 09:48, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
> 
> When I run the NVME over TCP test in virtme-ng, I get the following
> "suspicious RCU usage" warning in nvme_mpath_add_sysfs_link():
> 
> '''
> [    5.024557][   T44] nvmet: Created nvm controller 1 for subsystem nqn.2025-06.org.nvmexpress.mptcp for NQN nqn.2014-08.org.nvmexpress:uuid:f7f6b5e0-ff97-4894-98ac-c85309e0bc77.
> [    5.027401][  T183] nvme nvme0: creating 2 I/O queues.
> [    5.029017][  T183] nvme nvme0: mapped 2/0/0 default/read/poll queues.
> [    5.032587][  T183] nvme nvme0: new ctrl: NQN "nqn.2025-06.org.nvmexpress.mptcp", addr 127.0.0.1:4420, hostnqn: nqn.2014-08.org.nvmexpress:uuid:f7f6b5e0-ff97-4894-98ac-c85309e0bc77
> [    5.042214][   T25]
> [    5.042440][   T25] =============================
> [    5.042579][   T25] WARNING: suspicious RCU usage
> [    5.042705][   T25] 6.16.0-rc3+ #23 Not tainted
> [    5.042812][   T25] -----------------------------
> [    5.042934][   T25] drivers/nvme/host/multipath.c:1203 RCU-list traversed in non-reader section!!
> [    5.043111][   T25]
> [    5.043111][   T25] other info that might help us debug this:
> [    5.043111][   T25]
> [    5.043341][   T25]
> [    5.043341][   T25] rcu_scheduler_active = 2, debug_locks = 1
> [    5.043502][   T25] 3 locks held by kworker/u9:0/25:
> [    5.043615][   T25]  #0: ffff888008730948 ((wq_completion)async){+.+.}-{0:0}, at: process_one_work+0x7ed/0x1350
> [    5.043830][   T25]  #1: ffffc900001afd40 ((work_completion)(&entry->work)){+.+.}-{0:0}, at: process_one_work+0xcf3/0x1350
> [    5.044084][   T25]  #2: ffff888013ee0020 (&head->srcu){.+.+}-{0:0}, at: nvme_mpath_add_sysfs_link.part.0+0xb4/0x3a0
> [    5.044300][   T25]
> [    5.044300][   T25] stack backtrace:
> [    5.044439][   T25] CPU: 0 UID: 0 PID: 25 Comm: kworker/u9:0 Not tainted 6.16.0-rc3+ #23 PREEMPT(full)
> [    5.044441][   T25] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
> [    5.044442][   T25] Workqueue: async async_run_entry_fn
> [    5.044445][   T25] Call Trace:
> [    5.044446][   T25]  <TASK>
> [    5.044449][   T25]  dump_stack_lvl+0x6f/0xb0
> [    5.044453][   T25]  lockdep_rcu_suspicious.cold+0x4f/0xb1
> [    5.044457][   T25]  nvme_mpath_add_sysfs_link.part.0+0x2fb/0x3a0
> [    5.044459][   T25]  ? queue_work_on+0x90/0xf0
> [    5.044461][   T25]  ? lockdep_hardirqs_on+0x78/0x110
> [    5.044466][   T25]  nvme_mpath_set_live+0x1e9/0x4f0
> [    5.044470][   T25]  nvme_mpath_add_disk+0x240/0x2f0
> [    5.044472][   T25]  ? __pfx_nvme_mpath_add_disk+0x10/0x10
> [    5.044475][   T25]  ? add_disk_fwnode+0x361/0x580
> [    5.044480][   T25]  nvme_alloc_ns+0x81c/0x17c0
> [    5.044483][   T25]  ? kasan_quarantine_put+0x104/0x240
> [    5.044487][   T25]  ? __pfx_nvme_alloc_ns+0x10/0x10
> [    5.044495][   T25]  ? __pfx_nvme_find_get_ns+0x10/0x10
> [    5.044496][   T25]  ? rcu_read_lock_any_held+0x45/0xa0
> [    5.044498][   T25]  ? validate_chain+0x232/0x4f0
> [    5.044503][   T25]  nvme_scan_ns+0x4c8/0x810
> [    5.044506][   T25]  ? __pfx_nvme_scan_ns+0x10/0x10
> [    5.044508][   T25]  ? find_held_lock+0x2b/0x80
> [    5.044512][   T25]  ? ktime_get+0x16d/0x220
> [    5.044517][   T25]  ? kvm_clock_get_cycles+0x18/0x30
> [    5.044520][   T25]  ? __pfx_nvme_scan_ns_async+0x10/0x10
> [    5.044522][   T25]  async_run_entry_fn+0x97/0x560
> [    5.044523][   T25]  ? rcu_is_watching+0x12/0xc0
> [    5.044526][   T25]  process_one_work+0xd3c/0x1350
> [    5.044532][   T25]  ? __pfx_process_one_work+0x10/0x10
> [    5.044536][   T25]  ? assign_work+0x16c/0x240
> [    5.044539][   T25]  worker_thread+0x4da/0xd50
> [    5.044545][   T25]  ? __pfx_worker_thread+0x10/0x10
> [    5.044546][   T25]  kthread+0x356/0x5c0
> [    5.044548][   T25]  ? __pfx_kthread+0x10/0x10
> [    5.044549][   T25]  ? ret_from_fork+0x1b/0x2e0
> [    5.044552][   T25]  ? __lock_release.isra.0+0x5d/0x180
> [    5.044553][   T25]  ? ret_from_fork+0x1b/0x2e0
> [    5.044555][   T25]  ? rcu_is_watching+0x12/0xc0
> [    5.044557][   T25]  ? __pfx_kthread+0x10/0x10
> [    5.044559][   T25]  ret_from_fork+0x218/0x2e0
> [    5.044561][   T25]  ? __pfx_kthread+0x10/0x10
> [    5.044562][   T25]  ret_from_fork_asm+0x1a/0x30
> [    5.044570][   T25]  </TASK>
> '''
> 
> This patch uses sleepable RCU version of helper list_for_each_entry_srcu()
> instead of list_for_each_entry_rcu() to fix it.
> 
> Fixes: 4dbd2b2ebe4c ("nvme-multipath: Add visibility for round-robin io-policy")
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> ---
>   drivers/nvme/host/multipath.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
> index e040e467f9fa..5e11b0fdf250 100644
> --- a/drivers/nvme/host/multipath.c
> +++ b/drivers/nvme/host/multipath.c
> @@ -1200,7 +1200,8 @@ void nvme_mpath_add_sysfs_link(struct nvme_ns_head *head)
>   	 */
>   	srcu_idx = srcu_read_lock(&head->srcu);
>   
> -	list_for_each_entry_rcu(ns, &head->list, siblings) {
> +	list_for_each_entry_srcu(ns, &head->list, siblings,
> +				 srcu_read_lock_held(&head->srcu)) {
>   		/*
>   		 * Ensure that ns path disk node is already added otherwise we
>   		 * may get invalid kobj name for target

Reviewed-by: Hannes Reinecke <hare@suse.de>

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                  Kernel Storage Architect
hare@suse.de                                +49 911 74053 688
SUSE Software Solutions GmbH, Frankenstr. 146, 90461 Nürnberg
HRB 36809 (AG Nürnberg), GF: I. Totev, A. McDonald, W. Knoblich


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] nvme-multipath: fix suspicious RCU usage warning
  2025-06-30  7:48 [PATCH] nvme-multipath: fix suspicious RCU usage warning Geliang Tang
  2025-06-30  9:30 ` Hannes Reinecke
@ 2025-06-30 10:45 ` Nilay Shroff
  2025-06-30 13:44 ` Christoph Hellwig
  2025-06-30 16:44 ` Keith Busch
  3 siblings, 0 replies; 5+ messages in thread
From: Nilay Shroff @ 2025-06-30 10:45 UTC (permalink / raw)
  To: Geliang Tang, Hannes Reinecke, Keith Busch, Jens Axboe,
	Christoph Hellwig, Sagi Grimberg
  Cc: Geliang Tang, linux-nvme



On 6/30/25 1:18 PM, Geliang Tang wrote:
> This patch uses sleepable RCU version of helper list_for_each_entry_srcu()
> instead of list_for_each_entry_rcu() to fix it.
> 
> Fixes: 4dbd2b2ebe4c ("nvme-multipath: Add visibility for round-robin io-policy")
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>

Looks good to me:
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] nvme-multipath: fix suspicious RCU usage warning
  2025-06-30  7:48 [PATCH] nvme-multipath: fix suspicious RCU usage warning Geliang Tang
  2025-06-30  9:30 ` Hannes Reinecke
  2025-06-30 10:45 ` Nilay Shroff
@ 2025-06-30 13:44 ` Christoph Hellwig
  2025-06-30 16:44 ` Keith Busch
  3 siblings, 0 replies; 5+ messages in thread
From: Christoph Hellwig @ 2025-06-30 13:44 UTC (permalink / raw)
  To: Geliang Tang
  Cc: Hannes Reinecke, Keith Busch, Jens Axboe, Christoph Hellwig,
	Sagi Grimberg, Nilay Shroff, Geliang Tang, linux-nvme

Thanks,

applied to nvme-6.16.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] nvme-multipath: fix suspicious RCU usage warning
  2025-06-30  7:48 [PATCH] nvme-multipath: fix suspicious RCU usage warning Geliang Tang
                   ` (2 preceding siblings ...)
  2025-06-30 13:44 ` Christoph Hellwig
@ 2025-06-30 16:44 ` Keith Busch
  3 siblings, 0 replies; 5+ messages in thread
From: Keith Busch @ 2025-06-30 16:44 UTC (permalink / raw)
  To: Geliang Tang
  Cc: Hannes Reinecke, Jens Axboe, Christoph Hellwig, Sagi Grimberg,
	Nilay Shroff, Geliang Tang, linux-nvme

On Mon, Jun 30, 2025 at 03:48:32PM +0800, Geliang Tang wrote:
> This patch uses sleepable RCU version of helper list_for_each_entry_srcu()
> instead of list_for_each_entry_rcu() to fix it.

Looks good.

Reviewed-by: Keith Busch <kbusch@kernel.org>


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-06-30 17:53 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-30  7:48 [PATCH] nvme-multipath: fix suspicious RCU usage warning Geliang Tang
2025-06-30  9:30 ` Hannes Reinecke
2025-06-30 10:45 ` Nilay Shroff
2025-06-30 13:44 ` Christoph Hellwig
2025-06-30 16:44 ` Keith Busch

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox