On Tue, Oct 30, 2018 at 1:28 PM Paolo Abeni <pab...@redhat.com> wrote: > > XDP support will be used by a later patch to test the GRO path > in a net namespace, leveraging the veth XDP implementation. > To avoid breaking existing setup, XDP support is conditionally > enabled and build only if llc is locally available. > > rfc v2 -> rfc v3: > - move 'x' option handling here > > Signed-off-by: Paolo Abeni <pab...@redhat.com> > --- > tools/testing/selftests/net/Makefile | 69 +++++++++++++++++++ > tools/testing/selftests/net/udpgso_bench_rx.c | 41 ++++++++++- > tools/testing/selftests/net/xdp_dummy.c | 13 ++++ > 3 files changed, 121 insertions(+), 2 deletions(-) > create mode 100644 tools/testing/selftests/net/xdp_dummy.c > > diff --git a/tools/testing/selftests/net/Makefile > b/tools/testing/selftests/net/Makefile > index 256d82d5fa87..176459b7c4d6 100644 > --- a/tools/testing/selftests/net/Makefile > +++ b/tools/testing/selftests/net/Makefile > @@ -16,8 +16,77 @@ TEST_GEN_PROGS = reuseport_bpf reuseport_bpf_cpu > reuseport_bpf_numa > TEST_GEN_PROGS += reuseport_dualstack reuseaddr_conflict tls > > KSFT_KHDR_INSTALL := 1 > + > +# Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on > cmdline: > +# make samples/bpf/ LLC=~/git/llvm/build/bin/llc > CLANG=~/git/llvm/build/bin/clang > +LLC ?= llc > +CLANG ?= clang > +LLVM_OBJCOPY ?= llvm-objcopy > +BTF_PAHOLE ?= pahole > +HAS_LLC := $(shell which $(LLC) 2>/dev/null) > + > +# conditional enable testes requiring llc > +ifneq (, $(HAS_LLC)) > +TEST_GEN_FILES += xdp_dummy.o > +endif > + > include ../lib.mk > > +ifneq (, $(HAS_LLC)) > + > +# Detect that we're cross compiling and use the cross compiler > +ifdef CROSS_COMPILE > +CLANG_ARCH_ARGS = -target $(ARCH) > +endif > + > +PROBE := $(shell $(LLC) -march=bpf -mcpu=probe -filetype=null /dev/null 2>&1) > + > +# Let newer LLVM versions transparently probe the kernel for availability > +# of full BPF instruction set. > +ifeq ($(PROBE),) > + CPU ?= probe > +else > + CPU ?= generic > +endif > + > +SRC_PATH := $(abspath ../../../..) > +LIB_PATH := $(SRC_PATH)/tools/lib > +XDP_CFLAGS := -D SUPPORT_XDP=1 -I$(LIB_PATH) > +LIBBPF = $(LIB_PATH)/bpf/libbpf.a > +BTF_LLC_PROBE := $(shell $(LLC) -march=bpf -mattr=help 2>&1 | grep dwarfris) > +BTF_PAHOLE_PROBE := $(shell $(BTF_PAHOLE) --help 2>&1 | grep BTF) > +BTF_OBJCOPY_PROBE := $(shell $(LLVM_OBJCOPY) --help 2>&1 | grep -i > 'usage.*llvm') > +CLANG_SYS_INCLUDES := $(shell $(CLANG) -v -E - </dev/null 2>&1 \ > + | sed -n '/<...> search starts here:/,/End of search list./{ s| > \(/.*\)|-idirafter \1|p }') > +CLANG_FLAGS = -I. -I$(SRC_PATH)/include -I../bpf/ \ > + $(CLANG_SYS_INCLUDES) -Wno-compare-distinct-pointer-types > + > +ifneq ($(and $(BTF_LLC_PROBE),$(BTF_PAHOLE_PROBE),$(BTF_OBJCOPY_PROBE)),) > + CLANG_CFLAGS += -g > + LLC_FLAGS += -mattr=dwarfris > + DWARF2BTF = y > +endif > + > +$(LIBBPF): FORCE > +# Fix up variables inherited from Kbuild that tools/ build system won't like > + $(MAKE) -C $(dir $@) RM='rm -rf' LDFLAGS= srctree=$(SRC_PATH) O= > $(nodir $@) > + > +$(OUTPUT)/udpgso_bench_rx: $(OUTPUT)/udpgso_bench_rx.c $(LIBBPF) > + $(CC) -o $@ $(XDP_CFLAGS) $(CFLAGS) $(LOADLIBES) $(LDLIBS) $^ -lelf > + > +FORCE: > + > +# bpf program[s] generation > +$(OUTPUT)/%.o: %.c > + $(CLANG) $(CLANG_FLAGS) \ > + -O2 -target bpf -emit-llvm -c $< -o - | \ > + $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ > +ifeq ($(DWARF2BTF),y) > + $(BTF_PAHOLE) -J $@ > +endif > + > +endif > +
To get around having to add all this Makefile boilerplate, perhaps don't integrate the xdp loader with udpgso_bench_rx, but add a standalone trivial loader to /tools/testing/selftests/bpf. Akin to samples/xdp1_user.c, but even simpler because without map. Then also move xdp_dummy.c there. That does add a cross-directory dependency, but that is not significantly different from the SUPPORT_XDP conditional dependency today. On which note, the test initially silently failed for me because the binary compiled, but without that option. It is probably better to fail the test hard and with a clear error if XDP is not supported. With that aside, Tested-by: Willem de Bruijn <will...@google.com>