mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
perf build: Encapsulate vmlinux.h and bpftool in bpf_skel.mak
Currently, bpftool and vmlinux.h are prerequisites of the top-level prepare target in Makefile.perf. This unnecessarily blocks the massive parallel C compilation of libraries (perf-util, perf-ui, pmu-events) during the initial startup phase. Move all bpftool and vmlinux.h generation rules down into tools/perf/bpf_skel.mak to encapsulate BPF tooling completely within the skeleton framework. Remove them entirely from prepare to unblock immediate parallel build execution. To prevent parallel sub-makes (perf-util and perf-bench) from racing to build shared prerequisites concurrently, while maintaining strict directory encapsulation without top-level inclusions, serialize bench after the util static archive finishes using an order-only prerequisite: $(LIBPERF_BENCH_IN): FORCE prepare | $(LIBPERF_UTIL) Reviewed-by: Namhyung Kim <namhyung@kernel.org> Assisted-by: Gemini:gemini-3.1-pro-preview Signed-off-by: Ian Rogers <irogers@google.com> Tested-by: James Clark <james.clark@linaro.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Albert Ou <aou@eecs.berkeley.edu> Cc: Alexandre Chartre <alexandre.chartre@oracle.com> Cc: Alexandre Ghiti <alex@ghiti.fr> Cc: Andrii Nakryiko <andrii@kernel.org> Cc: Ankur Arora <ankur.a.arora@oracle.com> Cc: Collin Funk <collin.funk1@gmail.com> Cc: Costa Shulyupin <costa.shul@redhat.com> Cc: Daniel Borkmann <daniel@iogearbox.net> Cc: Dapeng Mi <dapeng1.mi@linux.intel.com> Cc: David Sterba <dsterba@suse.com> Cc: Dmitrii Dolgov <9erthalion6@gmail.com> Cc: Eduard Zingerman <eddyz87@gmail.com> Cc: Howard Chu <howardchu95@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kumar Kartikeya Dwivedi <memxor@gmail.com> Cc: Leo Yan <leo.yan@arm.com> Cc: Markus Mayer <mmayer@broadcom.com> Cc: Martin KaFai Lau <martin.lau@linux.dev> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nick Terrell <terrelln@fb.com> Cc: Palmer Dabbelt <palmer@dabbelt.com> Cc: Paul Walmsley <pjw@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Quentin Monnet <qmo@kernel.org> Cc: Ricky Ringler <ricky.ringler@proton.me> Cc: Song Liu <song@kernel.org> Cc: Swapnil Sapkal <swapnil.sapkal@amd.com> Cc: Thomas Falcon <thomas.falcon@intel.com> Cc: Tomas Glozar <tglozar@redhat.com> Cc: Yonghong Song <yonghong.song@linux.dev> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
713eeb2279
commit
9798ac0128
|
|
@ -681,7 +681,7 @@ ifeq ($(BUILD_BPF_SKEL),1)
|
|||
endif
|
||||
|
||||
ifndef GEN_VMLINUX_H
|
||||
VMLINUX_H=$(src-perf)/util/bpf_skel/vmlinux/vmlinux.h
|
||||
VMLINUX_H_FILE=$(src-perf)/util/bpf_skel/vmlinux/vmlinux.h
|
||||
endif
|
||||
|
||||
ifndef NO_LIBUNWIND
|
||||
|
|
|
|||
|
|
@ -274,7 +274,7 @@ ifeq ($(PYLINT),1)
|
|||
PYLINT := $(shell which pylint 2> /dev/null)
|
||||
endif
|
||||
|
||||
export srctree OUTPUT RM CC CXX RUSTC CLANG LD AR CFLAGS CXXFLAGS RUST_FLAGS V BISON FLEX AWK LIBBPF
|
||||
export srctree OUTPUT RM CC CXX RUSTC CLANG LD AR CFLAGS CXXFLAGS RUST_FLAGS V BISON FLEX AWK LIBBPF READELF
|
||||
export HOSTCC HOSTLD HOSTAR HOSTCFLAGS SHELLCHECK MYPY PYLINT
|
||||
|
||||
include $(srctree)/tools/build/Makefile.include
|
||||
|
|
@ -324,7 +324,7 @@ else
|
|||
FEATURE_DUMP_EXPORT := $(realpath $(FEATURES_DUMP))
|
||||
endif
|
||||
|
||||
export prefix bindir sharedir sysconfdir DESTDIR
|
||||
export prefix bindir sharedir sysconfdir DESTDIR VMLINUX_H_FILE
|
||||
|
||||
# sparse is architecture-neutral, which means that we need to tell it
|
||||
# explicitly what architecture to check for. Fix this up for yours..
|
||||
|
|
@ -556,7 +556,9 @@ $(LIBPMU_EVENTS_IN): FORCE $(LIBPERF)
|
|||
$(LIBPMU_EVENTS): $(LIBPMU_EVENTS_IN)
|
||||
$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $<
|
||||
|
||||
$(LIBPERF_BENCH_IN): FORCE prepare
|
||||
# The $(LIBPERF_UTIL) dependency is to ensure bpftool and vmlinux.h
|
||||
# aren't racily built for bench/bpf_skel/bench_uprobe.bpf.c
|
||||
$(LIBPERF_BENCH_IN): FORCE prepare | $(LIBPERF_UTIL)
|
||||
$(Q)$(MAKE) $(build)=perf-bench
|
||||
|
||||
$(LIBPERF_BENCH): $(LIBPERF_BENCH_IN)
|
||||
|
|
@ -911,60 +913,11 @@ $(INSTALL_DOC_TARGETS):
|
|||
python-clean:
|
||||
$(python-clean)
|
||||
|
||||
SKEL_OUT := $(abspath $(OUTPUT)util/bpf_skel)
|
||||
SKEL_TMP_OUT := $(abspath $(SKEL_OUT)/.tmp)
|
||||
|
||||
$(SKEL_TMP_OUT) $(LIBAPI_OUTPUT) $(LIBBPF_OUTPUT) $(LIBPERF_OUTPUT) $(LIBSUBCMD_OUTPUT) $(LIBSYMBOL_OUTPUT):
|
||||
$(LIBAPI_OUTPUT) $(LIBBPF_OUTPUT) $(LIBPERF_OUTPUT) $(LIBSUBCMD_OUTPUT) $(LIBSYMBOL_OUTPUT):
|
||||
$(Q)$(MKDIR) -p $@
|
||||
|
||||
ifeq ($(CONFIG_PERF_BPF_SKEL),y)
|
||||
prepare: $(BPFTOOL) $(SKEL_OUT)/vmlinux.h
|
||||
BPFTOOL := $(SKEL_TMP_OUT)/bootstrap/bpftool
|
||||
|
||||
$(BPFTOOL): | $(SKEL_TMP_OUT)
|
||||
$(Q)CFLAGS= $(MAKE) -C ../bpf/bpftool \
|
||||
OUTPUT=$(SKEL_TMP_OUT)/ bootstrap
|
||||
|
||||
# Paths to search for a kernel to generate vmlinux.h from.
|
||||
VMLINUX_BTF_ELF_PATHS ?= $(if $(O),$(O)/vmlinux) \
|
||||
$(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
|
||||
../../vmlinux \
|
||||
/boot/vmlinux-$(shell uname -r)
|
||||
|
||||
# Paths to BTF information.
|
||||
VMLINUX_BTF_BTF_PATHS ?= /sys/kernel/btf/vmlinux
|
||||
|
||||
# Filter out kernels that don't exist or without a BTF section.
|
||||
VMLINUX_BTF_ELF_ABSPATHS ?= $(abspath $(wildcard $(VMLINUX_BTF_ELF_PATHS)))
|
||||
VMLINUX_BTF_PATHS ?= $(shell for file in $(VMLINUX_BTF_ELF_ABSPATHS); \
|
||||
do \
|
||||
if [ -f $$file ] && ($(READELF) -S "$$file" | grep -q .BTF); \
|
||||
then \
|
||||
echo "$$file"; \
|
||||
fi; \
|
||||
done) \
|
||||
$(wildcard $(VMLINUX_BTF_BTF_PATHS))
|
||||
|
||||
# Select the first as the source of vmlinux.h.
|
||||
VMLINUX_BTF ?= $(firstword $(VMLINUX_BTF_PATHS))
|
||||
|
||||
ifeq ($(VMLINUX_H),)
|
||||
ifeq ($(VMLINUX_BTF),)
|
||||
$(error Missing bpftool input for generating vmlinux.h)
|
||||
endif
|
||||
endif
|
||||
|
||||
$(SKEL_OUT)/vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL) $(VMLINUX_H)
|
||||
ifeq ($(VMLINUX_H),)
|
||||
$(QUIET_GEN)$(BPFTOOL) btf dump file $< format c > $@
|
||||
else
|
||||
$(Q)cp "$(VMLINUX_H)" $@
|
||||
endif
|
||||
|
||||
endif # CONFIG_PERF_BPF_SKEL
|
||||
|
||||
bpf-skel-clean:
|
||||
$(call QUIET_CLEAN, bpf-skel) $(RM) -r $(SKEL_TMP_OUT) $(SKEL_OUT)/*.skel.h $(SKEL_OUT)/vmlinux.h $(OUTPUT)bench/bpf_skel/*.skel.h $(OUTPUT)bench/bpf_skel/.tmp
|
||||
$(Q)$(MAKE) -f bpf_skel.mak clean
|
||||
|
||||
pmu-events-clean:
|
||||
ifeq ($(OUTPUT),)
|
||||
|
|
|
|||
|
|
@ -35,6 +35,47 @@ ifneq ($(WERROR),0)
|
|||
CLANG_OPTIONS += -Werror
|
||||
endif
|
||||
|
||||
$(BPFTOOL):
|
||||
$(Q)mkdir -p $(SKEL_TOOL_TMP_OUT)
|
||||
$(Q)CFLAGS= $(MAKE) -C ../bpf/bpftool OUTPUT=$(SKEL_TOOL_TMP_OUT)/ bootstrap
|
||||
|
||||
# Paths to search for a kernel to generate vmlinux.h from.
|
||||
VMLINUX_BTF_ELF_PATHS ?= $(if $(O),$(O)/vmlinux) \
|
||||
$(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
|
||||
../../vmlinux \
|
||||
/boot/vmlinux-$(shell uname -r)
|
||||
|
||||
# Paths to BTF information.
|
||||
VMLINUX_BTF_BTF_PATHS ?= /sys/kernel/btf/vmlinux
|
||||
|
||||
# Filter out kernels that don't exist or without a BTF section.
|
||||
VMLINUX_BTF_ELF_ABSPATHS ?= $(abspath $(wildcard $(VMLINUX_BTF_ELF_PATHS)))
|
||||
VMLINUX_BTF_PATHS ?= $(shell for file in $(VMLINUX_BTF_ELF_ABSPATHS); \
|
||||
do \
|
||||
if [ -f $$file ] && ($(READELF) -S "$$file" | grep -q .BTF); \
|
||||
then \
|
||||
echo "$$file"; \
|
||||
fi; \
|
||||
done) \
|
||||
$(wildcard $(VMLINUX_BTF_BTF_PATHS))
|
||||
|
||||
# Select the first as the source of vmlinux.h.
|
||||
VMLINUX_BTF ?= $(firstword $(VMLINUX_BTF_PATHS))
|
||||
|
||||
ifeq ($(VMLINUX_H_FILE),)
|
||||
ifeq ($(VMLINUX_BTF),)
|
||||
$(error Missing bpftool input for generating vmlinux.h)
|
||||
endif
|
||||
endif
|
||||
|
||||
$(VMLINUX_H): $(VMLINUX_BTF) $(BPFTOOL) $(VMLINUX_H_FILE)
|
||||
$(call rule_mkdir)
|
||||
ifeq ($(VMLINUX_H_FILE),)
|
||||
$(QUIET_GEN)$(BPFTOOL) btf dump file $< format c > $@
|
||||
else
|
||||
$(Q)cp "$(VMLINUX_H_FILE)" $@
|
||||
endif
|
||||
|
||||
# Consolidated Pattern rule for $(dir)/bpf_skel/
|
||||
$(SKEL_TMP_OUT)/%.bpf.o: $(srctree)/tools/perf/$(dir)/bpf_skel/%.bpf.c $(LIBBPF) $(VMLINUX_H) $(OUTPUT)PERF-VERSION-FILE util/bpf_skel/perf_version.h
|
||||
$(call rule_mkdir)
|
||||
|
|
@ -51,4 +92,10 @@ $(SKEL_OUT)/%.skel.h: $(SKEL_TMP_OUT)/%.bpf.o $(BPFTOOL)
|
|||
$(Q)$(BPFTOOL) gen skeleton $< > $@
|
||||
|
||||
.PRECIOUS: $(SKEL_TMP_OUT)/%.bpf.o
|
||||
|
||||
endif # CONFIG_PERF_BPF_SKEL
|
||||
|
||||
clean:
|
||||
$(call QUIET_CLEAN, bpf-skel) $(RM) -r $(SKEL_TOOL_TMP_OUT) $(OUTPUT)bench/bpf_skel/.tmp $(SKEL_TOOL_OUT)/*.skel.h $(OUTPUT)bench/bpf_skel/*.skel.h $(SKEL_TOOL_OUT)/vmlinux.h
|
||||
|
||||
.PHONY: clean
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user