mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-20 01:24:39 +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
|
||||
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 += $(filter-out -Wswitch-enum,$(EXTRA_WARNINGS))
|
||||
CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \
|
||||
-I$(if $(OUTPUT),$(OUTPUT),.) \
|
||||
-I$(srctree)/kernel/bpf/ \
|
||||
-I$(srctree)/tools/include \
|
||||
-I$(srctree)/tools/include/uapi \
|
||||
@ -61,9 +62,9 @@ CLANG ?= clang
|
||||
|
||||
FEATURE_USER = .bpftool
|
||||
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 \
|
||||
clang-bpf-global-var
|
||||
clang-bpf-co-re
|
||||
|
||||
check_feat := 1
|
||||
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)
|
||||
OBJS = $(patsubst %.c,$(OUTPUT)%.o,$(SRCS)) $(OUTPUT)disasm.o
|
||||
|
||||
ifneq ($(feature-clang-bpf-global-var),1)
|
||||
CFLAGS += -DBPFTOOL_WITHOUT_SKELETONS
|
||||
endif
|
||||
VMLINUX_BTF_PATHS := $(if $(O),$(O)/vmlinux) \
|
||||
$(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \
|
||||
../../../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) \
|
||||
-I$(if $(OUTPUT),$(OUTPUT),.) \
|
||||
-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 $@
|
||||
|
||||
profiler.skel.h: $(BPFTOOL_BOOTSTRAP) skeleton/profiler.bpf.o
|
||||
$(QUIET_GEN)$(BPFTOOL_BOOTSTRAP) gen skeleton skeleton/profiler.bpf.o > $@
|
||||
$(OUTPUT)%.skel.h: $(OUTPUT)%.bpf.o $(BPFTOOL_BOOTSTRAP)
|
||||
$(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
|
||||
$(QUIET_CC)$(CC) $(CFLAGS) -c -MMD -o $@ $<
|
||||
@ -153,7 +172,7 @@ $(OUTPUT)%.o: %.c
|
||||
clean: $(LIBBPF)-clean
|
||||
$(call QUIET_CLEAN, bpftool)
|
||||
$(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/
|
||||
$(call QUIET_CLEAN, core-gen)
|
||||
$(Q)$(RM) -- $(OUTPUT)FEATURE-DUMP.bpftool
|
||||
@ -188,6 +207,7 @@ FORCE:
|
||||
zdep:
|
||||
@if [ "$(feature-zlib)" != "1" ]; then echo "No zlib found"; exit 1 ; fi
|
||||
|
||||
.SECONDARY:
|
||||
.PHONY: all FORCE clean install uninstall zdep
|
||||
.PHONY: doc doc-clean doc-install doc-uninstall
|
||||
.DEFAULT_GOAL := all
|
||||
|
@ -1,7 +1,6 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
// Copyright (c) 2020 Facebook
|
||||
#include "profiler.h"
|
||||
#include <linux/bpf.h>
|
||||
#include <vmlinux.h>
|
||||
#include <bpf/bpf_helpers.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-libaio.bin \
|
||||
test-libzstd.bin \
|
||||
test-clang-bpf-global-var.bin \
|
||||
test-clang-bpf-co-re.bin \
|
||||
test-file-handle.bin \
|
||||
test-libpfm4.bin
|
||||
|
||||
@ -325,7 +325,7 @@ $(OUTPUT)test-libaio.bin:
|
||||
$(OUTPUT)test-libzstd.bin:
|
||||
$(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)) | \
|
||||
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