selftests/bpf: Add profiler test
authorAlexei Starovoitov <ast@kernel.org>
Fri, 9 Oct 2020 01:12:39 +0000 (18:12 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 9 Oct 2020 20:03:06 +0000 (22:03 +0200)
commit03d4d13fab3fa75fbcf09bced5e3c8acf1622969
treecb78a9cc26dad4f3c4a94292f44f85e3e5f49c4b
parent5689d49b71ad25409e41c6052dd9549fbeaf9bde
selftests/bpf: Add profiler test

The main purpose of the profiler test to check different llvm generation
patterns to make sure the verifier can load these large programs.

Note that profiler.inc.h test doesn't follow strict kernel coding style.
The code was formatted in the kernel style, but variable declarations are
kept as-is to preserve original llvm IR pattern.

profiler1.c should pass with older and newer llvm

profiler[23].c may fail on older llvm that don't have:
https://reviews.llvm.org/D85570
because llvm may do speculative code motion optimization that
will generate code like this:

// r9 is a pointer to map_value
// r7 is a scalar
17:       bf 96 00 00 00 00 00 00 r6 = r9
18:       0f 76 00 00 00 00 00 00 r6 += r7
19:       a5 07 01 00 01 01 00 00 if r7 < 257 goto +1
20:       bf 96 00 00 00 00 00 00 r6 = r9
// r6 is used here

The verifier will reject such code with the error:
"math between map_value pointer and register with unbounded min value is not allowed"
At insn 18 the r7 is indeed unbounded. The later insn 19 checks the bounds and
the insn 20 undoes map_value addition. It is currently impossible for the
verifier to understand such speculative pointer arithmetic. Hence llvm D85570
addresses it on the compiler side.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/bpf/20201009011240.48506-4-alexei.starovoitov@gmail.com
tools/testing/selftests/bpf/README.rst
tools/testing/selftests/bpf/prog_tests/test_profiler.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/profiler.h [new file with mode: 0644]
tools/testing/selftests/bpf/progs/profiler.inc.h [new file with mode: 0644]
tools/testing/selftests/bpf/progs/profiler1.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/profiler2.c [new file with mode: 0644]
tools/testing/selftests/bpf/progs/profiler3.c [new file with mode: 0644]