1*053f45beSAndroid Build Coastguard Worker================== 2*053f45beSAndroid Build Coastguard WorkerBPF Selftest Notes 3*053f45beSAndroid Build Coastguard Worker================== 4*053f45beSAndroid Build Coastguard WorkerGeneral instructions on running selftests can be found in 5*053f45beSAndroid Build Coastguard Worker`Documentation/bpf/bpf_devel_QA.rst`__. 6*053f45beSAndroid Build Coastguard Worker 7*053f45beSAndroid Build Coastguard Worker__ /Documentation/bpf/bpf_devel_QA.rst#q-how-to-run-bpf-selftests 8*053f45beSAndroid Build Coastguard Worker 9*053f45beSAndroid Build Coastguard Worker========================= 10*053f45beSAndroid Build Coastguard WorkerRunning Selftests in a VM 11*053f45beSAndroid Build Coastguard Worker========================= 12*053f45beSAndroid Build Coastguard Worker 13*053f45beSAndroid Build Coastguard WorkerIt's now possible to run the selftests using ``tools/testing/selftests/bpf/vmtest.sh``. 14*053f45beSAndroid Build Coastguard WorkerThe script tries to ensure that the tests are run with the same environment as they 15*053f45beSAndroid Build Coastguard Workerwould be run post-submit in the CI used by the Maintainers. 16*053f45beSAndroid Build Coastguard Worker 17*053f45beSAndroid Build Coastguard WorkerThis script downloads a suitable Kconfig and VM userspace image from the system used by 18*053f45beSAndroid Build Coastguard Workerthe CI. It builds the kernel (without overwriting your existing Kconfig), recompiles the 19*053f45beSAndroid Build Coastguard Workerbpf selftests, runs them (by default ``tools/testing/selftests/bpf/test_progs``) and 20*053f45beSAndroid Build Coastguard Workersaves the resulting output (by default in ``~/.bpf_selftests``). 21*053f45beSAndroid Build Coastguard Worker 22*053f45beSAndroid Build Coastguard WorkerScript dependencies: 23*053f45beSAndroid Build Coastguard Worker- clang (preferably built from sources, https://github.com/llvm/llvm-project); 24*053f45beSAndroid Build Coastguard Worker- pahole (preferably built from sources, https://git.kernel.org/pub/scm/devel/pahole/pahole.git/); 25*053f45beSAndroid Build Coastguard Worker- qemu; 26*053f45beSAndroid Build Coastguard Worker- docutils (for ``rst2man``); 27*053f45beSAndroid Build Coastguard Worker- libcap-devel. 28*053f45beSAndroid Build Coastguard Worker 29*053f45beSAndroid Build Coastguard WorkerFor more information on about using the script, run: 30*053f45beSAndroid Build Coastguard Worker 31*053f45beSAndroid Build Coastguard Worker.. code-block:: console 32*053f45beSAndroid Build Coastguard Worker 33*053f45beSAndroid Build Coastguard Worker $ tools/testing/selftests/bpf/vmtest.sh -h 34*053f45beSAndroid Build Coastguard Worker 35*053f45beSAndroid Build Coastguard WorkerIn case of linker errors when running selftests, try using static linking: 36*053f45beSAndroid Build Coastguard Worker 37*053f45beSAndroid Build Coastguard Worker.. code-block:: console 38*053f45beSAndroid Build Coastguard Worker 39*053f45beSAndroid Build Coastguard Worker $ LDLIBS=-static vmtest.sh 40*053f45beSAndroid Build Coastguard Worker 41*053f45beSAndroid Build Coastguard Worker.. note:: Some distros may not support static linking. 42*053f45beSAndroid Build Coastguard Worker 43*053f45beSAndroid Build Coastguard Worker.. note:: The script uses pahole and clang based on host environment setting. 44*053f45beSAndroid Build Coastguard Worker If you want to change pahole and llvm, you can change `PATH` environment 45*053f45beSAndroid Build Coastguard Worker variable in the beginning of script. 46*053f45beSAndroid Build Coastguard Worker 47*053f45beSAndroid Build Coastguard Worker.. note:: The script currently only supports x86_64 and s390x architectures. 48*053f45beSAndroid Build Coastguard Worker 49*053f45beSAndroid Build Coastguard WorkerAdditional information about selftest failures are 50*053f45beSAndroid Build Coastguard Workerdocumented here. 51*053f45beSAndroid Build Coastguard Worker 52*053f45beSAndroid Build Coastguard Workerprofiler[23] test failures with clang/llvm <12.0.0 53*053f45beSAndroid Build Coastguard Worker================================================== 54*053f45beSAndroid Build Coastguard Worker 55*053f45beSAndroid Build Coastguard WorkerWith clang/llvm <12.0.0, the profiler[23] test may fail. 56*053f45beSAndroid Build Coastguard WorkerThe symptom looks like 57*053f45beSAndroid Build Coastguard Worker 58*053f45beSAndroid Build Coastguard Worker.. code-block:: c 59*053f45beSAndroid Build Coastguard Worker 60*053f45beSAndroid Build Coastguard Worker // r9 is a pointer to map_value 61*053f45beSAndroid Build Coastguard Worker // r7 is a scalar 62*053f45beSAndroid Build Coastguard Worker 17: bf 96 00 00 00 00 00 00 r6 = r9 63*053f45beSAndroid Build Coastguard Worker 18: 0f 76 00 00 00 00 00 00 r6 += r7 64*053f45beSAndroid Build Coastguard Worker math between map_value pointer and register with unbounded min value is not allowed 65*053f45beSAndroid Build Coastguard Worker 66*053f45beSAndroid Build Coastguard Worker // the instructions below will not be seen in the verifier log 67*053f45beSAndroid Build Coastguard Worker 19: a5 07 01 00 01 01 00 00 if r7 < 257 goto +1 68*053f45beSAndroid Build Coastguard Worker 20: bf 96 00 00 00 00 00 00 r6 = r9 69*053f45beSAndroid Build Coastguard Worker // r6 is used here 70*053f45beSAndroid Build Coastguard Worker 71*053f45beSAndroid Build Coastguard WorkerThe verifier will reject such code with above error. 72*053f45beSAndroid Build Coastguard WorkerAt insn 18 the r7 is indeed unbounded. The later insn 19 checks the bounds and 73*053f45beSAndroid Build Coastguard Workerthe insn 20 undoes map_value addition. It is currently impossible for the 74*053f45beSAndroid Build Coastguard Workerverifier to understand such speculative pointer arithmetic. 75*053f45beSAndroid Build Coastguard WorkerHence `this patch`__ addresses it on the compiler side. It was committed on llvm 12. 76*053f45beSAndroid Build Coastguard Worker 77*053f45beSAndroid Build Coastguard Worker__ https://reviews.llvm.org/D85570 78*053f45beSAndroid Build Coastguard Worker 79*053f45beSAndroid Build Coastguard WorkerThe corresponding C code 80*053f45beSAndroid Build Coastguard Worker 81*053f45beSAndroid Build Coastguard Worker.. code-block:: c 82*053f45beSAndroid Build Coastguard Worker 83*053f45beSAndroid Build Coastguard Worker for (int i = 0; i < MAX_CGROUPS_PATH_DEPTH; i++) { 84*053f45beSAndroid Build Coastguard Worker filepart_length = bpf_probe_read_str(payload, ...); 85*053f45beSAndroid Build Coastguard Worker if (filepart_length <= MAX_PATH) { 86*053f45beSAndroid Build Coastguard Worker barrier_var(filepart_length); // workaround 87*053f45beSAndroid Build Coastguard Worker payload += filepart_length; 88*053f45beSAndroid Build Coastguard Worker } 89*053f45beSAndroid Build Coastguard Worker } 90*053f45beSAndroid Build Coastguard Worker 91*053f45beSAndroid Build Coastguard Workerbpf_iter test failures with clang/llvm 10.0.0 92*053f45beSAndroid Build Coastguard Worker============================================= 93*053f45beSAndroid Build Coastguard Worker 94*053f45beSAndroid Build Coastguard WorkerWith clang/llvm 10.0.0, the following two bpf_iter tests failed: 95*053f45beSAndroid Build Coastguard Worker * ``bpf_iter/ipv6_route`` 96*053f45beSAndroid Build Coastguard Worker * ``bpf_iter/netlink`` 97*053f45beSAndroid Build Coastguard Worker 98*053f45beSAndroid Build Coastguard WorkerThe symptom for ``bpf_iter/ipv6_route`` looks like 99*053f45beSAndroid Build Coastguard Worker 100*053f45beSAndroid Build Coastguard Worker.. code-block:: c 101*053f45beSAndroid Build Coastguard Worker 102*053f45beSAndroid Build Coastguard Worker 2: (79) r8 = *(u64 *)(r1 +8) 103*053f45beSAndroid Build Coastguard Worker ... 104*053f45beSAndroid Build Coastguard Worker 14: (bf) r2 = r8 105*053f45beSAndroid Build Coastguard Worker 15: (0f) r2 += r1 106*053f45beSAndroid Build Coastguard Worker ; BPF_SEQ_PRINTF(seq, "%pi6 %02x ", &rt->fib6_dst.addr, rt->fib6_dst.plen); 107*053f45beSAndroid Build Coastguard Worker 16: (7b) *(u64 *)(r8 +64) = r2 108*053f45beSAndroid Build Coastguard Worker only read is supported 109*053f45beSAndroid Build Coastguard Worker 110*053f45beSAndroid Build Coastguard WorkerThe symptom for ``bpf_iter/netlink`` looks like 111*053f45beSAndroid Build Coastguard Worker 112*053f45beSAndroid Build Coastguard Worker.. code-block:: c 113*053f45beSAndroid Build Coastguard Worker 114*053f45beSAndroid Build Coastguard Worker ; struct netlink_sock *nlk = ctx->sk; 115*053f45beSAndroid Build Coastguard Worker 2: (79) r7 = *(u64 *)(r1 +8) 116*053f45beSAndroid Build Coastguard Worker ... 117*053f45beSAndroid Build Coastguard Worker 15: (bf) r2 = r7 118*053f45beSAndroid Build Coastguard Worker 16: (0f) r2 += r1 119*053f45beSAndroid Build Coastguard Worker ; BPF_SEQ_PRINTF(seq, "%pK %-3d ", s, s->sk_protocol); 120*053f45beSAndroid Build Coastguard Worker 17: (7b) *(u64 *)(r7 +0) = r2 121*053f45beSAndroid Build Coastguard Worker only read is supported 122*053f45beSAndroid Build Coastguard Worker 123*053f45beSAndroid Build Coastguard WorkerThis is due to a llvm BPF backend bug. `The fix`__ 124*053f45beSAndroid Build Coastguard Workerhas been pushed to llvm 10.x release branch and will be 125*053f45beSAndroid Build Coastguard Workeravailable in 10.0.1. The patch is available in llvm 11.0.0 trunk. 126*053f45beSAndroid Build Coastguard Worker 127*053f45beSAndroid Build Coastguard Worker__ https://reviews.llvm.org/D78466 128*053f45beSAndroid Build Coastguard Worker 129*053f45beSAndroid Build Coastguard Workerbpf_verif_scale/loop6.bpf.o test failure with Clang 12 130*053f45beSAndroid Build Coastguard Worker====================================================== 131*053f45beSAndroid Build Coastguard Worker 132*053f45beSAndroid Build Coastguard WorkerWith Clang 12, the following bpf_verif_scale test failed: 133*053f45beSAndroid Build Coastguard Worker * ``bpf_verif_scale/loop6.bpf.o`` 134*053f45beSAndroid Build Coastguard Worker 135*053f45beSAndroid Build Coastguard WorkerThe verifier output looks like 136*053f45beSAndroid Build Coastguard Worker 137*053f45beSAndroid Build Coastguard Worker.. code-block:: c 138*053f45beSAndroid Build Coastguard Worker 139*053f45beSAndroid Build Coastguard Worker R1 type=ctx expected=fp 140*053f45beSAndroid Build Coastguard Worker The sequence of 8193 jumps is too complex. 141*053f45beSAndroid Build Coastguard Worker 142*053f45beSAndroid Build Coastguard WorkerThe reason is compiler generating the following code 143*053f45beSAndroid Build Coastguard Worker 144*053f45beSAndroid Build Coastguard Worker.. code-block:: c 145*053f45beSAndroid Build Coastguard Worker 146*053f45beSAndroid Build Coastguard Worker ; for (i = 0; (i < VIRTIO_MAX_SGS) && (i < num); i++) { 147*053f45beSAndroid Build Coastguard Worker 14: 16 05 40 00 00 00 00 00 if w5 == 0 goto +64 <LBB0_6> 148*053f45beSAndroid Build Coastguard Worker 15: bc 51 00 00 00 00 00 00 w1 = w5 149*053f45beSAndroid Build Coastguard Worker 16: 04 01 00 00 ff ff ff ff w1 += -1 150*053f45beSAndroid Build Coastguard Worker 17: 67 05 00 00 20 00 00 00 r5 <<= 32 151*053f45beSAndroid Build Coastguard Worker 18: 77 05 00 00 20 00 00 00 r5 >>= 32 152*053f45beSAndroid Build Coastguard Worker 19: a6 01 01 00 05 00 00 00 if w1 < 5 goto +1 <LBB0_4> 153*053f45beSAndroid Build Coastguard Worker 20: b7 05 00 00 06 00 00 00 r5 = 6 154*053f45beSAndroid Build Coastguard Worker 00000000000000a8 <LBB0_4>: 155*053f45beSAndroid Build Coastguard Worker 21: b7 02 00 00 00 00 00 00 r2 = 0 156*053f45beSAndroid Build Coastguard Worker 22: b7 01 00 00 00 00 00 00 r1 = 0 157*053f45beSAndroid Build Coastguard Worker ; for (i = 0; (i < VIRTIO_MAX_SGS) && (i < num); i++) { 158*053f45beSAndroid Build Coastguard Worker 23: 7b 1a e0 ff 00 00 00 00 *(u64 *)(r10 - 32) = r1 159*053f45beSAndroid Build Coastguard Worker 24: 7b 5a c0 ff 00 00 00 00 *(u64 *)(r10 - 64) = r5 160*053f45beSAndroid Build Coastguard Worker 161*053f45beSAndroid Build Coastguard WorkerNote that insn #15 has w1 = w5 and w1 is refined later but 162*053f45beSAndroid Build Coastguard Workerr5(w5) is eventually saved on stack at insn #24 for later use. 163*053f45beSAndroid Build Coastguard WorkerThis cause later verifier failure. The bug has been `fixed`__ in 164*053f45beSAndroid Build Coastguard WorkerClang 13. 165*053f45beSAndroid Build Coastguard Worker 166*053f45beSAndroid Build Coastguard Worker__ https://reviews.llvm.org/D97479 167*053f45beSAndroid Build Coastguard Worker 168*053f45beSAndroid Build Coastguard WorkerBPF CO-RE-based tests and Clang version 169*053f45beSAndroid Build Coastguard Worker======================================= 170*053f45beSAndroid Build Coastguard Worker 171*053f45beSAndroid Build Coastguard WorkerA set of selftests use BPF target-specific built-ins, which might require 172*053f45beSAndroid Build Coastguard Workerbleeding-edge Clang versions (Clang 12 nightly at this time). 173*053f45beSAndroid Build Coastguard Worker 174*053f45beSAndroid Build Coastguard WorkerFew sub-tests of core_reloc test suit (part of test_progs test runner) require 175*053f45beSAndroid Build Coastguard Workerthe following built-ins, listed with corresponding Clang diffs introducing 176*053f45beSAndroid Build Coastguard Workerthem to Clang/LLVM. These sub-tests are going to be skipped if Clang is too 177*053f45beSAndroid Build Coastguard Workerold to support them, they shouldn't cause build failures or runtime test 178*053f45beSAndroid Build Coastguard Workerfailures: 179*053f45beSAndroid Build Coastguard Worker 180*053f45beSAndroid Build Coastguard Worker- __builtin_btf_type_id() [0_, 1_, 2_]; 181*053f45beSAndroid Build Coastguard Worker- __builtin_preserve_type_info(), __builtin_preserve_enum_value() [3_, 4_]. 182*053f45beSAndroid Build Coastguard Worker 183*053f45beSAndroid Build Coastguard Worker.. _0: https://reviews.llvm.org/D74572 184*053f45beSAndroid Build Coastguard Worker.. _1: https://reviews.llvm.org/D74668 185*053f45beSAndroid Build Coastguard Worker.. _2: https://reviews.llvm.org/D85174 186*053f45beSAndroid Build Coastguard Worker.. _3: https://reviews.llvm.org/D83878 187*053f45beSAndroid Build Coastguard Worker.. _4: https://reviews.llvm.org/D83242 188*053f45beSAndroid Build Coastguard Worker 189*053f45beSAndroid Build Coastguard WorkerFloating-point tests and Clang version 190*053f45beSAndroid Build Coastguard Worker====================================== 191*053f45beSAndroid Build Coastguard Worker 192*053f45beSAndroid Build Coastguard WorkerCertain selftests, e.g. core_reloc, require support for the floating-point 193*053f45beSAndroid Build Coastguard Workertypes, which was introduced in `Clang 13`__. The older Clang versions will 194*053f45beSAndroid Build Coastguard Workereither crash when compiling these tests, or generate an incorrect BTF. 195*053f45beSAndroid Build Coastguard Worker 196*053f45beSAndroid Build Coastguard Worker__ https://reviews.llvm.org/D83289 197*053f45beSAndroid Build Coastguard Worker 198*053f45beSAndroid Build Coastguard WorkerKernel function call test and Clang version 199*053f45beSAndroid Build Coastguard Worker=========================================== 200*053f45beSAndroid Build Coastguard Worker 201*053f45beSAndroid Build Coastguard WorkerSome selftests (e.g. kfunc_call and bpf_tcp_ca) require a LLVM support 202*053f45beSAndroid Build Coastguard Workerto generate extern function in BTF. It was introduced in `Clang 13`__. 203*053f45beSAndroid Build Coastguard Worker 204*053f45beSAndroid Build Coastguard WorkerWithout it, the error from compiling bpf selftests looks like: 205*053f45beSAndroid Build Coastguard Worker 206*053f45beSAndroid Build Coastguard Worker.. code-block:: console 207*053f45beSAndroid Build Coastguard Worker 208*053f45beSAndroid Build Coastguard Worker libbpf: failed to find BTF for extern 'tcp_slow_start' [25] section: -2 209*053f45beSAndroid Build Coastguard Worker 210*053f45beSAndroid Build Coastguard Worker__ https://reviews.llvm.org/D93563 211*053f45beSAndroid Build Coastguard Worker 212*053f45beSAndroid Build Coastguard Workerbtf_tag test and Clang version 213*053f45beSAndroid Build Coastguard Worker============================== 214*053f45beSAndroid Build Coastguard Worker 215*053f45beSAndroid Build Coastguard WorkerThe btf_tag selftest requires LLVM support to recognize the btf_decl_tag and 216*053f45beSAndroid Build Coastguard Workerbtf_type_tag attributes. They are introduced in `Clang 14` [0_, 1_]. 217*053f45beSAndroid Build Coastguard WorkerThe subtests ``btf_type_tag_user_{mod1, mod2, vmlinux}`` also requires 218*053f45beSAndroid Build Coastguard Workerpahole version ``1.23``. 219*053f45beSAndroid Build Coastguard Worker 220*053f45beSAndroid Build Coastguard WorkerWithout them, the btf_tag selftest will be skipped and you will observe: 221*053f45beSAndroid Build Coastguard Worker 222*053f45beSAndroid Build Coastguard Worker.. code-block:: console 223*053f45beSAndroid Build Coastguard Worker 224*053f45beSAndroid Build Coastguard Worker #<test_num> btf_tag:SKIP 225*053f45beSAndroid Build Coastguard Worker 226*053f45beSAndroid Build Coastguard Worker.. _0: https://reviews.llvm.org/D111588 227*053f45beSAndroid Build Coastguard Worker.. _1: https://reviews.llvm.org/D111199 228*053f45beSAndroid Build Coastguard Worker 229*053f45beSAndroid Build Coastguard WorkerClang dependencies for static linking tests 230*053f45beSAndroid Build Coastguard Worker=========================================== 231*053f45beSAndroid Build Coastguard Worker 232*053f45beSAndroid Build Coastguard Workerlinked_vars, linked_maps, and linked_funcs tests depend on `Clang fix`__ to 233*053f45beSAndroid Build Coastguard Workergenerate valid BTF information for weak variables. Please make sure you use 234*053f45beSAndroid Build Coastguard WorkerClang that contains the fix. 235*053f45beSAndroid Build Coastguard Worker 236*053f45beSAndroid Build Coastguard Worker__ https://reviews.llvm.org/D100362 237*053f45beSAndroid Build Coastguard Worker 238*053f45beSAndroid Build Coastguard WorkerClang relocation changes 239*053f45beSAndroid Build Coastguard Worker======================== 240*053f45beSAndroid Build Coastguard Worker 241*053f45beSAndroid Build Coastguard WorkerClang 13 patch `clang reloc patch`_ made some changes on relocations such 242*053f45beSAndroid Build Coastguard Workerthat existing relocation types are broken into more types and 243*053f45beSAndroid Build Coastguard Workereach new type corresponds to only one way to resolve relocation. 244*053f45beSAndroid Build Coastguard WorkerSee `kernel llvm reloc`_ for more explanation and some examples. 245*053f45beSAndroid Build Coastguard WorkerUsing clang 13 to compile old libbpf which has static linker support, 246*053f45beSAndroid Build Coastguard Workerthere will be a compilation failure:: 247*053f45beSAndroid Build Coastguard Worker 248*053f45beSAndroid Build Coastguard Worker libbpf: ELF relo #0 in section #6 has unexpected type 2 in .../bpf_tcp_nogpl.bpf.o 249*053f45beSAndroid Build Coastguard Worker 250*053f45beSAndroid Build Coastguard WorkerHere, ``type 2`` refers to new relocation type ``R_BPF_64_ABS64``. 251*053f45beSAndroid Build Coastguard WorkerTo fix this issue, user newer libbpf. 252*053f45beSAndroid Build Coastguard Worker 253*053f45beSAndroid Build Coastguard Worker.. Links 254*053f45beSAndroid Build Coastguard Worker.. _clang reloc patch: https://reviews.llvm.org/D102712 255*053f45beSAndroid Build Coastguard Worker.. _kernel llvm reloc: /Documentation/bpf/llvm_reloc.rst 256*053f45beSAndroid Build Coastguard Worker 257*053f45beSAndroid Build Coastguard WorkerClang dependencies for the u32 spill test (xdpwall) 258*053f45beSAndroid Build Coastguard Worker=================================================== 259*053f45beSAndroid Build Coastguard WorkerThe xdpwall selftest requires a change in `Clang 14`__. 260*053f45beSAndroid Build Coastguard Worker 261*053f45beSAndroid Build Coastguard WorkerWithout it, the xdpwall selftest will fail and the error message 262*053f45beSAndroid Build Coastguard Workerfrom running test_progs will look like: 263*053f45beSAndroid Build Coastguard Worker 264*053f45beSAndroid Build Coastguard Worker.. code-block:: console 265*053f45beSAndroid Build Coastguard Worker 266*053f45beSAndroid Build Coastguard Worker test_xdpwall:FAIL:Does LLVM have https://reviews.llvm.org/D109073? unexpected error: -4007 267*053f45beSAndroid Build Coastguard Worker 268*053f45beSAndroid Build Coastguard Worker__ https://reviews.llvm.org/D109073 269