Commit eb1b2985 authored by Jiri Olsa's avatar Jiri Olsa Committed by Alexei Starovoitov
Browse files

ftrace: Keep address offset in ftrace_lookup_symbols



We want to store the resolved address on the same index as
the symbol string, because that's the user (bpf kprobe link)
code assumption.

Also making sure we don't store duplicates that might be
present in kallsyms.

Acked-by: default avatarSong Liu <songliubraving@fb.com>
Acked-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
Fixes: bed0d9a5 ("ftrace: Add ftrace_lookup_symbols function")
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Link: https://lore.kernel.org/r/20220615112118.497303-3-jolsa@kernel.org


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent ad884853
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -8029,15 +8029,23 @@ static int kallsyms_callback(void *data, const char *name,
			     struct module *mod, unsigned long addr)
{
	struct kallsyms_data *args = data;
	const char **sym;
	int idx;

	sym = bsearch(&name, args->syms, args->cnt, sizeof(*args->syms), symbols_cmp);
	if (!sym)
		return 0;

	if (!bsearch(&name, args->syms, args->cnt, sizeof(*args->syms), symbols_cmp))
	idx = sym - args->syms;
	if (args->addrs[idx])
		return 0;

	addr = ftrace_location(addr);
	if (!addr)
		return 0;

	args->addrs[args->found++] = addr;
	args->addrs[idx] = addr;
	args->found++;
	return args->found == args->cnt ? 1 : 0;
}

@@ -8062,6 +8070,7 @@ int ftrace_lookup_symbols(const char **sorted_syms, size_t cnt, unsigned long *a
	struct kallsyms_data args;
	int err;

	memset(addrs, 0, sizeof(*addrs) * cnt);
	args.addrs = addrs;
	args.syms = sorted_syms;
	args.cnt = cnt;