README.rst 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. ==================
  2. BPF Selftest Notes
  3. ==================
  4. General instructions on running selftests can be found in
  5. `Documentation/bpf/bpf_devel_QA.rst`__.
  6. __ /Documentation/bpf/bpf_devel_QA.rst#q-how-to-run-bpf-selftests
  7. =============
  8. BPF CI System
  9. =============
  10. BPF employs a continuous integration (CI) system to check patch submission in an
  11. automated fashion. The system runs selftests for each patch in a series. Results
  12. are propagated to patchwork, where failures are highlighted similar to
  13. violations of other checks (such as additional warnings being emitted or a
  14. ``scripts/checkpatch.pl`` reported deficiency):
  15. https://patchwork.kernel.org/project/netdevbpf/list/?delegate=121173
  16. The CI system executes tests on multiple architectures. It uses a kernel
  17. configuration derived from both the generic and architecture specific config
  18. file fragments below ``tools/testing/selftests/bpf/`` (e.g., ``config`` and
  19. ``config.x86_64``).
  20. Denylisting Tests
  21. =================
  22. It is possible for some architectures to not have support for all BPF features.
  23. In such a case tests in CI may fail. An example of such a shortcoming is BPF
  24. trampoline support on IBM's s390x architecture. For cases like this, an in-tree
  25. deny list file, located at ``tools/testing/selftests/bpf/DENYLIST.<arch>``, can
  26. be used to prevent the test from running on such an architecture.
  27. In addition to that, the generic ``tools/testing/selftests/bpf/DENYLIST`` is
  28. honored on every architecture running tests.
  29. These files are organized in three columns. The first column lists the test in
  30. question. This can be the name of a test suite or of an individual test. The
  31. remaining two columns provide additional meta data that helps identify and
  32. classify the entry: column two is a copy and paste of the error being reported
  33. when running the test in the setting in question. The third column, if
  34. available, summarizes the underlying problem. A value of ``trampoline``, for
  35. example, indicates that lack of trampoline support is causing the test to fail.
  36. This last entry helps identify tests that can be re-enabled once such support is
  37. added.
  38. =========================
  39. Running Selftests in a VM
  40. =========================
  41. It's now possible to run the selftests using ``tools/testing/selftests/bpf/vmtest.sh``.
  42. The script tries to ensure that the tests are run with the same environment as they
  43. would be run post-submit in the CI used by the Maintainers, with the exception
  44. that deny lists are not automatically honored.
  45. This script uses the in-tree kernel configuration and downloads a VM userspace
  46. image from the system used by the CI. It builds the kernel (without overwriting
  47. your existing Kconfig), recompiles the bpf selftests, runs them (by default
  48. ``tools/testing/selftests/bpf/test_progs``) and saves the resulting output (by
  49. default in ``~/.bpf_selftests``).
  50. Script dependencies:
  51. - clang (preferably built from sources, https://github.com/llvm/llvm-project);
  52. - pahole (preferably built from sources, https://git.kernel.org/pub/scm/devel/pahole/pahole.git/);
  53. - qemu;
  54. - docutils (for ``rst2man``);
  55. - libcap-devel.
  56. For more information about using the script, run:
  57. .. code-block:: console
  58. $ tools/testing/selftests/bpf/vmtest.sh -h
  59. In case of linker errors when running selftests, try using static linking:
  60. .. code-block:: console
  61. $ LDLIBS=-static PKG_CONFIG='pkg-config --static' vmtest.sh
  62. .. note:: Some distros may not support static linking.
  63. .. note:: The script uses pahole and clang based on host environment setting.
  64. If you want to change pahole and llvm, you can change `PATH` environment
  65. variable in the beginning of script.
  66. Running vmtest on RV64
  67. ======================
  68. To speed up testing and avoid various dependency issues, it is recommended to
  69. run vmtest in a Docker container. Before running vmtest, we need to prepare
  70. Docker container and local rootfs image. The overall steps are as follows:
  71. 1. Create Docker container as shown in link [0].
  72. 2. Use mkrootfs_debian.sh script [1] to build local rootfs image:
  73. .. code-block:: console
  74. $ sudo ./mkrootfs_debian.sh --arch riscv64 --distro noble
  75. 3. Start Docker container [0] and run vmtest in the container:
  76. .. code-block:: console
  77. $ PLATFORM=riscv64 CROSS_COMPILE=riscv64-linux-gnu- \
  78. tools/testing/selftests/bpf/vmtest.sh \
  79. -l <path of local rootfs image> -- \
  80. ./test_progs -d \
  81. \"$(cat tools/testing/selftests/bpf/DENYLIST.riscv64 \
  82. | cut -d'#' -f1 \
  83. | sed -e 's/^[[:space:]]*//' \
  84. -e 's/[[:space:]]*$//' \
  85. | tr -s '\n' ',' \
  86. )\"
  87. Link: https://github.com/pulehui/riscv-bpf-vmtest.git [0]
  88. Link: https://github.com/libbpf/ci/blob/main/rootfs/mkrootfs_debian.sh [1]
  89. Additional information about selftest failures are
  90. documented here.
  91. profiler[23] test failures with clang/llvm <12.0.0
  92. ==================================================
  93. With clang/llvm <12.0.0, the profiler[23] test may fail.
  94. The symptom looks like
  95. .. code-block:: c
  96. // r9 is a pointer to map_value
  97. // r7 is a scalar
  98. 17: bf 96 00 00 00 00 00 00 r6 = r9
  99. 18: 0f 76 00 00 00 00 00 00 r6 += r7
  100. math between map_value pointer and register with unbounded min value is not allowed
  101. // the instructions below will not be seen in the verifier log
  102. 19: a5 07 01 00 01 01 00 00 if r7 < 257 goto +1
  103. 20: bf 96 00 00 00 00 00 00 r6 = r9
  104. // r6 is used here
  105. The verifier will reject such code with above error.
  106. At insn 18 the r7 is indeed unbounded. The later insn 19 checks the bounds and
  107. the insn 20 undoes map_value addition. It is currently impossible for the
  108. verifier to understand such speculative pointer arithmetic.
  109. Hence `this patch`__ addresses it on the compiler side. It was committed on llvm 12.
  110. __ https://github.com/llvm/llvm-project/commit/ddf1864ace484035e3cde5e83b3a31ac81e059c6
  111. The corresponding C code
  112. .. code-block:: c
  113. for (int i = 0; i < MAX_CGROUPS_PATH_DEPTH; i++) {
  114. filepart_length = bpf_probe_read_str(payload, ...);
  115. if (filepart_length <= MAX_PATH) {
  116. barrier_var(filepart_length); // workaround
  117. payload += filepart_length;
  118. }
  119. }
  120. bpf_iter test failures with clang/llvm 10.0.0
  121. =============================================
  122. With clang/llvm 10.0.0, the following two bpf_iter tests failed:
  123. * ``bpf_iter/ipv6_route``
  124. * ``bpf_iter/netlink``
  125. The symptom for ``bpf_iter/ipv6_route`` looks like
  126. .. code-block:: c
  127. 2: (79) r8 = *(u64 *)(r1 +8)
  128. ...
  129. 14: (bf) r2 = r8
  130. 15: (0f) r2 += r1
  131. ; BPF_SEQ_PRINTF(seq, "%pi6 %02x ", &rt->fib6_dst.addr, rt->fib6_dst.plen);
  132. 16: (7b) *(u64 *)(r8 +64) = r2
  133. only read is supported
  134. The symptom for ``bpf_iter/netlink`` looks like
  135. .. code-block:: c
  136. ; struct netlink_sock *nlk = ctx->sk;
  137. 2: (79) r7 = *(u64 *)(r1 +8)
  138. ...
  139. 15: (bf) r2 = r7
  140. 16: (0f) r2 += r1
  141. ; BPF_SEQ_PRINTF(seq, "%pK %-3d ", s, s->sk_protocol);
  142. 17: (7b) *(u64 *)(r7 +0) = r2
  143. only read is supported
  144. This is due to a llvm BPF backend bug. `The fix`__
  145. has been pushed to llvm 10.x release branch and will be
  146. available in 10.0.1. The patch is available in llvm 11.0.0 trunk.
  147. __ https://github.com/llvm/llvm-project/commit/3cb7e7bf959dcd3b8080986c62e10a75c7af43f0
  148. bpf_verif_scale/loop6.bpf.o test failure with Clang 12
  149. ======================================================
  150. With Clang 12, the following bpf_verif_scale test failed:
  151. * ``bpf_verif_scale/loop6.bpf.o``
  152. The verifier output looks like
  153. .. code-block:: c
  154. R1 type=ctx expected=fp
  155. The sequence of 8193 jumps is too complex.
  156. The reason is compiler generating the following code
  157. .. code-block:: c
  158. ; for (i = 0; (i < VIRTIO_MAX_SGS) && (i < num); i++) {
  159. 14: 16 05 40 00 00 00 00 00 if w5 == 0 goto +64 <LBB0_6>
  160. 15: bc 51 00 00 00 00 00 00 w1 = w5
  161. 16: 04 01 00 00 ff ff ff ff w1 += -1
  162. 17: 67 05 00 00 20 00 00 00 r5 <<= 32
  163. 18: 77 05 00 00 20 00 00 00 r5 >>= 32
  164. 19: a6 01 01 00 05 00 00 00 if w1 < 5 goto +1 <LBB0_4>
  165. 20: b7 05 00 00 06 00 00 00 r5 = 6
  166. 00000000000000a8 <LBB0_4>:
  167. 21: b7 02 00 00 00 00 00 00 r2 = 0
  168. 22: b7 01 00 00 00 00 00 00 r1 = 0
  169. ; for (i = 0; (i < VIRTIO_MAX_SGS) && (i < num); i++) {
  170. 23: 7b 1a e0 ff 00 00 00 00 *(u64 *)(r10 - 32) = r1
  171. 24: 7b 5a c0 ff 00 00 00 00 *(u64 *)(r10 - 64) = r5
  172. Note that insn #15 has w1 = w5 and w1 is refined later but
  173. r5(w5) is eventually saved on stack at insn #24 for later use.
  174. This cause later verifier failure. The bug has been `fixed`__ in
  175. Clang 13.
  176. __ https://github.com/llvm/llvm-project/commit/1959ead525b8830cc8a345f45e1c3ef9902d3229
  177. BPF CO-RE-based tests and Clang version
  178. =======================================
  179. A set of selftests use BPF target-specific built-ins, which might require
  180. bleeding-edge Clang versions (Clang 12 nightly at this time).
  181. Few sub-tests of core_reloc test suit (part of test_progs test runner) require
  182. the following built-ins, listed with corresponding Clang diffs introducing
  183. them to Clang/LLVM. These sub-tests are going to be skipped if Clang is too
  184. old to support them, they shouldn't cause build failures or runtime test
  185. failures:
  186. - __builtin_btf_type_id() [0_, 1_, 2_];
  187. - __builtin_preserve_type_info(), __builtin_preserve_enum_value() [3_, 4_].
  188. .. _0: https://github.com/llvm/llvm-project/commit/6b01b465388b204d543da3cf49efd6080db094a9
  189. .. _1: https://github.com/llvm/llvm-project/commit/072cde03aaa13a2c57acf62d79876bf79aa1919f
  190. .. _2: https://github.com/llvm/llvm-project/commit/00602ee7ef0bf6c68d690a2bd729c12b95c95c99
  191. .. _3: https://github.com/llvm/llvm-project/commit/6d218b4adb093ff2e9764febbbc89f429412006c
  192. .. _4: https://github.com/llvm/llvm-project/commit/6d6750696400e7ce988d66a1a00e1d0cb32815f8
  193. Floating-point tests and Clang version
  194. ======================================
  195. Certain selftests, e.g. core_reloc, require support for the floating-point
  196. types, which was introduced in `Clang 13`__. The older Clang versions will
  197. either crash when compiling these tests, or generate an incorrect BTF.
  198. __ https://github.com/llvm/llvm-project/commit/a7137b238a07d9399d3ae96c0b461571bd5aa8b2
  199. Kernel function call test and Clang version
  200. ===========================================
  201. Some selftests (e.g. kfunc_call and bpf_tcp_ca) require a LLVM support
  202. to generate extern function in BTF. It was introduced in `Clang 13`__.
  203. Without it, the error from compiling bpf selftests looks like:
  204. .. code-block:: console
  205. libbpf: failed to find BTF for extern 'tcp_slow_start' [25] section: -2
  206. __ https://github.com/llvm/llvm-project/commit/886f9ff53155075bd5f1e994f17b85d1e1b7470c
  207. btf_tag test and Clang version
  208. ==============================
  209. The btf_tag selftest requires LLVM support to recognize the btf_decl_tag and
  210. btf_type_tag attributes. They are introduced in `Clang 14` [0_, 1_].
  211. The subtests ``btf_type_tag_user_{mod1, mod2, vmlinux}`` also requires
  212. pahole version ``1.23``.
  213. Without them, the btf_tag selftest will be skipped and you will observe:
  214. .. code-block:: console
  215. #<test_num> btf_tag:SKIP
  216. .. _0: https://github.com/llvm/llvm-project/commit/a162b67c98066218d0d00aa13b99afb95d9bb5e6
  217. .. _1: https://github.com/llvm/llvm-project/commit/3466e00716e12e32fdb100e3fcfca5c2b3e8d784
  218. Clang dependencies for static linking tests
  219. ===========================================
  220. linked_vars, linked_maps, and linked_funcs tests depend on `Clang fix`__ to
  221. generate valid BTF information for weak variables. Please make sure you use
  222. Clang that contains the fix.
  223. __ https://github.com/llvm/llvm-project/commit/968292cb93198442138128d850fd54dc7edc0035
  224. Clang relocation changes
  225. ========================
  226. Clang 13 patch `clang reloc patch`_ made some changes on relocations such
  227. that existing relocation types are broken into more types and
  228. each new type corresponds to only one way to resolve relocation.
  229. See `kernel llvm reloc`_ for more explanation and some examples.
  230. Using clang 13 to compile old libbpf which has static linker support,
  231. there will be a compilation failure::
  232. libbpf: ELF relo #0 in section #6 has unexpected type 2 in .../bpf_tcp_nogpl.bpf.o
  233. Here, ``type 2`` refers to new relocation type ``R_BPF_64_ABS64``.
  234. To fix this issue, user newer libbpf.
  235. .. Links
  236. .. _clang reloc patch: https://github.com/llvm/llvm-project/commit/6a2ea84600ba4bd3b2733bd8f08f5115eb32164b
  237. .. _kernel llvm reloc: /Documentation/bpf/llvm_reloc.rst
  238. Clang dependencies for the u32 spill test (xdpwall)
  239. ===================================================
  240. The xdpwall selftest requires a change in `Clang 14`__.
  241. Without it, the xdpwall selftest will fail and the error message
  242. from running test_progs will look like:
  243. .. code-block:: console
  244. test_xdpwall:FAIL:Does LLVM have https://github.com/llvm/llvm-project/commit/ea72b0319d7b0f0c2fcf41d121afa5d031b319d5? unexpected error: -4007
  245. __ https://github.com/llvm/llvm-project/commit/ea72b0319d7b0f0c2fcf41d121afa5d031b319d5