Commit fbcdaa19 authored by Song Liu's avatar Song Liu Committed by Arnaldo Carvalho de Melo
Browse files

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: default avatarSong Liu <songliubraving@fb.com>
Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
Acked-by: default avatarNamhyung 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent d2032d45
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -99,7 +99,9 @@ FEATURE_TESTS_EXTRA := \
         clang                          \
         libbpf                         \
         libpfm4                        \
         libdebuginfod
         libdebuginfod			\
         clang-bpf-co-re


FEATURE_TESTS ?= $(FEATURE_TESTS_BASIC)

+9 −0
Original line number Diff line number Diff line
@@ -621,6 +621,15 @@ ifndef NO_LIBBPF
  endif
endif

ifdef BUILD_BPF_SKEL
  $(call feature_check,clang-bpf-co-re)
  ifeq ($(feature-clang-bpf-co-re), 0)
    dummy := $(error Error: clang too old. Please install recent clang)
  endif
  $(call detected,CONFIG_PERF_BPF_SKEL)
  CFLAGS += -DHAVE_BPF_SKEL
endif

dwarf-post-unwind := 1
dwarf-post-unwind-text := BUG

+47 −2
Original line number Diff line number Diff line
@@ -126,6 +126,8 @@ include ../scripts/utilities.mak
#
# Define NO_LIBDEBUGINFOD if you do not want support debuginfod
#
# Define BUILD_BPF_SKEL to enable BPF skeletons
#

# As per kernel Makefile, avoid funny character set dependencies
unexport LC_ALL
@@ -175,6 +177,12 @@ endef

LD += $(EXTRA_LDFLAGS)

HOSTCC  ?= gcc
HOSTLD  ?= ld
HOSTAR  ?= ar
CLANG   ?= clang
LLVM_STRIP ?= llvm-strip

PKG_CONFIG = $(CROSS_COMPILE)pkg-config
LLVM_CONFIG ?= llvm-config

@@ -731,7 +739,8 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
	$(x86_arch_prctl_code_array) \
	$(rename_flags_array) \
	$(arch_errno_name_array) \
	$(sync_file_range_arrays)
	$(sync_file_range_arrays) \
	bpf-skel

$(OUTPUT)%.o: %.c prepare FORCE
	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
@@ -1004,7 +1013,43 @@ config-clean:
python-clean:
	$(python-clean)

clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBPERF)-clean config-clean fixdep-clean python-clean
SKEL_OUT := $(abspath $(OUTPUT)util/bpf_skel)
SKEL_TMP_OUT := $(abspath $(SKEL_OUT)/.tmp)
SKELETONS :=

ifdef BUILD_BPF_SKEL
BPFTOOL := $(SKEL_TMP_OUT)/bootstrap/bpftool
LIBBPF_SRC := $(abspath ../lib/bpf)
BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(BPF_PATH) -I$(LIBBPF_SRC)/..

$(SKEL_TMP_OUT):
	$(Q)$(MKDIR) -p $@

$(BPFTOOL): | $(SKEL_TMP_OUT)
	CFLAGS= $(MAKE) -C ../bpf/bpftool \
		OUTPUT=$(SKEL_TMP_OUT)/ bootstrap

$(SKEL_TMP_OUT)/%.bpf.o: util/bpf_skel/%.bpf.c $(LIBBPF) | $(SKEL_TMP_OUT)
	$(QUIET_CLANG)$(CLANG) -g -O2 -target bpf $(BPF_INCLUDE) \
	  -c $(filter util/bpf_skel/%.bpf.c,$^) -o $@ && $(LLVM_STRIP) -g $@

$(SKEL_OUT)/%.skel.h: $(SKEL_TMP_OUT)/%.bpf.o | $(BPFTOOL)
	$(QUIET_GENSKEL)$(BPFTOOL) gen skeleton $< > $@

bpf-skel: $(SKELETONS)

.PRECIOUS: $(SKEL_TMP_OUT)/%.bpf.o

else # BUILD_BPF_SKEL

bpf-skel:

endif # BUILD_BPF_SKEL

bpf-skel-clean:
	$(call QUIET_CLEAN, bpf-skel) $(RM) -r $(SKEL_TMP_OUT) $(SKELETONS)

clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBPERF)-clean config-clean fixdep-clean python-clean bpf-skel-clean
	$(call QUIET_CLEAN, core-objs)  $(RM) $(LIBPERF_A) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
	$(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
	$(Q)$(RM) $(OUTPUT).config-detected
+3 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
.tmp
*.skel.h
 No newline at end of file
+1 −0
Original line number Diff line number Diff line
@@ -127,6 +127,7 @@ ifneq ($(silent),1)
			 $(MAKE) $(PRINT_DIR) -C $$subdir
	QUIET_FLEX     = @echo '  FLEX     '$@;
	QUIET_BISON    = @echo '  BISON    '$@;
	QUIET_GENSKEL  = @echo '  GEN-SKEL '$@;

	descend = \
		+@echo	       '  DESCEND  '$(1); \