diff mbox series

tracing: fprobe: Fix RCU warning message in list traversal

Message ID 20250410-fprobe-v1-1-068ef5f41436@debian.org (mailing list archive)
State New
Headers show
Series tracing: fprobe: Fix RCU warning message in list traversal | expand

Commit Message

Breno Leitao April 10, 2025, 12:22 p.m. UTC
When CONFIG_PROVE_RCU_LIST is enabled, fprobe triggers the following
warning:

    WARNING: suspicious RCU usage
    kernel/trace/fprobe.c:457 RCU-list traversed in non-reader section!!

    other info that might help us debug this:
	#1: ffffffff863c4e08 (fprobe_mutex){+.+.}-{4:4}, at: fprobe_module_callback+0x7b/0x8c0

    Call Trace:
	fprobe_module_callback
	notifier_call_chain
	blocking_notifier_call_chain

This warning occurs because fprobe_remove_node_in_module() traverses an
RCU list using RCU primitives without holding an RCU read lock. However,
the function is only called from fprobe_module_callback(), which holds
the fprobe_mutex lock that provides sufficient protection for safely
traversing the list.

Fix the warning by specifying the locking design to the
CONFIG_PROVE_RCU_LIST mechanism. Add the lockdep_is_held() argument to
hlist_for_each_entry_rcu() to inform the RCU checker that fprobe_mutex
provides the required protection.

Fixes: a3dc2983ca7b90 ("tracing: fprobe: Cleanup fprobe hash when module unloading")
Signed-off-by: Breno Leitao <leitao@debian.org>
---
 kernel/trace/fprobe.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)


---
base-commit: 3b07108ada81a8ebcebf1fe61367b4e436c895bd
change-id: 20250410-fprobe-dfe91798f03c

Best regards,

Comments

Antonio Quartulli April 15, 2025, 7:42 a.m. UTC | #1
On 10/04/2025 14:22, Breno Leitao wrote:
> When CONFIG_PROVE_RCU_LIST is enabled, fprobe triggers the following
> warning:
> 
>      WARNING: suspicious RCU usage
>      kernel/trace/fprobe.c:457 RCU-list traversed in non-reader section!!
> 
>      other info that might help us debug this:
> 	#1: ffffffff863c4e08 (fprobe_mutex){+.+.}-{4:4}, at: fprobe_module_callback+0x7b/0x8c0
> 
>      Call Trace:
> 	fprobe_module_callback
> 	notifier_call_chain
> 	blocking_notifier_call_chain
> 
> This warning occurs because fprobe_remove_node_in_module() traverses an
> RCU list using RCU primitives without holding an RCU read lock. However,
> the function is only called from fprobe_module_callback(), which holds
> the fprobe_mutex lock that provides sufficient protection for safely
> traversing the list.
> 
> Fix the warning by specifying the locking design to the
> CONFIG_PROVE_RCU_LIST mechanism. Add the lockdep_is_held() argument to
> hlist_for_each_entry_rcu() to inform the RCU checker that fprobe_mutex
> provides the required protection.
> 
> Fixes: a3dc2983ca7b90 ("tracing: fprobe: Cleanup fprobe hash when module unloading")
> Signed-off-by: Breno Leitao <leitao@debian.org>

I just hit this issue and I verified that the patch actually solves it 
without causing side effects.

FWIW

Tested-by: Antonio Quartulli <antonio@mandelbit.com>
diff mbox series

Patch

diff --git a/kernel/trace/fprobe.c b/kernel/trace/fprobe.c
index 95c6e3473a76b..ba7ff14f5339b 100644
--- a/kernel/trace/fprobe.c
+++ b/kernel/trace/fprobe.c
@@ -454,7 +454,8 @@  static void fprobe_remove_node_in_module(struct module *mod, struct hlist_head *
 	struct fprobe_hlist_node *node;
 	int ret = 0;
 
-	hlist_for_each_entry_rcu(node, head, hlist) {
+	hlist_for_each_entry_rcu(node, head, hlist,
+				 lockdep_is_held(&fprobe_mutex)) {
 		if (!within_module(node->addr, mod))
 			continue;
 		if (delete_fprobe_node(node))