Skip to content

Commit

Permalink
bpf: Fix a few selftest failures due to llvm18 change
Browse files Browse the repository at this point in the history
With latest upstream llvm18, the following test cases failed:

  $ ./test_progs -j
  msm8916-mainline#13/2    bpf_cookie/multi_kprobe_link_api:FAIL
  msm8916-mainline#13/3    bpf_cookie/multi_kprobe_attach_api:FAIL
  msm8916-mainline#13      bpf_cookie:FAIL
  msm8916-mainline#77      fentry_fexit:FAIL
  msm8916-mainline#78/1    fentry_test/fentry:FAIL
  msm8916-mainline#78      fentry_test:FAIL
  msm8916-mainline#82/1    fexit_test/fexit:FAIL
  msm8916-mainline#82      fexit_test:FAIL
  msm8916-mainline#112/1   kprobe_multi_test/skel_api:FAIL
  msm8916-mainline#112/2   kprobe_multi_test/link_api_addrs:FAIL
  [...]
  msm8916-mainline#112     kprobe_multi_test:FAIL
  torvalds#356/17  test_global_funcs/global_func17:FAIL
  torvalds#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 msm8916-mainline#13/msm8916-mainline#77 etc. except torvalds#356.

For test case torvalds#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] llvm/llvm-project#72903

Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20231127050342.1945270-1-yonghong.song@linux.dev
  • Loading branch information
Yonghong Song authored and borkmann committed Nov 27, 2023
1 parent e8a339b commit b16904f
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 1 deletion.
2 changes: 1 addition & 1 deletion net/bpf/test_run.c
Expand Up @@ -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;
}

Expand Down
1 change: 1 addition & 0 deletions tools/testing/selftests/bpf/progs/test_global_func17.c
Expand Up @@ -5,6 +5,7 @@

__noinline int foo(int *p)
{
barrier_var(p);
return p ? (*p = 42) : 0;
}

Expand Down

0 comments on commit b16904f

Please sign in to comment.