On Mon, Apr 06, 2026 at 03:31:57PM -0400, Andrey Grodzovsky wrote: > 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. > > Signed-off-by: Andrey Grodzovsky <[email protected]> > Suggested-by: Ihor Solodrai <[email protected]>
lgtm, kprobe_multi seems to behave like that already, maybe you could add test for that as well Acked-by: Jiri Olsa <[email protected]> jirka > --- > kernel/trace/trace_kprobe.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c > index a5dbb72528e0..99c41ea8b6d7 100644 > --- a/kernel/trace/trace_kprobe.c > +++ b/kernel/trace/trace_kprobe.c > @@ -765,6 +765,13 @@ 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; > -- > 2.34.1 >
