]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpf: Prefer vmlinux symbols over module symbols for unqualified kprobes
authorAndrey Grodzovsky <andrey.grodzovsky@crowdstrike.com>
Tue, 7 Apr 2026 20:39:11 +0000 (16:39 -0400)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 7 Apr 2026 23:27:52 +0000 (16:27 -0700)
When an unqualified kprobe target exists in both vmlinux and a loaded
module, number_of_same_symbols() returns a count greater than 1,
causing kprobe attachment to fail with -EADDRNOTAVAIL even though the
vmlinux symbol is unambiguous.

When no module qualifier is given and the symbol is found in vmlinux,
return the vmlinux-only count without scanning loaded modules. This
preserves the existing behavior for all other cases:
- Symbol only in a module: vmlinux count is 0, falls through to module
  scan as before.
- Symbol qualified with MOD:SYM: mod != NULL, unchanged path.
- Symbol ambiguous within vmlinux itself: count > 1 is returned as-is.

Fixes: 926fe783c8a6 ("tracing/kprobes: Fix symbol counting logic by looking at modules as well")
Fixes: 9d8616034f16 ("tracing/kprobes: Add symbol counting check when module loads")
Suggested-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@crowdstrike.com>
Link: https://lore.kernel.org/r/20260407203912.1787502-2-andrey.grodzovsky@crowdstrike.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/trace/trace_kprobe.c

index a5dbb72528e0c3682c8d37da64c56d6b145a3749..058724c41c469d14b234a672ec163070493f7669 100644 (file)
@@ -765,6 +765,14 @@ static unsigned int number_of_same_symbols(const char *mod, const char *func_nam
        if (!mod)
                kallsyms_on_each_match_symbol(count_symbols, func_name, &ctx.count);
 
+       /*
+        * If the symbol is found in vmlinux, use vmlinux resolution only.
+        * This prevents module symbols from shadowing vmlinux symbols
+        * and causing -EADDRNOTAVAIL for unqualified kprobe targets.
+        */
+       if (!mod && ctx.count > 0)
+               return ctx.count;
+
        module_kallsyms_on_each_symbol(mod, count_mod_symbols, &ctx);
 
        return ctx.count;