forked from mirrors/linux
		
	bpf: btf: Add BTF tests
This patch tests the BTF loading, map_create with BTF
and the changes in libbpf.
-r: Raw tests that test raw crafted BTF data
-f: Test LLVM compiled bpf prog with BTF data
-g: Test BPF_OBJ_GET_INFO_BY_FD for btf_fd
-p: Test pretty print
The tools/testing/selftests/bpf/Makefile will probe
for BTF support in llc and pahole before generating
debug info (-g) and convert them to BTF.  You can supply
the BTF supported binary through the following make variables:
LLC, BTF_PAHOLE and LLVM_OBJCOPY.
LLC: The lastest llc with -mattr=dwarfris support for the bpf target.
     It is only in the master of the llvm repo for now.
BTF_PAHOLE: The modified pahole with BTF support:
	    https://github.com/iamkafai/pahole/tree/btf
	    To add a BTF section: "pahole -J bpf_prog.o"
LLVM_OBJCOPY: Any llvm-objcopy should do
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Acked-by: Alexei Starovoitov <ast@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
			
			
This commit is contained in:
		
							parent
							
								
									8a138aed4a
								
							
						
					
					
						commit
						c0fa1b6c3e
					
				
					 4 changed files with 1783 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -24,14 +24,15 @@ urandom_read: urandom_read.c
 | 
			
		|||
# Order correspond to 'make run_tests' order
 | 
			
		||||
TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \
 | 
			
		||||
	test_align test_verifier_log test_dev_cgroup test_tcpbpf_user \
 | 
			
		||||
	test_sock test_sock_addr
 | 
			
		||||
	test_sock test_sock_addr test_btf
 | 
			
		||||
 | 
			
		||||
TEST_GEN_FILES = test_pkt_access.o test_xdp.o test_l4lb.o test_tcp_estats.o test_obj_id.o \
 | 
			
		||||
	test_pkt_md_access.o test_xdp_redirect.o test_xdp_meta.o sockmap_parse_prog.o     \
 | 
			
		||||
	sockmap_verdict_prog.o dev_cgroup.o sample_ret0.o test_tracepoint.o \
 | 
			
		||||
	test_l4lb_noinline.o test_xdp_noinline.o test_stacktrace_map.o \
 | 
			
		||||
	sample_map_ret0.o test_tcpbpf_kern.o test_stacktrace_build_id.o \
 | 
			
		||||
	sockmap_tcp_msg_prog.o connect4_prog.o connect6_prog.o test_adjust_tail.o
 | 
			
		||||
	sockmap_tcp_msg_prog.o connect4_prog.o connect6_prog.o test_adjust_tail.o \
 | 
			
		||||
	test_btf_haskv.o test_btf_nokv.o
 | 
			
		||||
 | 
			
		||||
# Order correspond to 'make run_tests' order
 | 
			
		||||
TEST_PROGS := test_kmod.sh \
 | 
			
		||||
| 
						 | 
				
			
			@ -66,6 +67,8 @@ $(BPFOBJ): force
 | 
			
		|||
 | 
			
		||||
CLANG ?= clang
 | 
			
		||||
LLC   ?= llc
 | 
			
		||||
LLVM_OBJCOPY ?= llvm-objcopy
 | 
			
		||||
BTF_PAHOLE ?= pahole
 | 
			
		||||
 | 
			
		||||
PROBE := $(shell $(LLC) -march=bpf -mcpu=probe -filetype=null /dev/null 2>&1)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -83,9 +86,26 @@ CLANG_FLAGS = -I. -I./include/uapi -I../../../include/uapi \
 | 
			
		|||
$(OUTPUT)/test_l4lb_noinline.o: CLANG_FLAGS += -fno-inline
 | 
			
		||||
$(OUTPUT)/test_xdp_noinline.o: CLANG_FLAGS += -fno-inline
 | 
			
		||||
 | 
			
		||||
BTF_LLC_PROBE := $(shell $(LLC) -march=bpf -mattr=help |& grep dwarfris)
 | 
			
		||||
BTF_PAHOLE_PROBE := $(shell $(BTF_PAHOLE) --help |& grep BTF)
 | 
			
		||||
BTF_OBJCOPY_PROBE := $(shell $(LLVM_OBJCOPY) --version |& grep LLVM)
 | 
			
		||||
 | 
			
		||||
ifneq ($(BTF_LLC_PROBE),)
 | 
			
		||||
ifneq ($(BTF_PAHOLE_PROBE),)
 | 
			
		||||
ifneq ($(BTF_OBJCOPY_PROBE),)
 | 
			
		||||
	CLANG_FLAGS += -g
 | 
			
		||||
	LLC_FLAGS += -mattr=dwarfris
 | 
			
		||||
	DWARF2BTF = y
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
$(OUTPUT)/%.o: %.c
 | 
			
		||||
	$(CLANG) $(CLANG_FLAGS) \
 | 
			
		||||
		 -O2 -target bpf -emit-llvm -c $< -o - |      \
 | 
			
		||||
	$(LLC) -march=bpf -mcpu=$(CPU) -filetype=obj -o $@
 | 
			
		||||
	$(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@
 | 
			
		||||
ifeq ($(DWARF2BTF),y)
 | 
			
		||||
	$(BTF_PAHOLE) -J $@
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
EXTRA_CLEAN := $(TEST_CUSTOM_PROGS)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1669
									
								
								tools/testing/selftests/bpf/test_btf.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1669
									
								
								tools/testing/selftests/bpf/test_btf.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										48
									
								
								tools/testing/selftests/bpf/test_btf_haskv.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								tools/testing/selftests/bpf/test_btf_haskv.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,48 @@
 | 
			
		|||
/* SPDX-License-Identifier: GPL-2.0 */
 | 
			
		||||
/* Copyright (c) 2018 Facebook */
 | 
			
		||||
#include <linux/bpf.h>
 | 
			
		||||
#include "bpf_helpers.h"
 | 
			
		||||
 | 
			
		||||
int _version SEC("version") = 1;
 | 
			
		||||
 | 
			
		||||
struct ipv_counts {
 | 
			
		||||
	unsigned int v4;
 | 
			
		||||
	unsigned int v6;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef int btf_map_key;
 | 
			
		||||
typedef struct ipv_counts btf_map_value;
 | 
			
		||||
btf_map_key dumm_key;
 | 
			
		||||
btf_map_value dummy_value;
 | 
			
		||||
 | 
			
		||||
struct bpf_map_def SEC("maps") btf_map = {
 | 
			
		||||
	.type = BPF_MAP_TYPE_ARRAY,
 | 
			
		||||
	.key_size = sizeof(int),
 | 
			
		||||
	.value_size = sizeof(struct ipv_counts),
 | 
			
		||||
	.max_entries = 4,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct dummy_tracepoint_args {
 | 
			
		||||
	unsigned long long pad;
 | 
			
		||||
	struct sock *sock;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SEC("dummy_tracepoint")
 | 
			
		||||
int _dummy_tracepoint(struct dummy_tracepoint_args *arg)
 | 
			
		||||
{
 | 
			
		||||
	struct ipv_counts *counts;
 | 
			
		||||
	int key = 0;
 | 
			
		||||
 | 
			
		||||
	if (!arg->sock)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	counts = bpf_map_lookup_elem(&btf_map, &key);
 | 
			
		||||
	if (!counts)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	counts->v6++;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char _license[] SEC("license") = "GPL";
 | 
			
		||||
							
								
								
									
										43
									
								
								tools/testing/selftests/bpf/test_btf_nokv.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								tools/testing/selftests/bpf/test_btf_nokv.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
/* SPDX-License-Identifier: GPL-2.0 */
 | 
			
		||||
/* Copyright (c) 2018 Facebook */
 | 
			
		||||
#include <linux/bpf.h>
 | 
			
		||||
#include "bpf_helpers.h"
 | 
			
		||||
 | 
			
		||||
int _version SEC("version") = 1;
 | 
			
		||||
 | 
			
		||||
struct ipv_counts {
 | 
			
		||||
	unsigned int v4;
 | 
			
		||||
	unsigned int v6;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct bpf_map_def SEC("maps") btf_map = {
 | 
			
		||||
	.type = BPF_MAP_TYPE_ARRAY,
 | 
			
		||||
	.key_size = sizeof(int),
 | 
			
		||||
	.value_size = sizeof(struct ipv_counts),
 | 
			
		||||
	.max_entries = 4,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct dummy_tracepoint_args {
 | 
			
		||||
	unsigned long long pad;
 | 
			
		||||
	struct sock *sock;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SEC("dummy_tracepoint")
 | 
			
		||||
int _dummy_tracepoint(struct dummy_tracepoint_args *arg)
 | 
			
		||||
{
 | 
			
		||||
	struct ipv_counts *counts;
 | 
			
		||||
	int key = 0;
 | 
			
		||||
 | 
			
		||||
	if (!arg->sock)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	counts = bpf_map_lookup_elem(&btf_map, &key);
 | 
			
		||||
	if (!counts)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	counts->v6++;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char _license[] SEC("license") = "GPL";
 | 
			
		||||
		Loading…
	
		Reference in a new issue