From: Yonghong Song <yonghong.song@linux.dev>
To: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: Jiri Olsa <olsajiri@gmail.com>,
bpf@vger.kernel.org, Alexei Starovoitov <ast@kernel.org>,
Andrii Nakryiko <andrii@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
kernel-team@fb.com, Martin KaFai Lau <martin.lau@kernel.org>
Subject: Re: [PATCH bpf-next v2 4/5] selftests/bpf: Fix kprobe_multi_bench_attach test failure with LTO kernel
Date: Fri, 22 Mar 2024 15:20:03 -0700 [thread overview]
Message-ID: <124fcb5d-ce26-461b-b84c-1c4623448c96@linux.dev> (raw)
In-Reply-To: <CAEf4Bzbz3Z-NfcJM3h4mLV43E1rFEAO4hY7PmpnMTZxct0TkEw@mail.gmail.com>
On 3/22/24 2:53 PM, Andrii Nakryiko wrote:
> On Fri, Mar 22, 2024 at 9:01 AM Yonghong Song <yonghong.song@linux.dev> wrote:
>>
>> On 3/22/24 5:37 AM, Jiri Olsa wrote:
>>> On Thu, Mar 21, 2024 at 01:01:19PM -0700, Yonghong Song wrote:
>>>> 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
>>>> #117/1 kprobe_multi_bench_attach/kernel:FAIL
>>>>
>>>> There are multiple symbols in /sys/kernel/debug/tracing/available_filter_functions
>>>> are renamed in /proc/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.
>>>>
>>>> The kernel bpf_kprobe_multi_link_attach() and ftrace_lookup_symbols() try
>>>> to find addresses based on /proc/kallsyms, hence the current test failed
>>>> with LTO kenrel.
>>>>
>>>> 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:
>>>> #117/1 kprobe_multi_bench_attach/kernel:OK
>>>>
>>>> Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
>>>> ---
>>>> .../selftests/bpf/prog_tests/kprobe_multi_test.c | 12 ++++++++++++
>>>> 1 file changed, 12 insertions(+)
>>>>
>>>> diff --git a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c b/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
>>>> index 05000810e28e..f6130f4f3d88 100644
>>>> --- a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
>>>> +++ b/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c
>>>> @@ -345,6 +345,9 @@ static int get_syms(char ***symsp, size_t *cntp, bool kernel)
>>>> FILE *f;
>>>> int err = 0;
>>>>
>>>> + if (!ASSERT_OK(load_kallsyms(), "load_kallsyms"))
>>>> + return -EINVAL;
>>>> +
>>>> /*
>>>> * The available_filter_functions contains many duplicates,
>>>> * but other than that all symbols are usable in kprobe multi
>>>> @@ -393,6 +396,15 @@ static int get_syms(char ***symsp, size_t *cntp, bool kernel)
>>>> if (!strncmp(name, "__ftrace_invalid_address__",
>>>> sizeof("__ftrace_invalid_address__") - 1))
>>>> continue;
>>>> + /*
>>>> + * In certain cases, e.g., clang lto kernel, the 'name' here
>>>> + * may be different from the one in /proc/kallsyms due to
>>>> + * /proc/kallsyms name might be "<name>.llvm.<hash>" instead
>>>> + * of "<name>". Exclude these 'name's since they will cause
>>>> + * later kprobe_multi_attach failure.
>>>> + */
>>>> + if (ksym_get_addr(name) == 0)
>>>> + continue;
>>> curious how many symbols like that are there?
>> The number of entries in /sys/kernel/tracing/available_filter_functions: 50654
>> After existing filtering ('arch_cpu_idle') etc: 50513 (filtering 141)
>> After above ksym_get_addr(name) check: 49437 (further filtering 1076)
>>
> alternatively, you could have found matching func.llvm.* for any func
> in available_filter_functions. Have you considered that?
Looks like you prefer not skipping those functions who have .llvm.* in
/proc/kallsyms in this patch set. Yes, I can do that.
>
>>> Acked-by: Jiri Olsa <jolsa@kernel.org>
>>>
>>> jirka
>>>
>>>> err = hashmap__add(map, name, 0);
>>>> if (err == -EEXIST) {
>>>> --
>>>> 2.43.0
>>>>
>>>>
next prev parent reply other threads:[~2024-03-22 22:20 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-21 20:00 [PATCH bpf-next v2 0/5] bpf: Fix a couple of test failures with LTO kernel Yonghong Song
2024-03-21 20:01 ` [PATCH bpf-next v2 1/5] selftests/bpf: Replace CHECK with ASSERT macros for ksyms test Yonghong Song
2024-03-22 12:38 ` Jiri Olsa
2024-03-22 16:13 ` Andrii Nakryiko
2024-03-22 16:41 ` Yonghong Song
2024-03-22 16:48 ` Andrii Nakryiko
2024-03-22 17:28 ` Yonghong Song
2024-03-21 20:01 ` [PATCH bpf-next v2 2/5] libbpf: Mark libbpf_kallsyms_parse static function Yonghong Song
2024-03-22 12:37 ` Jiri Olsa
2024-03-22 15:37 ` Yonghong Song
2024-03-21 20:01 ` [PATCH bpf-next v2 3/5] libbpf: Handle <orig_name>.llvm.<hash> symbol properly Yonghong Song
2024-03-21 21:54 ` Alexei Starovoitov
2024-03-21 23:55 ` Yonghong Song
2024-03-22 0:02 ` Alexei Starovoitov
2024-03-22 0:17 ` Andrii Nakryiko
2024-03-22 0:32 ` Yonghong Song
2024-03-22 0:18 ` Andrii Nakryiko
2024-03-22 0:34 ` Yonghong Song
2024-03-22 21:50 ` Andrii Nakryiko
2024-03-22 22:09 ` Yonghong Song
2024-03-21 20:01 ` [PATCH bpf-next v2 4/5] selftests/bpf: Fix kprobe_multi_bench_attach test failure with LTO kernel Yonghong Song
2024-03-22 12:37 ` Jiri Olsa
2024-03-22 16:01 ` Yonghong Song
2024-03-22 21:53 ` Andrii Nakryiko
2024-03-22 22:20 ` Yonghong Song [this message]
2024-03-21 20:01 ` [PATCH bpf-next v2 5/5] selftests/bpf: Add a selftest with available_filter_functions_addrs Yonghong Song
2024-03-22 12:26 ` Jiri Olsa
2024-03-22 16:07 ` Yonghong Song
2024-03-22 21:58 ` Andrii Nakryiko
2024-03-22 22:23 ` Yonghong Song
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=124fcb5d-ce26-461b-b84c-1c4623448c96@linux.dev \
--to=yonghong.song@linux.dev \
--cc=andrii.nakryiko@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=kernel-team@fb.com \
--cc=martin.lau@kernel.org \
--cc=olsajiri@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.