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