Thread (4 messages) flat view 4 messages, 2 authors, 4d ago
COOLING4d

[PATCH] uprobes: Remove redundant guard(rcu) in find_active_uprobe_speculative()

From: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
Date: 2026-07-30 01:45:46
Also in: linux-perf-users, lkml
Subsystem: performance events subsystem, the rest, uprobes · Maintainers: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim, Linus Torvalds, Masami Hiramatsu, Oleg Nesterov

From: Masami Hiramatsu (Google) <mhiramat@kernel.org>

find_active_uprobe_speculative() is called from find_active_uprobe_rcu(),
which is invoked by handle_swbp() and handle_syscall_uprobe().
Both callers already hold RCU Tasks Trace (via rcu_read_lock_trace() or
guard(rcu_tasks_trace)()).

Calling guard(rcu)() inside find_active_uprobe_speculative() is redundant
because the caller already guarantees RCU Tasks Trace protection.
Furthermore, standard RCU (rcu_read_lock()) does not protect uprobes_tree
against asynchronous uprobe destruction (call_rcu_tasks_trace()).

Remove the redundant guard(rcu)() from find_active_uprobe_speculative() and
replace it with lockdep_assert(rcu_read_lock_trace_held()) and a comment
documenting that callers must hold RCU Tasks Trace protection, matching the
convention used by find_active_uprobe_rcu() and find_uprobe_rcu().

Fixes: e0925f2dc4de ("uprobes: add speculative lockless VMA-to-inode-to-uprobe resolution")
Assisted-by: Antigravity:gemini-3.6-flash
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
---
 kernel/events/uprobes.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index 4084e926e284..b4e253d43b30 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -2424,6 +2424,7 @@ static int is_trap_at_addr(struct mm_struct *mm, unsigned long vaddr)
 	return is_trap_insn(&opcode);
 }
 
+/* assumes being inside RCU Tasks Trace protected region */
 static struct uprobe *find_active_uprobe_speculative(unsigned long bp_vaddr)
 {
 	struct mm_struct *mm = current->mm;
@@ -2433,7 +2434,7 @@ static struct uprobe *find_active_uprobe_speculative(unsigned long bp_vaddr)
 	loff_t offset;
 	unsigned int seq;
 
-	guard(rcu)();
+	lockdep_assert(rcu_read_lock_trace_held());
 
 	if (!mmap_lock_speculate_try_begin(mm, &seq))
 		return NULL;
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help