Download zip Select Archive Format
Name Last Update history
File empty ..
File dir benchs Loading commit data...
File dir gnu Loading commit data...
File dir map_tests Loading commit data...
File dir prog_tests Loading commit data...
File dir progs Loading commit data...
File dir verifier Loading commit data...
File txt .gitignore Loading commit data...
File txt Makefile Loading commit data...
File txt README.rst Loading commit data...
File txt bench.c Loading commit data...
File txt bench.h Loading commit data...
File txt bpf_legacy.h Loading commit data...
File txt bpf_rand.h Loading commit data...
File txt bpf_rlimit.h Loading commit data...
File txt bpf_tcp_helpers.h Loading commit data...
File txt bpf_util.h Loading commit data...
File txt cgroup_helpers.c Loading commit data...
File txt cgroup_helpers.h Loading commit data...
File txt config Loading commit data...
File txt flow_dissector_load.c Loading commit data...
File txt flow_dissector_load.h Loading commit data...
File txt get_cgroup_id_user.c Loading commit data...
File txt netcnt_common.h Loading commit data...
File txt network_helpers.c Loading commit data...
File txt network_helpers.h Loading commit data...
File txt settings Loading commit data...
File txt tcp_client.py Loading commit data...
File txt tcp_server.py Loading commit data...
File txt test_bpftool.py Loading commit data...
File txt test_bpftool.sh Loading commit data...
File txt test_bpftool_build.sh Loading commit data...
File txt test_bpftool_metadata.sh Loading commit data...
File txt test_btf.h Loading commit data...
File txt test_cgroup_storage.c Loading commit data...
File txt test_cpp.cpp Loading commit data...
File txt test_current_pid_tgid_new_ns.c Loading commit data...
File txt test_dev_cgroup.c Loading commit data...
File txt test_flow_dissector.c Loading commit data...
File txt test_flow_dissector.sh Loading commit data...
File txt test_ftrace.sh Loading commit data...
File txt test_iptunnel_common.h Loading commit data...
File txt test_kmod.sh Loading commit data...
File txt test_lirc_mode2.sh Loading commit data...
File txt test_lirc_mode2_user.c Loading commit data...
File txt test_lpm_map.c Loading commit data...
File txt test_lru_map.c Loading commit data...
File txt test_lwt_ip_encap.sh Loading commit data...
File txt test_lwt_seg6local.sh Loading commit data...
File txt test_maps.c Loading commit data...
File txt test_maps.h Loading commit data...
File txt test_netcnt.c Loading commit data...
File txt test_offload.py Loading commit data...
File txt test_progs.c Loading commit data...
File txt test_progs.h Loading commit data...
File txt test_select_reuseport_common.h Loading commit data...
File txt test_skb_cgroup_id.sh Loading commit data...
File txt test_skb_cgroup_id_user.c Loading commit data...
File txt test_sock.c Loading commit data...
File txt test_sock_addr.c Loading commit data...
File txt test_sock_addr.sh Loading commit data...
File txt test_socket_cookie.c Loading commit data...
File txt test_sockmap.c Loading commit data...
File txt test_stub.c Loading commit data...
File txt test_sysctl.c Loading commit data...
File txt test_tag.c Loading commit data...
File txt test_tc_edt.sh Loading commit data...
File txt test_tc_redirect.sh Loading commit data...
File txt test_tc_tunnel.sh Loading commit data...
File txt test_tcp_check_syncookie.sh Loading commit data...
File txt test_tcp_check_syncookie_user.c Loading commit data...
File txt test_tcp_hdr_options.h Loading commit data...
File txt test_tcpbpf.h Loading commit data...
File txt test_tcpbpf_user.c Loading commit data...
File txt test_tcpnotify.h Loading commit data...
File txt test_tcpnotify_user.c Loading commit data...
File txt test_tunnel.sh Loading commit data...
File txt test_verifier.c Loading commit data...
File txt test_verifier_log.c Loading commit data...
File txt test_xdp_meta.sh Loading commit data...
File txt test_xdp_redirect.sh Loading commit data...
File txt test_xdp_veth.sh Loading commit data...
File txt test_xdp_vlan.sh Loading commit data...
File txt test_xdp_vlan_mode_generic.sh Loading commit data...
File txt test_xdp_vlan_mode_native.sh Loading commit data...
File txt test_xdping.sh Loading commit data...
File txt testing_helpers.c Loading commit data...
File txt testing_helpers.h Loading commit data...
File txt trace_helpers.c Loading commit data...
File txt trace_helpers.h Loading commit data...
File txt urandom_read.c Loading commit data...
File txt with_addr.sh Loading commit data...
File txt with_tunnels.sh Loading commit data...
File txt xdping.c Loading commit data...
File txt xdping.h Loading commit data...

README.rst

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

// 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

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

; 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