]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tracing: fprobe: Fix infinite recursion using preempt_*_notrace()
authorMasami Hiramatsu (Google) <mhiramat@kernel.org>
Mon, 28 Jul 2025 23:47:03 +0000 (08:47 +0900)
committerMasami Hiramatsu (Google) <mhiramat@kernel.org>
Tue, 29 Jul 2025 07:19:05 +0000 (16:19 +0900)
Since preempt_count_add/del() are tracable functions, it is not allowed
to use preempt_disable/enable() in ftrace handlers. Without this fix,
probing on `preempt_count_add%return` will cause an infinite recursion
of fprobes.

To fix this problem, use preempt_disable/enable_notrace() in
fprobe_return().

Link: https://lore.kernel.org/all/175374642359.1471729.1054175011228386560.stgit@mhiramat.tok.corp.google.com/
Fixes: 4346ba160409 ("fprobe: Rewrite fprobe on function-graph tracer")
Cc: stable@vger.kernel.org
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
kernel/trace/fprobe.c

index ba7ff14f5339b5ea41f50ccde887f0a1bd4b6aab..f9b3aa9afb1784ea2df5cbb7f4ac6e67319c8af3 100644 (file)
@@ -352,7 +352,7 @@ static void fprobe_return(struct ftrace_graph_ret *trace,
        size_words = SIZE_IN_LONG(size);
        ret_ip = ftrace_regs_get_instruction_pointer(fregs);
 
-       preempt_disable();
+       preempt_disable_notrace();
 
        curr = 0;
        while (size_words > curr) {
@@ -368,7 +368,7 @@ static void fprobe_return(struct ftrace_graph_ret *trace,
                }
                curr += size;
        }
-       preempt_enable();
+       preempt_enable_notrace();
 }
 NOKPROBE_SYMBOL(fprobe_return);