BPF List
 help / color / mirror / Atom feed
From: Yonghong Song <yonghong.song@linux.dev>
To: Andrii Nakryiko <andrii.nakryiko@gmail.com>
Cc: 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] bpf: Fix a few selftest failures due to llvm18 change
Date: Mon, 27 Nov 2023 11:49:03 -0800	[thread overview]
Message-ID: <f25da05e-0a93-449b-a683-526641c7acf6@linux.dev> (raw)
In-Reply-To: <CAEf4BzZYydzYLCyPYxsUQ1OhMnnHw7f+mmErzNQFXubZCj8t9w@mail.gmail.com>


On 11/27/23 1:49 PM, Andrii Nakryiko wrote:
> On Sun, Nov 26, 2023 at 9:04 PM Yonghong Song <yonghong.song@linux.dev> wrote:
>> With latest upstream llvm18, the following test cases failed:
>>    $ ./test_progs -j
>>    #13/2    bpf_cookie/multi_kprobe_link_api:FAIL
>>    #13/3    bpf_cookie/multi_kprobe_attach_api:FAIL
>>    #13      bpf_cookie:FAIL
>>    #77      fentry_fexit:FAIL
>>    #78/1    fentry_test/fentry:FAIL
>>    #78      fentry_test:FAIL
>>    #82/1    fexit_test/fexit:FAIL
>>    #82      fexit_test:FAIL
>>    #112/1   kprobe_multi_test/skel_api:FAIL
>>    #112/2   kprobe_multi_test/link_api_addrs:FAIL
>>    ...
>>    #112     kprobe_multi_test:FAIL
>>    #356/17  test_global_funcs/global_func17:FAIL
>>    #356     test_global_funcs:FAIL
>>
>> Further analysis shows llvm upstream patch [1] is responsible
>> for the above failures. For example, for function bpf_fentry_test7()
>> in net/bpf/test_run.c, without [1], the asm code is:
>>    0000000000000400 <bpf_fentry_test7>:
>>       400: f3 0f 1e fa                   endbr64
>>       404: e8 00 00 00 00                callq   0x409 <bpf_fentry_test7+0x9>
>>       409: 48 89 f8                      movq    %rdi, %rax
>>       40c: c3                            retq
>>       40d: 0f 1f 00                      nopl    (%rax)
>> and with [1], the asm code is:
>>    0000000000005d20 <bpf_fentry_test7.specialized.1>:
>>      5d20: e8 00 00 00 00                callq   0x5d25 <bpf_fentry_test7.specialized.1+0x5>
>>      5d25: c3                            retq
>> and <bpf_fentry_test7.specialized.1> is called instead of <bpf_fentry_test7>
>> and this caused test failures for #13/#77 etc. except #356.
>>
>> For test case #356/17, with [1] (progs/test_global_func17.c)),
>> the main prog looks like:
>>    0000000000000000 <global_func17>:
>>         0:       b4 00 00 00 2a 00 00 00 w0 = 0x2a
>>         1:       95 00 00 00 00 00 00 00 exit
>> which passed verification while the test itself expects a verification
>> failure.
>>
>> Let us add 'barrier_var' style asm code in both places to prevent
>> function specialization which caused selftests failure.
>>
>>    [1] https://github.com/llvm/llvm-project/pull/72903
>>
>> Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
>> ---
>>   net/bpf/test_run.c                                     | 2 +-
>>   tools/testing/selftests/bpf/progs/test_global_func17.c | 1 +
>>   2 files changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
>> index c9fdcc5cdce1..711cf5d59816 100644
>> --- a/net/bpf/test_run.c
>> +++ b/net/bpf/test_run.c
>> @@ -542,7 +542,7 @@ struct bpf_fentry_test_t {
>>
>>   int noinline bpf_fentry_test7(struct bpf_fentry_test_t *arg)
>>   {
>> -       asm volatile ("");
>> +       asm volatile ("": "+r"(arg));
>>          return (long)arg;
>>   }
>>
>> diff --git a/tools/testing/selftests/bpf/progs/test_global_func17.c b/tools/testing/selftests/bpf/progs/test_global_func17.c
>> index a32e11c7d933..5de44b09e8ec 100644
>> --- a/tools/testing/selftests/bpf/progs/test_global_func17.c
>> +++ b/tools/testing/selftests/bpf/progs/test_global_func17.c
>> @@ -5,6 +5,7 @@
>>
>>   __noinline int foo(int *p)
>>   {
>> +       barrier_var(p);
>>          return p ? (*p = 42) : 0;
>>   }
>>
> I recently stumbled upon no_clone ([0]) and no_ipa ([1]) attributes.
> Should we consider using those here instead?
>
>    [0] https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noclone-function-attribute
>    [1] https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noipa-function-attribute

noipa attribute might help here. But sadly, noclone and noipa are gcc specific
and clang does not support either of them.

>
>
>> --
>> 2.34.1
>>

  reply	other threads:[~2023-11-27 19:49 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-27  5:03 [PATCH bpf-next] bpf: Fix a few selftest failures due to llvm18 change Yonghong Song
2023-11-27 14:00 ` patchwork-bot+netdevbpf
2023-11-27 18:49 ` Andrii Nakryiko
2023-11-27 19:49   ` Yonghong Song [this message]
2023-11-27 19:57     ` Andrii Nakryiko

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=f25da05e-0a93-449b-a683-526641c7acf6@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 \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox