1==================
2BPF Selftest Notes
3==================
4General instructions on running selftests can be found in
5`Documentation/bpf/bpf_devel_QA.rst`_.
6
7Additional information about selftest failures are
8documented here.
9
10profiler[23] test failures with clang/llvm <12.0.0
11==================================================
12
13With clang/llvm <12.0.0, the profiler[23] test may fail.
14The symptom looks like
15
16.. code-block:: c
17
18  // r9 is a pointer to map_value
19  // r7 is a scalar
20  17:       bf 96 00 00 00 00 00 00 r6 = r9
21  18:       0f 76 00 00 00 00 00 00 r6 += r7
22  math between map_value pointer and register with unbounded min value is not allowed
23
24  // the instructions below will not be seen in the verifier log
25  19:       a5 07 01 00 01 01 00 00 if r7 < 257 goto +1
26  20:       bf 96 00 00 00 00 00 00 r6 = r9
27  // r6 is used here
28
29The verifier will reject such code with above error.
30At insn 18 the r7 is indeed unbounded. The later insn 19 checks the bounds and
31the insn 20 undoes map_value addition. It is currently impossible for the
32verifier to understand such speculative pointer arithmetic.
33Hence
34    https://reviews.llvm.org/D85570
35addresses it on the compiler side. It was committed on llvm 12.
36
37The corresponding C code
38.. code-block:: c
39
40  for (int i = 0; i < MAX_CGROUPS_PATH_DEPTH; i++) {
41          filepart_length = bpf_probe_read_str(payload, ...);
42          if (filepart_length <= MAX_PATH) {
43                  barrier_var(filepart_length); // workaround
44                  payload += filepart_length;
45          }
46  }
47
48bpf_iter test failures with clang/llvm 10.0.0
49=============================================
50
51With clang/llvm 10.0.0, the following two bpf_iter tests failed:
52  * ``bpf_iter/ipv6_route``
53  * ``bpf_iter/netlink``
54
55The symptom for ``bpf_iter/ipv6_route`` looks like
56
57.. code-block:: c
58
59  2: (79) r8 = *(u64 *)(r1 +8)
60  ...
61  14: (bf) r2 = r8
62  15: (0f) r2 += r1
63  ; BPF_SEQ_PRINTF(seq, "%pi6 %02x ", &rt->fib6_dst.addr, rt->fib6_dst.plen);
64  16: (7b) *(u64 *)(r8 +64) = r2
65  only read is supported
66
67The symptom for ``bpf_iter/netlink`` looks like
68
69.. code-block:: c
70
71  ; struct netlink_sock *nlk = ctx->sk;
72  2: (79) r7 = *(u64 *)(r1 +8)
73  ...
74  15: (bf) r2 = r7
75  16: (0f) r2 += r1
76  ; BPF_SEQ_PRINTF(seq, "%pK %-3d ", s, s->sk_protocol);
77  17: (7b) *(u64 *)(r7 +0) = r2
78  only read is supported
79
80This is due to a llvm BPF backend bug. The fix
81  https://reviews.llvm.org/D78466
82has been pushed to llvm 10.x release branch and will be
83available in 10.0.1. The fix is available in llvm 11.0.0 trunk.
84
85BPF CO-RE-based tests and Clang version
86=======================================
87
88A set of selftests use BPF target-specific built-ins, which might require
89bleeding-edge Clang versions (Clang 12 nightly at this time).
90
91Few sub-tests of core_reloc test suit (part of test_progs test runner) require
92the following built-ins, listed with corresponding Clang diffs introducing
93them to Clang/LLVM. These sub-tests are going to be skipped if Clang is too
94old to support them, they shouldn't cause build failures or runtime test
95failures:
96
97  - __builtin_btf_type_id() ([0], [1], [2]);
98  - __builtin_preserve_type_info(), __builtin_preserve_enum_value() ([3], [4]).
99
100  [0] https://reviews.llvm.org/D74572
101  [1] https://reviews.llvm.org/D74668
102  [2] https://reviews.llvm.org/D85174
103  [3] https://reviews.llvm.org/D83878
104  [4] https://reviews.llvm.org/D83242
105