kernel_samsung_a53x/tools/testing/selftests/bpf
Yonghong Song 2416f624ce selftests/bpf: Fix pyperf180 compilation failure with clang18
[ Upstream commit 100888fb6d8a185866b1520031ee7e3182b173de ]

With latest clang18 (main branch of llvm-project repo), when building bpf selftests,
    [~/work/bpf-next (master)]$ make -C tools/testing/selftests/bpf LLVM=1 -j

The following compilation error happens:
    fatal error: error in backend: Branch target out of insn range
    ...
    Stack dump:
    0.      Program arguments: clang -g -Wall -Werror -D__TARGET_ARCH_x86 -mlittle-endian
      -I/home/yhs/work/bpf-next/tools/testing/selftests/bpf/tools/include
      -I/home/yhs/work/bpf-next/tools/testing/selftests/bpf -I/home/yhs/work/bpf-next/tools/include/uapi
      -I/home/yhs/work/bpf-next/tools/testing/selftests/usr/include -idirafter
      /home/yhs/work/llvm-project/llvm/build.18/install/lib/clang/18/include -idirafter /usr/local/include
      -idirafter /usr/include -Wno-compare-distinct-pointer-types -DENABLE_ATOMICS_TESTS -O2 --target=bpf
      -c progs/pyperf180.c -mcpu=v3 -o /home/yhs/work/bpf-next/tools/testing/selftests/bpf/pyperf180.bpf.o
    1.      <eof> parser at end of file
    2.      Code generation
    ...

The compilation failure only happens to cpu=v2 and cpu=v3. cpu=v4 is okay
since cpu=v4 supports 32-bit branch target offset.

The above failure is due to upstream llvm patch [1] where some inlining behavior
are changed in clang18.

To workaround the issue, previously all 180 loop iterations are fully unrolled.
The bpf macro __BPF_CPU_VERSION__ (implemented in clang18 recently) is used to avoid
unrolling changes if cpu=v4. If __BPF_CPU_VERSION__ is not available and the
compiler is clang18, the unrollng amount is unconditionally reduced.

  [1] 1a2e77cf9e

Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Tested-by: Alan Maguire <alan.maguire@oracle.com>
Link: https://lore.kernel.org/bpf/20231110193644.3130906-1-yonghong.song@linux.dev
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-11-18 12:13:11 +01:00
..
benchs Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
gnu Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
map_tests Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
prog_tests selftests/bpf: satisfy compiler by having explicit return in btf test 2024-11-18 12:13:11 +01:00
progs selftests/bpf: Fix pyperf180 compilation failure with clang18 2024-11-18 12:13:11 +01:00
verifier Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bench.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bench.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bpf_legacy.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bpf_rand.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bpf_rlimit.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bpf_tcp_helpers.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bpf_util.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cgroup_helpers.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cgroup_helpers.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
config Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
flow_dissector_load.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
flow_dissector_load.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
get_cgroup_id_user.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Makefile Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
netcnt_common.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
network_helpers.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
network_helpers.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
README.rst Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
settings Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tcp_client.py Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tcp_server.py Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_bpftool.py Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_bpftool.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_bpftool_build.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_bpftool_metadata.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_btf.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_cgroup_storage.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_cpp.cpp Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_current_pid_tgid_new_ns.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_dev_cgroup.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_flow_dissector.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_flow_dissector.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_ftrace.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_iptunnel_common.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_kmod.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_lirc_mode2.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_lirc_mode2_user.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_lpm_map.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_lru_map.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_lwt_ip_encap.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_lwt_seg6local.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_maps.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_maps.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_netcnt.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_offload.py Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_progs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_progs.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_select_reuseport_common.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_skb_cgroup_id.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_skb_cgroup_id_user.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_sock.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_sock_addr.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_sock_addr.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_socket_cookie.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_sockmap.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_stub.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_sysctl.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tag.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tc_edt.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tc_redirect.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tc_tunnel.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tcp_check_syncookie.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tcp_check_syncookie_user.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tcp_hdr_options.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tcpbpf.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tcpbpf_user.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tcpnotify.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tcpnotify_user.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_tunnel.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_verifier.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_verifier_log.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_xdp_meta.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_xdp_redirect.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_xdp_veth.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_xdp_vlan.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_xdp_vlan_mode_generic.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_xdp_vlan_mode_native.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
test_xdping.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
testing_helpers.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
testing_helpers.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_helpers.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace_helpers.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
urandom_read.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
with_addr.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
with_tunnels.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
xdping.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
xdping.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00

==================
BPF Selftest Notes
==================
General instructions on running selftests can be found in
`Documentation/bpf/bpf_devel_QA.rst`_.

Additional information about selftest failures are
documented here.

profiler[23] test failures with clang/llvm <12.0.0
==================================================

With clang/llvm <12.0.0, the profiler[23] test may fail.
The symptom looks like

.. code-block:: c

  // r9 is a pointer to map_value
  // r7 is a scalar
  17:       bf 96 00 00 00 00 00 00 r6 = r9
  18:       0f 76 00 00 00 00 00 00 r6 += r7
  math between map_value pointer and register with unbounded min value is not allowed

  // the instructions below will not be seen in the verifier log
  19:       a5 07 01 00 01 01 00 00 if r7 < 257 goto +1
  20:       bf 96 00 00 00 00 00 00 r6 = r9
  // r6 is used here

The verifier will reject such code with above error.
At insn 18 the r7 is indeed unbounded. The later insn 19 checks the bounds and
the insn 20 undoes map_value addition. It is currently impossible for the
verifier to understand such speculative pointer arithmetic.
Hence
    https://reviews.llvm.org/D85570
addresses it on the compiler side. It was committed on llvm 12.

The corresponding C code
.. code-block:: c

  for (int i = 0; i < MAX_CGROUPS_PATH_DEPTH; i++) {
          filepart_length = bpf_probe_read_str(payload, ...);
          if (filepart_length <= MAX_PATH) {
                  barrier_var(filepart_length); // workaround
                  payload += filepart_length;
          }
  }

bpf_iter test failures with clang/llvm 10.0.0
=============================================

With clang/llvm 10.0.0, the following two bpf_iter tests failed:
  * ``bpf_iter/ipv6_route``
  * ``bpf_iter/netlink``

The symptom for ``bpf_iter/ipv6_route`` looks like

.. code-block:: c

  2: (79) r8 = *(u64 *)(r1 +8)
  ...
  14: (bf) r2 = r8
  15: (0f) r2 += r1
  ; BPF_SEQ_PRINTF(seq, "%pi6 %02x ", &rt->fib6_dst.addr, rt->fib6_dst.plen);
  16: (7b) *(u64 *)(r8 +64) = r2
  only read is supported

The symptom for ``bpf_iter/netlink`` looks like

.. code-block:: c

  ; struct netlink_sock *nlk = ctx->sk;
  2: (79) r7 = *(u64 *)(r1 +8)
  ...
  15: (bf) r2 = r7
  16: (0f) r2 += r1
  ; BPF_SEQ_PRINTF(seq, "%pK %-3d ", s, s->sk_protocol);
  17: (7b) *(u64 *)(r7 +0) = r2
  only read is supported

This is due to a llvm BPF backend bug. The fix 
  https://reviews.llvm.org/D78466
has been pushed to llvm 10.x release branch and will be
available in 10.0.1. The fix is available in llvm 11.0.0 trunk.

BPF CO-RE-based tests and Clang version
=======================================

A set of selftests use BPF target-specific built-ins, which might require
bleeding-edge Clang versions (Clang 12 nightly at this time).

Few sub-tests of core_reloc test suit (part of test_progs test runner) require
the following built-ins, listed with corresponding Clang diffs introducing
them to Clang/LLVM. These sub-tests are going to be skipped if Clang is too
old to support them, they shouldn't cause build failures or runtime test
failures:

  - __builtin_btf_type_id() ([0], [1], [2]);
  - __builtin_preserve_type_info(), __builtin_preserve_enum_value() ([3], [4]).

  [0] https://reviews.llvm.org/D74572
  [1] https://reviews.llvm.org/D74668
  [2] https://reviews.llvm.org/D85174
  [3] https://reviews.llvm.org/D83878
  [4] https://reviews.llvm.org/D83242