xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/bpf/README.rst (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
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