]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ftrace: Add missing ftrace_lock to update_ftrace_direct_add/del
authorJiri Olsa <jolsa@kernel.org>
Mon, 2 Mar 2026 08:16:22 +0000 (09:16 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 2 Mar 2026 17:51:07 +0000 (09:51 -0800)
Ihor and Kumar reported splat from ftrace_get_addr_curr [1], which happened
because of the missing ftrace_lock in update_ftrace_direct_add/del functions
allowing concurrent access to ftrace internals.

The ftrace_update_ops function must be guarded by ftrace_lock, adding that.

Fixes: 05dc5e9c1fe1 ("ftrace: Add update_ftrace_direct_add function")
Fixes: 8d2c1233f371 ("ftrace: Add update_ftrace_direct_del function")
Reported-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Reported-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Closes: https://lore.kernel.org/bpf/1b58ffb2-92ae-433a-ba46-95294d6edea2@linux.dev/
Tested-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Reviewed-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Link: https://lore.kernel.org/r/20260302081622.165713-1-jolsa@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/trace/ftrace.c

index 827fb9a0bf0dfa6ea16ddfdf5f19d717ffadfca2..8baf61c9be6df874f448e08a21d83833294e4415 100644 (file)
@@ -6404,6 +6404,7 @@ int update_ftrace_direct_add(struct ftrace_ops *ops, struct ftrace_hash *hash)
                        new_filter_hash = old_filter_hash;
                }
        } else {
+               guard(mutex)(&ftrace_lock);
                err = ftrace_update_ops(ops, new_filter_hash, EMPTY_HASH);
                /*
                 * new_filter_hash is dup-ed, so we need to release it anyway,
@@ -6530,6 +6531,7 @@ int update_ftrace_direct_del(struct ftrace_ops *ops, struct ftrace_hash *hash)
                        ops->func_hash->filter_hash = NULL;
                }
        } else {
+               guard(mutex)(&ftrace_lock);
                err = ftrace_update_ops(ops, new_filter_hash, EMPTY_HASH);
                /*
                 * new_filter_hash is dup-ed, so we need to release it anyway,