linux_dsm_epyc7002/samples/bpf
Jesper Dangaard Brouer edbca120a8 samples/bpf: Fix broken xdp_rxq_info due to map order assumptions
In the days of using bpf_load.c the order in which the 'maps' sections
were defines in BPF side (*_kern.c) file, were used by userspace side
to identify the map via using the map order as an index. In effect the
order-index is created based on the order the maps sections are stored
in the ELF-object file, by the LLVM compiler.

This have also carried over in libbpf via API bpf_map__next(NULL, obj)
to extract maps in the order libbpf parsed the ELF-object file.

When BTF based maps were introduced a new section type ".maps" were
created. I found that the LLVM compiler doesn't create the ".maps"
sections in the order they are defined in the C-file. The order in the
ELF file is based on the order the map pointer is referenced in the code.

This combination of changes lead to xdp_rxq_info mixing up the map
file-descriptors in userspace, resulting in very broken behaviour, but
without warning the user.

This patch fix issue by instead using bpf_object__find_map_by_name()
to find maps via their names. (Note, this is the ELF name, which can
be longer than the name the kernel retains).

Fixes: be5bca44aa ("samples: bpf: convert some XDP samples from bpf_load to libbpf")
Fixes: 451d1dc886 ("samples: bpf: update map definition to new syntax BTF-defined map")
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Toke Høiland-Jørgensen <toke@redhat.com>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Link: https://lore.kernel.org/bpf/157529025128.29832.5953245340679936909.stgit@firesoul
2019-12-04 17:54:15 -08:00
..
.gitignore
asm_goto_workaround.h samples/bpf: Add a workaround for asm_inline 2019-10-03 17:37:11 +02:00
bpf_insn.h
bpf_load.c
bpf_load.h
cookie_uid_helper_example.c
cpustat_kern.c
cpustat_user.c
do_hbm_test.sh
fds_example.c
hash_func01.h
hbm_edt_kern.c
hbm_kern.h selftests/bpf: samples/bpf: Split off legacy stuff from bpf_helpers.h 2019-10-08 23:16:03 +02:00
hbm_out_kern.c
hbm.c samples: bpf: Update outdated error message 2019-11-08 19:19:43 -08:00
hbm.h
ibumad_kern.c
ibumad_user.c
lathist_kern.c
lathist_user.c
lwt_len_hist_kern.c
lwt_len_hist_user.c
lwt_len_hist.sh
Makefile Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next 2019-11-20 18:11:23 -08:00
Makefile.target samples/bpf: Add makefile.target for separate CC target build 2019-10-12 16:08:59 -07:00
map_perf_test_kern.c bpf, samples: Use bpf_probe_read_user where appropriate 2019-11-02 12:39:13 -07:00
map_perf_test_user.c
offwaketime_kern.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
offwaketime_user.c
parse_ldabs.c selftests/bpf: samples/bpf: Split off legacy stuff from bpf_helpers.h 2019-10-08 23:16:03 +02:00
parse_simple.c
parse_varlen.c
README.rst samples/bpf: adjust Makefile and README.rst 2019-11-11 21:42:09 -08:00
run_cookie_uid_helper_example.sh
sampleip_kern.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
sampleip_user.c
sock_example.c
sock_example.h
sock_flags_kern.c
sockex1_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
sockex1_user.c
sockex2_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
sockex2_user.c
sockex3_kern.c selftests/bpf: samples/bpf: Split off legacy stuff from bpf_helpers.h 2019-10-08 23:16:03 +02:00
sockex3_user.c
spintest_kern.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
spintest_user.c
syscall_nrs.c samples: bpf: syscall_nrs: use mmap2 if defined 2019-08-21 14:31:38 +02:00
syscall_tp_kern.c
syscall_tp_user.c
task_fd_query_kern.c
task_fd_query_user.c samples/bpf: Fix build for task_fd_query_user.c 2019-10-03 16:27:03 +02:00
tc_l2_redirect_kern.c
tc_l2_redirect_user.c
tc_l2_redirect.sh
tcbpf1_kern.c selftests/bpf: samples/bpf: Split off legacy stuff from bpf_helpers.h 2019-10-08 23:16:03 +02:00
tcp_basertt_kern.c
tcp_bpf.readme
tcp_bufs_kern.c
tcp_clamp_kern.c
tcp_cong_kern.c
tcp_dumpstats_kern.c
tcp_iw_kern.c
tcp_rwnd_kern.c
tcp_synrto_kern.c
tcp_tos_reflect_kern.c
test_cgrp2_array_pin.c
test_cgrp2_attach.c
test_cgrp2_sock2.c
test_cgrp2_sock2.sh
test_cgrp2_sock.c
test_cgrp2_sock.sh
test_cgrp2_tc_kern.c
test_cgrp2_tc.sh
test_cls_bpf.sh
test_current_task_under_cgroup_kern.c
test_current_task_under_cgroup_user.c
test_ipip.sh
test_lru_dist.c
test_lwt_bpf.c
test_lwt_bpf.sh
test_map_in_map_kern.c bpf, samples: Use bpf_probe_read_user where appropriate 2019-11-02 12:39:13 -07:00
test_map_in_map_user.c
test_overhead_kprobe_kern.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
test_overhead_raw_tp_kern.c
test_overhead_tp_kern.c
test_overhead_user.c
test_override_return.sh
test_probe_write_user_kern.c bpf, samples: Use bpf_probe_read_user where appropriate 2019-11-02 12:39:13 -07:00
test_probe_write_user_user.c
trace_event_kern.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
trace_event_user.c
trace_output_kern.c
trace_output_user.c samples/bpf: switch trace_output sample to perf_buffer API 2019-07-23 16:05:42 -07:00
tracex1_kern.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
tracex1_user.c
tracex2_kern.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
tracex2_user.c
tracex3_kern.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
tracex3_user.c
tracex4_kern.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
tracex4_user.c
tracex5_kern.c selftests/bpf: Split off tracing-only helpers into bpf_tracing.h 2019-10-08 23:16:03 +02:00
tracex5_user.c
tracex6_kern.c
tracex6_user.c
tracex7_kern.c
tracex7_user.c
xdp1_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
xdp1_user.c samples: bpf: Update outdated error message 2019-11-08 19:19:43 -08:00
xdp2_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
xdp2skb_meta_kern.c
xdp2skb_meta.sh
xdp_adjust_tail_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
xdp_adjust_tail_user.c samples: bpf: Add max_pckt_size option at xdp_adjust_tail 2019-10-07 20:22:27 -07:00
xdp_fwd_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
xdp_fwd_user.c samples/bpf: make xdp_fwd more practically usable via devmap lookup 2019-08-09 18:05:03 +02:00
xdp_monitor_kern.c
xdp_monitor_user.c
xdp_redirect_cpu_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
xdp_redirect_cpu_user.c
xdp_redirect_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
xdp_redirect_map_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
xdp_redirect_map_user.c
xdp_redirect_user.c
xdp_router_ipv4_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
xdp_router_ipv4_user.c
xdp_rxq_info_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
xdp_rxq_info_user.c samples/bpf: Fix broken xdp_rxq_info due to map order assumptions 2019-12-04 17:54:15 -08:00
xdp_sample_pkts_kern.c
xdp_sample_pkts_user.c samples: bpf: Update outdated error message 2019-11-08 19:19:43 -08:00
xdp_tx_iptunnel_common.h
xdp_tx_iptunnel_kern.c samples: bpf: update map definition to new syntax BTF-defined map 2019-11-08 19:21:52 -08:00
xdp_tx_iptunnel_user.c samples: bpf: Update outdated error message 2019-11-08 19:19:43 -08:00
xdpsock_kern.c samples/bpf: Add XDP_SHARED_UMEM support to xdpsock 2019-11-10 19:30:45 -08:00
xdpsock_user.c samples/bpf: Add missing option to xdpsock usage 2019-11-15 22:32:10 +01:00
xdpsock.h samples/bpf: Add XDP_SHARED_UMEM support to xdpsock 2019-11-10 19:30:45 -08:00

eBPF sample programs
====================

This directory contains a test stubs, verifier test-suite and examples
for using eBPF. The examples use libbpf from tools/lib/bpf.

Build dependencies
==================

Compiling requires having installed:
 * clang >= version 3.4.0
 * llvm >= version 3.7.1

Note that LLVM's tool 'llc' must support target 'bpf', list version
and supported targets with command: ``llc --version``

Clean and configuration
-----------------------

It can be needed to clean tools, samples or kernel before trying new arch or
after some changes (on demand)::

 make -C tools clean
 make -C samples/bpf clean
 make clean

Configure kernel, defconfig for instance::

 make defconfig

Kernel headers
--------------

There are usually dependencies to header files of the current kernel.
To avoid installing devel kernel headers system wide, as a normal
user, simply call::

 make headers_install

This will creates a local "usr/include" directory in the git/build top
level directory, that the make system automatically pickup first.

Compiling
=========

For building the BPF samples, issue the below command from the kernel
top level directory::

 make M=samples/bpf

It is also possible to call make from this directory.  This will just
hide the invocation of make as above.

Manually compiling LLVM with 'bpf' support
------------------------------------------

Since version 3.7.0, LLVM adds a proper LLVM backend target for the
BPF bytecode architecture.

By default llvm will build all non-experimental backends including bpf.
To generate a smaller llc binary one can use::

 -DLLVM_TARGETS_TO_BUILD="BPF"

Quick sniplet for manually compiling LLVM and clang
(build dependencies are cmake and gcc-c++)::

 $ git clone http://llvm.org/git/llvm.git
 $ cd llvm/tools
 $ git clone --depth 1 http://llvm.org/git/clang.git
 $ cd ..; mkdir build; cd build
 $ cmake .. -DLLVM_TARGETS_TO_BUILD="BPF;X86"
 $ make -j $(getconf _NPROCESSORS_ONLN)

It is also possible to point make to the newly compiled 'llc' or
'clang' command via redefining LLC or CLANG on the make command line::

 make M=samples/bpf LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang

Cross compiling samples
-----------------------
In order to cross-compile, say for arm64 targets, export CROSS_COMPILE and ARCH
environment variables before calling make. But do this before clean,
cofiguration and header install steps described above. This will direct make to
build samples for the cross target::

 export ARCH=arm64
 export CROSS_COMPILE="aarch64-linux-gnu-"

Headers can be also installed on RFS of target board if need to keep them in
sync (not necessarily and it creates a local "usr/include" directory also)::

 make INSTALL_HDR_PATH=~/some_sysroot/usr headers_install

Pointing LLC and CLANG is not necessarily if it's installed on HOST and have
in its targets appropriate arm64 arch (usually it has several arches).
Build samples::

 make M=samples/bpf

Or build samples with SYSROOT if some header or library is absent in toolchain,
say libelf, providing address to file system containing headers and libs,
can be RFS of target board::

 make M=samples/bpf SYSROOT=~/some_sysroot