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