Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf build: Support build BPF skeletons with perf

BPF programs are useful in perf to profile BPF programs.

BPF skeleton is by far the easiest way to write BPF tools. Enable
building BPF skeletons in util/bpf_skel. A dummy bpf skeleton is added.
More bpf skeletons will be added for different use cases.

Signed-off-by: Song Liu <songliubraving@fb.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: kernel-team@fb.com
Link: http://lore.kernel.org/lkml/20201229214214.3413833-3-songliubraving@fb.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Song Liu and committed by
Arnaldo Carvalho de Melo
fbcdaa19 d2032d45

+63 -3
+3 -1
tools/build/Makefile.feature
··· 99 99 clang \ 100 100 libbpf \ 101 101 libpfm4 \ 102 - libdebuginfod 102 + libdebuginfod \ 103 + clang-bpf-co-re 104 + 103 105 104 106 FEATURE_TESTS ?= $(FEATURE_TESTS_BASIC) 105 107
+9
tools/perf/Makefile.config
··· 621 621 endif 622 622 endif 623 623 624 + ifdef BUILD_BPF_SKEL 625 + $(call feature_check,clang-bpf-co-re) 626 + ifeq ($(feature-clang-bpf-co-re), 0) 627 + dummy := $(error Error: clang too old. Please install recent clang) 628 + endif 629 + $(call detected,CONFIG_PERF_BPF_SKEL) 630 + CFLAGS += -DHAVE_BPF_SKEL 631 + endif 632 + 624 633 dwarf-post-unwind := 1 625 634 dwarf-post-unwind-text := BUG 626 635
+47 -2
tools/perf/Makefile.perf
··· 126 126 # 127 127 # Define NO_LIBDEBUGINFOD if you do not want support debuginfod 128 128 # 129 + # Define BUILD_BPF_SKEL to enable BPF skeletons 130 + # 129 131 130 132 # As per kernel Makefile, avoid funny character set dependencies 131 133 unexport LC_ALL ··· 176 174 endef 177 175 178 176 LD += $(EXTRA_LDFLAGS) 177 + 178 + HOSTCC ?= gcc 179 + HOSTLD ?= ld 180 + HOSTAR ?= ar 181 + CLANG ?= clang 182 + LLVM_STRIP ?= llvm-strip 179 183 180 184 PKG_CONFIG = $(CROSS_COMPILE)pkg-config 181 185 LLVM_CONFIG ?= llvm-config ··· 739 731 $(x86_arch_prctl_code_array) \ 740 732 $(rename_flags_array) \ 741 733 $(arch_errno_name_array) \ 742 - $(sync_file_range_arrays) 734 + $(sync_file_range_arrays) \ 735 + bpf-skel 743 736 744 737 $(OUTPUT)%.o: %.c prepare FORCE 745 738 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ ··· 1013 1004 python-clean: 1014 1005 $(python-clean) 1015 1006 1016 - clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBPERF)-clean config-clean fixdep-clean python-clean 1007 + SKEL_OUT := $(abspath $(OUTPUT)util/bpf_skel) 1008 + SKEL_TMP_OUT := $(abspath $(SKEL_OUT)/.tmp) 1009 + SKELETONS := 1010 + 1011 + ifdef BUILD_BPF_SKEL 1012 + BPFTOOL := $(SKEL_TMP_OUT)/bootstrap/bpftool 1013 + LIBBPF_SRC := $(abspath ../lib/bpf) 1014 + BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(BPF_PATH) -I$(LIBBPF_SRC)/.. 1015 + 1016 + $(SKEL_TMP_OUT): 1017 + $(Q)$(MKDIR) -p $@ 1018 + 1019 + $(BPFTOOL): | $(SKEL_TMP_OUT) 1020 + CFLAGS= $(MAKE) -C ../bpf/bpftool \ 1021 + OUTPUT=$(SKEL_TMP_OUT)/ bootstrap 1022 + 1023 + $(SKEL_TMP_OUT)/%.bpf.o: util/bpf_skel/%.bpf.c $(LIBBPF) | $(SKEL_TMP_OUT) 1024 + $(QUIET_CLANG)$(CLANG) -g -O2 -target bpf $(BPF_INCLUDE) \ 1025 + -c $(filter util/bpf_skel/%.bpf.c,$^) -o $@ && $(LLVM_STRIP) -g $@ 1026 + 1027 + $(SKEL_OUT)/%.skel.h: $(SKEL_TMP_OUT)/%.bpf.o | $(BPFTOOL) 1028 + $(QUIET_GENSKEL)$(BPFTOOL) gen skeleton $< > $@ 1029 + 1030 + bpf-skel: $(SKELETONS) 1031 + 1032 + .PRECIOUS: $(SKEL_TMP_OUT)/%.bpf.o 1033 + 1034 + else # BUILD_BPF_SKEL 1035 + 1036 + bpf-skel: 1037 + 1038 + endif # BUILD_BPF_SKEL 1039 + 1040 + bpf-skel-clean: 1041 + $(call QUIET_CLEAN, bpf-skel) $(RM) -r $(SKEL_TMP_OUT) $(SKELETONS) 1042 + 1043 + clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBPERF)-clean config-clean fixdep-clean python-clean bpf-skel-clean 1017 1044 $(call QUIET_CLEAN, core-objs) $(RM) $(LIBPERF_A) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS) 1018 1045 $(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete 1019 1046 $(Q)$(RM) $(OUTPUT).config-detected
+3
tools/perf/util/bpf_skel/.gitignore
··· 1 + # SPDX-License-Identifier: GPL-2.0-only 2 + .tmp 3 + *.skel.h
+1
tools/scripts/Makefile.include
··· 127 127 $(MAKE) $(PRINT_DIR) -C $$subdir 128 128 QUIET_FLEX = @echo ' FLEX '$@; 129 129 QUIET_BISON = @echo ' BISON '$@; 130 + QUIET_GENSKEL = @echo ' GEN-SKEL '$@; 130 131 131 132 descend = \ 132 133 +@echo ' DESCEND '$(1); \