From 6ccfba75d3137efc3b665a337b946fd6df1162b9 Mon Sep 17 00:00:00 2001 From: Jesper Dangaard Brouer Date: Thu, 28 Apr 2016 14:20:53 +0200 Subject: [PATCH 1/5] samples/bpf: add back functionality to redefine LLC command It is practical to be-able-to redefine the location of the LLVM command 'llc', because not all distros have a LLVM version with bpf target support. Thus, it is sometimes required to compile LLVM from source, and sometimes it is not desired to overwrite the distros default LLVM version. This feature was removed with 128d1514be35 ("samples/bpf: Use llc in PATH, rather than a hardcoded value"). Add this features back. Note that it is possible to redefine the LLC on the make command like: make samples/bpf/ LLC=~/git/llvm/build/bin/llc Fixes: 128d1514be35 ("samples/bpf: Use llc in PATH, rather than a hardcoded value") Signed-off-by: Jesper Dangaard Brouer Acked-by: Alexei Starovoitov Acked-by: Naveen N. Rao Signed-off-by: David S. Miller --- samples/bpf/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index 744dd7a16144..5bae9536f100 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -81,10 +81,14 @@ HOSTLOADLIBES_spintest += -lelf HOSTLOADLIBES_map_perf_test += -lelf -lrt HOSTLOADLIBES_test_overhead += -lelf -lrt +# Allows pointing LLC to a LLVM backend with bpf support, redefine on cmdline: +# make samples/bpf/ LLC=~/git/llvm/build/bin/llc +LLC ?= llc + # asm/sysreg.h - inline assembly used by it is incompatible with llvm. # But, there is no easy way to fix it, so just exclude it since it is # useless for BPF samples. $(obj)/%.o: $(src)/%.c clang $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) \ -D__KERNEL__ -D__ASM_SYSREG_H -Wno-unused-value -Wno-pointer-sign \ - -O2 -emit-llvm -c $< -o -| llc -march=bpf -filetype=obj -o $@ + -O2 -emit-llvm -c $< -o -| $(LLC) -march=bpf -filetype=obj -o $@ From 7b01dd5793394ee2ef47c328b28c30f5c01107c9 Mon Sep 17 00:00:00 2001 From: Jesper Dangaard Brouer Date: Thu, 28 Apr 2016 14:20:58 +0200 Subject: [PATCH 2/5] samples/bpf: Makefile verify LLVM compiler avail and bpf target is supported Make compiling samples/bpf more user friendly, by detecting if LLVM compiler tool 'llc' is available, and also detect if the 'bpf' target is available in this version of LLVM. Signed-off-by: Jesper Dangaard Brouer Acked-by: Alexei Starovoitov Signed-off-by: David S. Miller --- samples/bpf/Makefile | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index 5bae9536f100..45859c99f573 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -85,6 +85,24 @@ HOSTLOADLIBES_test_overhead += -lelf -lrt # make samples/bpf/ LLC=~/git/llvm/build/bin/llc LLC ?= llc +# Verify LLVM compiler is available and bpf target is supported +.PHONY: verify_cmd_llc verify_target_bpf + +verify_cmd_llc: + @if ! (which "${LLC}" > /dev/null 2>&1); then \ + echo "*** ERROR: Cannot find LLVM tool 'llc' (${LLC})" ;\ + exit 1; \ + else true; fi + +verify_target_bpf: verify_cmd_llc + @if ! (${LLC} -march=bpf -mattr=help > /dev/null 2>&1); then \ + echo "*** ERROR: LLVM (${LLC}) does not support 'bpf' target" ;\ + echo " NOTICE: LLVM version >= 3.7.1 required" ;\ + exit 2; \ + else true; fi + +$(src)/*.c: verify_target_bpf + # asm/sysreg.h - inline assembly used by it is incompatible with llvm. # But, there is no easy way to fix it, so just exclude it since it is # useless for BPF samples. From 1c97566d515de2ef66873e30288b150f0154f3b3 Mon Sep 17 00:00:00 2001 From: Jesper Dangaard Brouer Date: Thu, 28 Apr 2016 14:21:04 +0200 Subject: [PATCH 3/5] samples/bpf: add a README file to get users started Getting started with using examples in samples/bpf/ is not straightforward. There are several dependencies, and specific versions of these dependencies. Just compiling the example tool is also slightly obscure, e.g. one need to call make like: make samples/bpf/ Do notice the "/" slash after the directory name. Signed-off-by: Jesper Dangaard Brouer Acked-by: Naveen N. Rao Acked-by: Alexei Starovoitov Signed-off-by: David S. Miller --- samples/bpf/README.rst | 63 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 samples/bpf/README.rst diff --git a/samples/bpf/README.rst b/samples/bpf/README.rst new file mode 100644 index 000000000000..6f133f3f0075 --- /dev/null +++ b/samples/bpf/README.rst @@ -0,0 +1,63 @@ +eBPF sample programs +==================== + +This directory contains a mini eBPF library, test stubs, verifier +test-suite and examples for using eBPF. + +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`` + +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 samples/bpf/ + +Do notice the "/" slash after the directory name. + +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' command +via redefining LLC on the make command line:: + + make samples/bpf/ LLC=~/git/llvm/build/bin/llc From b62a796c109ca0be3e49de620a8ea8248412446d Mon Sep 17 00:00:00 2001 From: Jesper Dangaard Brouer Date: Thu, 28 Apr 2016 14:21:09 +0200 Subject: [PATCH 4/5] samples/bpf: allow make to be run from samples/bpf/ directory It is not intuitive that 'make' must be run from the top level directory with argument "samples/bpf/" to compile these eBPF samples. Introduce a kbuild make file trick that allow make to be run from the "samples/bpf/" directory itself. It basically change to the top level directory and call "make samples/bpf/" with the "/" slash after the directory name. Also add a clean target that only cleans this directory, by taking advantage of the kbuild external module setting M=$PWD. Signed-off-by: Jesper Dangaard Brouer Acked-by: Alexei Starovoitov Signed-off-by: David S. Miller --- samples/bpf/Makefile | 8 ++++++++ samples/bpf/README.rst | 3 +++ 2 files changed, 11 insertions(+) diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index 45859c99f573..dd63521832d8 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -85,6 +85,14 @@ HOSTLOADLIBES_test_overhead += -lelf -lrt # make samples/bpf/ LLC=~/git/llvm/build/bin/llc LLC ?= llc +# Trick to allow make to be run from this directory +all: + $(MAKE) -C ../../ $$PWD/ + +clean: + $(MAKE) -C ../../ M=$$PWD clean + @rm -f *~ + # Verify LLVM compiler is available and bpf target is supported .PHONY: verify_cmd_llc verify_target_bpf diff --git a/samples/bpf/README.rst b/samples/bpf/README.rst index 6f133f3f0075..e36687d900c8 100644 --- a/samples/bpf/README.rst +++ b/samples/bpf/README.rst @@ -36,6 +36,9 @@ top level directory:: Do notice the "/" slash after the directory name. +It is also possible to call make from this directory. This will just +hide the the invocation of make as above with the appended "/". + Manually compiling LLVM with 'bpf' support ------------------------------------------ From bdefbbf2ecff6efcd253767179a60961aebed9dc Mon Sep 17 00:00:00 2001 From: Jesper Dangaard Brouer Date: Thu, 28 Apr 2016 14:21:14 +0200 Subject: [PATCH 5/5] samples/bpf: like LLC also verify and allow redefining CLANG command Users are likely to manually compile both LLVM 'llc' and 'clang' tools. Thus, also allow redefining CLANG and verify command exist. Makefile implementation wise, the target that verify the command have been generalized. Signed-off-by: Jesper Dangaard Brouer Acked-by: Alexei Starovoitov Signed-off-by: David S. Miller --- samples/bpf/Makefile | 25 ++++++++++++++----------- samples/bpf/README.rst | 6 +++--- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile index dd63521832d8..66897e61232c 100644 --- a/samples/bpf/Makefile +++ b/samples/bpf/Makefile @@ -81,9 +81,10 @@ HOSTLOADLIBES_spintest += -lelf HOSTLOADLIBES_map_perf_test += -lelf -lrt HOSTLOADLIBES_test_overhead += -lelf -lrt -# Allows pointing LLC to a LLVM backend with bpf support, redefine on cmdline: -# make samples/bpf/ LLC=~/git/llvm/build/bin/llc +# 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 # Trick to allow make to be run from this directory all: @@ -93,16 +94,18 @@ clean: $(MAKE) -C ../../ M=$$PWD clean @rm -f *~ -# Verify LLVM compiler is available and bpf target is supported -.PHONY: verify_cmd_llc verify_target_bpf +# Verify LLVM compiler tools are available and bpf target is supported by llc +.PHONY: verify_cmds verify_target_bpf $(CLANG) $(LLC) -verify_cmd_llc: - @if ! (which "${LLC}" > /dev/null 2>&1); then \ - echo "*** ERROR: Cannot find LLVM tool 'llc' (${LLC})" ;\ - exit 1; \ - else true; fi +verify_cmds: $(CLANG) $(LLC) + @for TOOL in $^ ; do \ + if ! (which -- "$${TOOL}" > /dev/null 2>&1); then \ + echo "*** ERROR: Cannot find LLVM tool $${TOOL}" ;\ + exit 1; \ + else true; fi; \ + done -verify_target_bpf: verify_cmd_llc +verify_target_bpf: verify_cmds @if ! (${LLC} -march=bpf -mattr=help > /dev/null 2>&1); then \ echo "*** ERROR: LLVM (${LLC}) does not support 'bpf' target" ;\ echo " NOTICE: LLVM version >= 3.7.1 required" ;\ @@ -115,6 +118,6 @@ $(src)/*.c: verify_target_bpf # But, there is no easy way to fix it, so just exclude it since it is # useless for BPF samples. $(obj)/%.o: $(src)/%.c - clang $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) \ + $(CLANG) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) \ -D__KERNEL__ -D__ASM_SYSREG_H -Wno-unused-value -Wno-pointer-sign \ -O2 -emit-llvm -c $< -o -| $(LLC) -march=bpf -filetype=obj -o $@ diff --git a/samples/bpf/README.rst b/samples/bpf/README.rst index e36687d900c8..a43eae3f0551 100644 --- a/samples/bpf/README.rst +++ b/samples/bpf/README.rst @@ -60,7 +60,7 @@ Quick sniplet for manually compiling LLVM and clang $ cmake .. -DLLVM_TARGETS_TO_BUILD="BPF;X86" $ make -j $(getconf _NPROCESSORS_ONLN) -It is also possible to point make to the newly compiled 'llc' command -via redefining LLC on the make command line:: +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 samples/bpf/ LLC=~/git/llvm/build/bin/llc + make samples/bpf/ LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang