mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-24 11:34:50 +08:00
tools/bpftool: Generalize BPF skeleton support and generate vmlinux.h
Adapt Makefile to support BPF skeleton generation beyond single profiler.bpf.c case. Also add vmlinux.h generation and switch profiler.bpf.c to use it. clang-bpf-global-var feature is extended and renamed to clang-bpf-co-re to check for support of preserve_access_index attribute, which, together with BTF for global variables, is the minimum requirement for modern BPF programs. Signed-off-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Reviewed-by: Quentin Monnet <quentin@isovalent.com> Link: https://lore.kernel.org/bpf/20200619231703.738941-7-andriin@fb.com
This commit is contained in:
parent
16e9b187ab
commit
05aca6da3b
3
tools/bpf/bpftool/.gitignore
vendored
3
tools/bpf/bpftool/.gitignore
vendored
@ -7,4 +7,5 @@ bpf-helpers.*
|
|||||||
FEATURE-DUMP.bpftool
|
FEATURE-DUMP.bpftool
|
||||||
feature
|
feature
|
||||||
libbpf
|
libbpf
|
||||||
profiler.skel.h
|
/*.skel.h
|
||||||
|
/vmlinux.h
|
||||||
|
@ -42,6 +42,7 @@ CFLAGS += -O2
|
|||||||
CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers
|
CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers
|
||||||
CFLAGS += $(filter-out -Wswitch-enum,$(EXTRA_WARNINGS))
|
CFLAGS += $(filter-out -Wswitch-enum,$(EXTRA_WARNINGS))
|
||||||
CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \
|
CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \
|
||||||
|
-I$(if $(OUTPUT),$(OUTPUT),.) \
|
||||||
-I$(srctree)/kernel/bpf/ \
|
-I$(srctree)/kernel/bpf/ \
|
||||||
-I$(srctree)/tools/include \
|
-I$(srctree)/tools/include \
|
||||||
-I$(srctree)/tools/include/uapi \
|
-I$(srctree)/tools/include/uapi \
|
||||||
@ -61,9 +62,9 @@ CLANG ?= clang
|
|||||||
|
|
||||||
FEATURE_USER = .bpftool
|
FEATURE_USER = .bpftool
|
||||||
FEATURE_TESTS = libbfd disassembler-four-args reallocarray zlib libcap \
|
FEATURE_TESTS = libbfd disassembler-four-args reallocarray zlib libcap \
|
||||||
clang-bpf-global-var
|
clang-bpf-co-re
|
||||||
FEATURE_DISPLAY = libbfd disassembler-four-args zlib libcap \
|
FEATURE_DISPLAY = libbfd disassembler-four-args zlib libcap \
|
||||||
clang-bpf-global-var
|
clang-bpf-co-re
|
||||||
|
|
||||||
check_feat := 1
|
check_feat := 1
|
||||||
NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall
|
NON_CHECK_FEAT_TARGETS := clean uninstall doc doc-clean doc-install doc-uninstall
|
||||||
@ -121,20 +122,38 @@ BPFTOOL_BOOTSTRAP := $(if $(OUTPUT),$(OUTPUT)bpftool-bootstrap,./bpftool-bootstr
|
|||||||
BOOTSTRAP_OBJS = $(addprefix $(OUTPUT),main.o common.o json_writer.o gen.o btf.o)
|
BOOTSTRAP_OBJS = $(addprefix $(OUTPUT),main.o common.o json_writer.o gen.o btf.o)
|
||||||
OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
|
OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
|
||||||
|
|
||||||
ifneq ($(feature-clang-bpf-global-var),1)
|
VMLINUX_BTF_PATHS := $(if $(O),$(O)/vmlinux) \
|
||||||
CFLAGS += -DBPFTOOL_WITHOUT_SKELETONS
|
$(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
|
||||||
endif
|
../../../vmlinux \
|
||||||
|
/sys/kernel/btf/vmlinux \
|
||||||
|
/boot/vmlinux-$(shell uname -r)
|
||||||
|
VMLINUX_BTF := $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS))))
|
||||||
|
|
||||||
skeleton/profiler.bpf.o: skeleton/profiler.bpf.c $(LIBBPF)
|
ifneq ($(VMLINUX_BTF),)
|
||||||
|
ifeq ($(feature-clang-bpf-co-re),1)
|
||||||
|
|
||||||
|
BUILD_BPF_SKELS := 1
|
||||||
|
|
||||||
|
$(OUTPUT)vmlinux.h: $(VMLINUX_BTF) $(BPFTOOL_BOOTSTRAP)
|
||||||
|
$(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) btf dump file $< format c > $@
|
||||||
|
|
||||||
|
$(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF)
|
||||||
$(QUIET_CLANG)$(CLANG) \
|
$(QUIET_CLANG)$(CLANG) \
|
||||||
|
-I$(if $(OUTPUT),$(OUTPUT),.) \
|
||||||
-I$(srctree)/tools/include/uapi/ \
|
-I$(srctree)/tools/include/uapi/ \
|
||||||
-I$(LIBBPF_PATH) -I$(srctree)/tools/lib \
|
-I$(LIBBPF_PATH) \
|
||||||
|
-I$(srctree)/tools/lib \
|
||||||
-g -O2 -target bpf -c $< -o $@
|
-g -O2 -target bpf -c $< -o $@
|
||||||
|
|
||||||
profiler.skel.h: $(BPFTOOL_BOOTSTRAP) skeleton/profiler.bpf.o
|
$(OUTPUT)%.skel.h: $(OUTPUT)%.bpf.o $(BPFTOOL_BOOTSTRAP)
|
||||||
$(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton skeleton/profiler.bpf.o > $@
|
$(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton $< > $@
|
||||||
|
|
||||||
$(OUTPUT)prog.o: prog.c profiler.skel.h
|
$(OUTPUT)prog.o: $(OUTPUT)profiler.skel.h
|
||||||
|
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
CFLAGS += $(if BUILD_BPF_SKELS,,-DBPFTOOL_WITHOUT_SKELETONS)
|
||||||
|
|
||||||
$(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
|
$(OUTPUT)disasm.o: $(srctree)/kernel/bpf/disasm.c
|
||||||
$(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $<
|
$(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $<
|
||||||
@ -153,7 +172,7 @@ $(OUTPUT)%.o: %.c
|
|||||||
clean: $(LIBBPF)-clean
|
clean: $(LIBBPF)-clean
|
||||||
$(call QUIET_CLEAN, bpftool)
|
$(call QUIET_CLEAN, bpftool)
|
||||||
$(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d
|
$(Q)$(RM) -- $(OUTPUT)bpftool $(OUTPUT)*.o $(OUTPUT)*.d
|
||||||
$(Q)$(RM) -- $(BPFTOOL_BOOTSTRAP) profiler.skel.h skeleton/profiler.bpf.o
|
$(Q)$(RM) -- $(BPFTOOL_BOOTSTRAP) $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h
|
||||||
$(Q)$(RM) -r -- $(OUTPUT)libbpf/
|
$(Q)$(RM) -r -- $(OUTPUT)libbpf/
|
||||||
$(call QUIET_CLEAN, core-gen)
|
$(call QUIET_CLEAN, core-gen)
|
||||||
$(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool
|
$(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool
|
||||||
@ -188,6 +207,7 @@ FORCE:
|
|||||||
zdep:
|
zdep:
|
||||||
@if [ "$(feature-zlib)" != "1" ]; then echo "No zlib found"; exit 1 ; fi
|
@if [ "$(feature-zlib)" != "1" ]; then echo "No zlib found"; exit 1 ; fi
|
||||||
|
|
||||||
|
.SECONDARY:
|
||||||
.PHONY: all FORCE clean install uninstall zdep
|
.PHONY: all FORCE clean install uninstall zdep
|
||||||
.PHONY: doc doc-clean doc-install doc-uninstall
|
.PHONY: doc doc-clean doc-install doc-uninstall
|
||||||
.DEFAULT_GOAL := all
|
.DEFAULT_GOAL := all
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
// Copyright (c) 2020 Facebook
|
// Copyright (c) 2020 Facebook
|
||||||
#include "profiler.h"
|
#include <vmlinux.h>
|
||||||
#include <linux/bpf.h>
|
|
||||||
#include <bpf/bpf_helpers.h>
|
#include <bpf/bpf_helpers.h>
|
||||||
#include <bpf/bpf_tracing.h>
|
#include <bpf/bpf_tracing.h>
|
||||||
|
|
||||||
|
@ -1,46 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
|
|
||||||
#ifndef __PROFILER_H
|
|
||||||
#define __PROFILER_H
|
|
||||||
|
|
||||||
/* useful typedefs from vmlinux.h */
|
|
||||||
|
|
||||||
typedef signed char __s8;
|
|
||||||
typedef unsigned char __u8;
|
|
||||||
typedef short int __s16;
|
|
||||||
typedef short unsigned int __u16;
|
|
||||||
typedef int __s32;
|
|
||||||
typedef unsigned int __u32;
|
|
||||||
typedef long long int __s64;
|
|
||||||
typedef long long unsigned int __u64;
|
|
||||||
|
|
||||||
typedef __s8 s8;
|
|
||||||
typedef __u8 u8;
|
|
||||||
typedef __s16 s16;
|
|
||||||
typedef __u16 u16;
|
|
||||||
typedef __s32 s32;
|
|
||||||
typedef __u32 u32;
|
|
||||||
typedef __s64 s64;
|
|
||||||
typedef __u64 u64;
|
|
||||||
|
|
||||||
enum {
|
|
||||||
false = 0,
|
|
||||||
true = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __CHECKER__
|
|
||||||
#define __bitwise__ __attribute__((bitwise))
|
|
||||||
#else
|
|
||||||
#define __bitwise__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef __u16 __bitwise__ __le16;
|
|
||||||
typedef __u16 __bitwise__ __be16;
|
|
||||||
typedef __u32 __bitwise__ __le32;
|
|
||||||
typedef __u32 __bitwise__ __be32;
|
|
||||||
typedef __u64 __bitwise__ __le64;
|
|
||||||
typedef __u64 __bitwise__ __be64;
|
|
||||||
|
|
||||||
typedef __u16 __bitwise__ __sum16;
|
|
||||||
typedef __u32 __bitwise__ __wsum;
|
|
||||||
|
|
||||||
#endif /* __PROFILER_H */
|
|
@ -68,7 +68,7 @@ FILES= \
|
|||||||
test-llvm-version.bin \
|
test-llvm-version.bin \
|
||||||
test-libaio.bin \
|
test-libaio.bin \
|
||||||
test-libzstd.bin \
|
test-libzstd.bin \
|
||||||
test-clang-bpf-global-var.bin \
|
test-clang-bpf-co-re.bin \
|
||||||
test-file-handle.bin \
|
test-file-handle.bin \
|
||||||
test-libpfm4.bin
|
test-libpfm4.bin
|
||||||
|
|
||||||
@ -325,7 +325,7 @@ $(OUTPUT)test-libaio.bin:
|
|||||||
$(OUTPUT)test-libzstd.bin:
|
$(OUTPUT)test-libzstd.bin:
|
||||||
$(BUILD) -lzstd
|
$(BUILD) -lzstd
|
||||||
|
|
||||||
$(OUTPUT)test-clang-bpf-global-var.bin:
|
$(OUTPUT)test-clang-bpf-co-re.bin:
|
||||||
$(CLANG) -S -g -target bpf -o - $(patsubst %.bin,%.c,$(@F)) | \
|
$(CLANG) -S -g -target bpf -o - $(patsubst %.bin,%.c,$(@F)) | \
|
||||||
grep BTF_KIND_VAR
|
grep BTF_KIND_VAR
|
||||||
|
|
||||||
|
9
tools/build/feature/test-clang-bpf-co-re.c
Normal file
9
tools/build/feature/test-clang-bpf-co-re.c
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
// Copyright (c) 2020 Facebook
|
||||||
|
|
||||||
|
struct test {
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
} __attribute__((preserve_access_index));
|
||||||
|
|
||||||
|
volatile struct test global_value_for_test = {};
|
@ -1,4 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
|
||||||
// Copyright (c) 2020 Facebook
|
|
||||||
|
|
||||||
volatile int global_value_for_test = 1;
|
|
Loading…
Reference in New Issue
Block a user