Skip to content

Commit d7ca183

Browse files
Yonghong SongKernel Patches Daemon
authored andcommitted
selftests/bpf: Fix possible kprobe_multi_bench_attach test failure with LTO kernel
In my locally build clang LTO kernel (enabling CONFIG_LTO and CONFIG_LTO_CLANG_THIN), kprobe_multi_bench_attach/kernel subtest failed like: test_kprobe_multi_bench_attach:PASS:get_syms 0 nsec test_kprobe_multi_bench_attach:PASS:kprobe_multi_empty__open_and_load 0 nsec libbpf: prog 'test_kprobe_empty': failed to attach: No such process test_kprobe_multi_bench_attach:FAIL:bpf_program__attach_kprobe_multi_opts unexpected error: -3 #114/1 kprobe_multi_bench_attach/kernel:FAIL There are multiple symbols in /sys/kernel/debug/tracing/available_filter_functions are renamed in kallsyms due to cross file inlining. One example is for static function __access_remote_vm in mm/memory.c. In a non-LTO kernel, we have the following call stack: ptrace_access_vm (global, kernel/ptrace.c) access_remote_vm (global, mm/memory.c) __access_remote_vm (static, mm/memory.c) With LTO kernel, it is possible that access_remote_vm() is inlined by ptrace_access_vm(). So we end up with the following call stack: ptrace_access_vm (global, kernel/ptrace.c) __access_remote_vm (static, mm/memory.c) The compiler renames __access_remote_vm to __access_remote_vm.llvm.<hash> to prevent potential name collision. This patch removed __access_remote_vm and other similar functions from kprobe_multi_attach by checking if the symbol like __access_remote_vm does not exist in kallsyms with LTO kernel. The test succeeded after this change: #114/1 kprobe_multi_bench_attach/kernel:OK Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
1 parent 9af0bc9 commit d7ca183

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,10 +341,15 @@ static int get_syms(char ***symsp, size_t *cntp, bool kernel)
341341
size_t cap = 0, cnt = 0, i;
342342
char *name = NULL, **syms = NULL;
343343
struct hashmap *map;
344+
bool lto_kernel;
344345
char buf[256];
345346
FILE *f;
346347
int err = 0;
347348

349+
lto_kernel = kernel && check_lto_kernel() == 1;
350+
if (lto_kernel && !ASSERT_OK(load_kallsyms(), "load_kallsyms"))
351+
return -EINVAL;
352+
348353
/*
349354
* The available_filter_functions contains many duplicates,
350355
* but other than that all symbols are usable in kprobe multi
@@ -393,6 +398,8 @@ static int get_syms(char ***symsp, size_t *cntp, bool kernel)
393398
if (!strncmp(name, "__ftrace_invalid_address__",
394399
sizeof("__ftrace_invalid_address__") - 1))
395400
continue;
401+
if (lto_kernel && ksym_get_addr(name) == 0)
402+
continue;
396403

397404
err = hashmap__add(map, name, 0);
398405
if (err == -EEXIST) {

0 commit comments

Comments
 (0)