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
> 

Reply via email to