Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package bpftool for openSUSE:Factory checked in at 2023-05-16 14:15:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/bpftool (Old) and /work/SRC/openSUSE:Factory/.bpftool.new.1533 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "bpftool" Tue May 16 14:15:53 2023 rev:9 rq:1087204 version:7.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/bpftool/bpftool.changes 2023-03-02 23:01:53.502726651 +0100 +++ /work/SRC/openSUSE:Factory/.bpftool.new.1533/bpftool.changes 2023-05-16 14:21:56.573860557 +0200 @@ -1,0 +2,12 @@ +Wed Mar 29 17:35:09 UTC 2023 - Michal Suchanek <[email protected]> + +- Update to out-of-tree version 7.2.0 +- Use release tarball that includes the specific copy of libbpf that is needed + to build bpftool +- Fix build on Linux 5.14 + + 0001-bpftool-use-a-local-copy-of-perf_event-to-fix-access.patch + + 0002-bpftool-define-a-local-bpf_perf_link-to-fix-accessin.patch + + 0003-bpftool-use-a-local-bpf_perf_event_value-to-fix-acce.patch + + 0004-bpftool-Use-a-local-copy-of-BPF_LINK_TYPE_PERF_EVENT.patch + +------------------------------------------------------------------- New: ---- 0001-bpftool-use-a-local-copy-of-perf_event-to-fix-access.patch 0002-bpftool-define-a-local-bpf_perf_link-to-fix-accessin.patch 0003-bpftool-use-a-local-bpf_perf_event_value-to-fix-acce.patch 0004-bpftool-Use-a-local-copy-of-BPF_LINK_TYPE_PERF_EVENT.patch bpftool-libbpf-v7.2.0-sources.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ bpftool.spec ++++++ --- /var/tmp/diff_new_pack.vUE7oV/_old 2023-05-16 14:21:57.141863805 +0200 +++ /var/tmp/diff_new_pack.vUE7oV/_new 2023-05-16 14:21:57.145863829 +0200 @@ -16,18 +16,31 @@ # -%define version %(rpm -q --qf '%%{VERSION}' kernel-source) Name: bpftool -Version: %{version} +Version: 7.2.0 Release: 0 -Patch0: binutils-2.40.patch Summary: Tool for inspection and manipulation of BPF programs and maps License: GPL-2.0-only Group: Development/Tools/Other URL: https://www.kernel.org/ +Source0: https://github.com/libbpf/bpftool/releases/download/v%{version}/bpftool-libbpf-v%{version}-sources.tar.gz +Patch0: binutils-2.40.patch +Patch1: 0001-bpftool-use-a-local-copy-of-perf_event-to-fix-access.patch +Patch2: 0002-bpftool-define-a-local-bpf_perf_link-to-fix-accessin.patch +Patch3: 0003-bpftool-use-a-local-bpf_perf_event_value-to-fix-acce.patch +Patch4: 0004-bpftool-Use-a-local-copy-of-BPF_LINK_TYPE_PERF_EVENT.patch BuildRequires: binutils-devel +%if 0%{?suse_version} && 0%{?suse_version} <= 1500 +%if 0%{?sle_version} < 150400 +BuildRequires: clang12-devel +%else +BuildRequires: clang13-devel +%endif +%else +BuildRequires: clang-devel +%endif BuildRequires: docutils -BuildRequires: kernel-source +BuildRequires: libcap-devel BuildRequires: libelf-devel BuildRequires: libzstd-devel @@ -45,48 +58,33 @@ %description bash-completion bash command line completion support for bpftool. -%package rebuild -Summary: Empty package to ensure rebuilding bpftool in OBS -Group: System/Monitoring -%requires_eq kernel-source - -%description rebuild -This is empty package that ensures bpftool is rebuilt every time -kernel-default is rebuilt in OBS. - -There is no reason to install this package. - %prep -(cd %{_prefix}/src/linux ; tar -cf - COPYING CREDITS README tools include scripts Kbuild Makefile arch/*/{include,lib,Makefile} kernel/bpf lib) | tar -xf - -cp %{_prefix}/src/linux/LICENSES/preferred/GPL-2.0 . -sed -i -e 's/CFLAGS += -O2/CFLAGS = $(RPM_OPT_FLAGS)/' Makefile -%patch0 -p1 +%autosetup -p1 -n %{name} +sed -i -e 's/CFLAGS += -O2/CFLAGS = $(RPM_OPT_FLAGS)/' src/Makefile %build -cd tools/bpf/bpftool -%make_build \ +%make_build -C src V=1 \ feature-reallocarray=1 \ feature-libbfd-liberty=1 \ %if %(if gcc -lsframe -shared 2>/dev/null ; then echo 1 ; else echo 0; fi; ) feature-libbfd-liberty-sframe=1 \ %endif feature-disassembler-four-args=1 \ - all \ - doc + all +%make_build -C docs V=1 \ + man %install -cd tools/bpf/bpftool -make install doc-install DESTDIR=%{buildroot} prefix=%{_prefix} mandir=%{_mandir} +make -C src V=1 install DESTDIR=%{buildroot} prefix=%{_prefix} mandir=%{_mandir} +make -C docs V=1 install DESTDIR=%{buildroot} prefix=%{_prefix} mandir=%{_mandir} %files -%license GPL-2.0 +%license LICENSE LICENSE.BSD-2-Clause LICENSE.GPL-2.0 +%doc README.md CHECKPOINT-COMMIT BPF-CHECKPOINT-COMMIT %{_sbindir}/bpftool %{_mandir}/man?/*.gz %files bash-completion %{_datadir}/bash-completion/completions/bpftool -%files rebuild -%license GPL-2.0 - %changelog ++++++ 0001-bpftool-use-a-local-copy-of-perf_event-to-fix-access.patch ++++++ >From 6acb32f72618dbaa9d4938fc3007b0ff7ca151c4 Mon Sep 17 00:00:00 2001 From: Alexander Lobakin <[email protected]> Date: Thu, 21 Apr 2022 00:38:45 +0000 Subject: [PATCH] bpftool: use a local copy of perf_event to fix accessing ::bpf_cookie When CONFIG_PERF_EVENTS is not set, struct perf_event remains empty. However, the structure is being used by bpftool indirectly via BTF. This leads to: skeleton/pid_iter.bpf.c:49:30: error: no member named 'bpf_cookie' in 'struct perf_event' return BPF_CORE_READ(event, bpf_cookie); ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~ ... skeleton/pid_iter.bpf.c:49:9: error: returning 'void' from a function with incompatible result type '__u64' (aka 'unsigned long long') return BPF_CORE_READ(event, bpf_cookie); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Tools and samples can't use any CONFIG_ definitions, so the fields used there should always be present. Define struct perf_event___local with the `preserve_access_index` attribute inside the pid_iter BPF prog to allow compiling on any configs. CO-RE will substitute it with the real struct perf_event accesses later on. Fixes: cbdaf71f7e65 ("bpftool: Add bpf_cookie to link output") Suggested-by: Andrii Nakryiko <[email protected]> Signed-off-by: Alexander Lobakin <[email protected]> Signed-off-by: Quentin Monnet <[email protected]> --- tools/bpf/bpftool/skeleton/pid_iter.bpf.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/skeleton/pid_iter.bpf.c b/src/skeleton/pid_iter.bpf.c index eb05ea53afb1..e2af8e5fb29e 100644 --- a/src/skeleton/pid_iter.bpf.c +++ b/src/skeleton/pid_iter.bpf.c @@ -15,6 +15,10 @@ enum bpf_obj_type { BPF_OBJ_BTF, }; +struct perf_event___local { + u64 bpf_cookie; +} __attribute__((preserve_access_index)); + extern const void bpf_link_fops __ksym; extern const void bpf_map_fops __ksym; extern const void bpf_prog_fops __ksym; @@ -41,8 +45,8 @@ static __always_inline __u32 get_obj_id(void *ent, enum bpf_obj_type type) /* could be used only with BPF_LINK_TYPE_PERF_EVENT links */ static __u64 get_bpf_cookie(struct bpf_link *link) { + struct perf_event___local *event; struct bpf_perf_link *perf_link; - struct perf_event *event; perf_link = container_of(link, struct bpf_perf_link, link); event = BPF_CORE_READ(perf_link, perf_file, private_data); -- 2.40.0 ++++++ 0002-bpftool-define-a-local-bpf_perf_link-to-fix-accessin.patch ++++++ >From cf4dcbae4799415fc5a85f9bb9f31bbf036f2994 Mon Sep 17 00:00:00 2001 From: Alexander Lobakin <[email protected]> Date: Thu, 21 Apr 2022 00:38:58 +0000 Subject: [PATCH] bpftool: define a local bpf_perf_link to fix accessing its fields When building bpftool with !CONFIG_PERF_EVENTS: skeleton/pid_iter.bpf.c:47:14: error: incomplete definition of type 'struct bpf_perf_link' perf_link = container_of(link, struct bpf_perf_link, link); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tools/bpf/bpftool/bootstrap/libbpf/include/bpf/bpf_helpers.h:74:22: note: expanded from macro 'container_of' ((type *)(__mptr - offsetof(type, member))); \ ^~~~~~~~~~~~~~~~~~~~~~ tools/bpf/bpftool/bootstrap/libbpf/include/bpf/bpf_helpers.h:68:60: note: expanded from macro 'offsetof' #define offsetof(TYPE, MEMBER) ((unsigned long)&((TYPE *)0)->MEMBER) ~~~~~~~~~~~^ skeleton/pid_iter.bpf.c:44:9: note: forward declaration of 'struct bpf_perf_link' struct bpf_perf_link *perf_link; ^ &bpf_perf_link is being defined and used only under the ifdef. Define struct bpf_perf_link___local with the `preserve_access_index` attribute inside the pid_iter BPF prog to allow compiling on any configs. CO-RE will substitute it with the real struct bpf_perf_link accesses later on. container_of() is not CO-REd, but it is a noop for bpf_perf_link <-> bpf_link and the local copy is a full mirror of the original structure. Fixes: cbdaf71f7e65 ("bpftool: Add bpf_cookie to link output") Suggested-by: Andrii Nakryiko <[email protected]> Signed-off-by: Alexander Lobakin <[email protected]> Signed-off-by: Quentin Monnet <[email protected]> --- tools/bpf/bpftool/skeleton/pid_iter.bpf.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/skeleton/pid_iter.bpf.c b/src/skeleton/pid_iter.bpf.c index e2af8e5fb29e..3a4c4f7d83d8 100644 --- a/src/skeleton/pid_iter.bpf.c +++ b/src/skeleton/pid_iter.bpf.c @@ -15,6 +15,11 @@ enum bpf_obj_type { BPF_OBJ_BTF, }; +struct bpf_perf_link___local { + struct bpf_link link; + struct file *perf_file; +} __attribute__((preserve_access_index)); + struct perf_event___local { u64 bpf_cookie; } __attribute__((preserve_access_index)); @@ -45,10 +50,10 @@ static __always_inline __u32 get_obj_id(void *ent, enum bpf_obj_type type) /* could be used only with BPF_LINK_TYPE_PERF_EVENT links */ static __u64 get_bpf_cookie(struct bpf_link *link) { + struct bpf_perf_link___local *perf_link; struct perf_event___local *event; - struct bpf_perf_link *perf_link; - perf_link = container_of(link, struct bpf_perf_link, link); + perf_link = container_of(link, struct bpf_perf_link___local, link); event = BPF_CORE_READ(perf_link, perf_file, private_data); return BPF_CORE_READ(event, bpf_cookie); } -- 2.40.0 ++++++ 0003-bpftool-use-a-local-bpf_perf_event_value-to-fix-acce.patch ++++++ >From bf5a83d6f1a9851cd1471fba06a58abbab5bc4c4 Mon Sep 17 00:00:00 2001 From: Alexander Lobakin <[email protected]> Date: Thu, 21 Apr 2022 00:39:04 +0000 Subject: [PATCH] bpftool: use a local bpf_perf_event_value to fix accessing its fields Fix the following error when building bpftool: CLANG profiler.bpf.o CLANG pid_iter.bpf.o skeleton/profiler.bpf.c:18:21: error: invalid application of 'sizeof' to an incomplete type 'struct bpf_perf_event_value' __uint(value_size, sizeof(struct bpf_perf_event_value)); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tools/bpf/bpftool/bootstrap/libbpf/include/bpf/bpf_helpers.h:13:39: note: expanded from macro '__uint' tools/bpf/bpftool/bootstrap/libbpf/include/bpf/bpf_helper_defs.h:7:8: note: forward declaration of 'struct bpf_perf_event_value' struct bpf_perf_event_value; ^ struct bpf_perf_event_value is being used in the kernel only when CONFIG_BPF_EVENTS is enabled, so it misses a BTF entry then. Define struct bpf_perf_event_value___local with the `preserve_access_index` attribute inside the pid_iter BPF prog to allow compiling on any configs. It is a full mirror of a UAPI structure, so is compatible both with and w/o CO-RE. bpf_perf_event_read_value() requires a pointer of the original type, so a cast is needed. Fixes: 47c09d6a9f67 ("bpftool: Introduce "prog profile" command") Suggested-by: Andrii Nakryiko <[email protected]> Signed-off-by: Alexander Lobakin <[email protected]> Signed-off-by: Quentin Monnet <[email protected]> --- tools/bpf/bpftool/skeleton/profiler.bpf.c | 27 ++++++++++++++--------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/skeleton/profiler.bpf.c b/src/skeleton/profiler.bpf.c index ce5b65e07ab1..2f80edc682f1 100644 --- a/src/skeleton/profiler.bpf.c +++ b/src/skeleton/profiler.bpf.c @@ -4,6 +4,12 @@ #include <bpf/bpf_helpers.h> #include <bpf/bpf_tracing.h> +struct bpf_perf_event_value___local { + __u64 counter; + __u64 enabled; + __u64 running; +} __attribute__((preserve_access_index)); + /* map of perf event fds, num_cpu * num_metric entries */ struct { __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); @@ -15,14 +21,14 @@ struct { struct { __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(struct bpf_perf_event_value)); + __uint(value_size, sizeof(struct bpf_perf_event_value___local)); } fentry_readings SEC(".maps"); /* accumulated readings */ struct { __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(struct bpf_perf_event_value)); + __uint(value_size, sizeof(struct bpf_perf_event_value___local)); } accum_readings SEC(".maps"); /* sample counts, one per cpu */ @@ -39,7 +45,7 @@ const volatile __u32 num_metric = 1; SEC("fentry/XXX") int BPF_PROG(fentry_XXX) { - struct bpf_perf_event_value *ptrs[MAX_NUM_MATRICS]; + struct bpf_perf_event_value___local *ptrs[MAX_NUM_MATRICS]; u32 key = bpf_get_smp_processor_id(); u32 i; @@ -53,10 +59,10 @@ int BPF_PROG(fentry_XXX) } for (i = 0; i < num_metric && i < MAX_NUM_MATRICS; i++) { - struct bpf_perf_event_value reading; + struct bpf_perf_event_value___local reading; int err; - err = bpf_perf_event_read_value(&events, key, &reading, + err = bpf_perf_event_read_value(&events, key, (void *)&reading, sizeof(reading)); if (err) return 0; @@ -68,14 +74,14 @@ int BPF_PROG(fentry_XXX) } static inline void -fexit_update_maps(u32 id, struct bpf_perf_event_value *after) +fexit_update_maps(u32 id, struct bpf_perf_event_value___local *after) { - struct bpf_perf_event_value *before, diff; + struct bpf_perf_event_value___local *before, diff; before = bpf_map_lookup_elem(&fentry_readings, &id); /* only account samples with a valid fentry_reading */ if (before && before->counter) { - struct bpf_perf_event_value *accum; + struct bpf_perf_event_value___local *accum; diff.counter = after->counter - before->counter; diff.enabled = after->enabled - before->enabled; @@ -93,7 +99,7 @@ fexit_update_maps(u32 id, struct bpf_perf_event_value *after) SEC("fexit/XXX") int BPF_PROG(fexit_XXX) { - struct bpf_perf_event_value readings[MAX_NUM_MATRICS]; + struct bpf_perf_event_value___local readings[MAX_NUM_MATRICS]; u32 cpu = bpf_get_smp_processor_id(); u32 i, zero = 0; int err; @@ -102,7 +108,8 @@ int BPF_PROG(fexit_XXX) /* read all events before updating the maps, to reduce error */ for (i = 0; i < num_metric && i < MAX_NUM_MATRICS; i++) { err = bpf_perf_event_read_value(&events, cpu + i * num_cpu, - readings + i, sizeof(*readings)); + (void *)(readings + i), + sizeof(*readings)); if (err) return 0; } -- 2.40.0 ++++++ 0004-bpftool-Use-a-local-copy-of-BPF_LINK_TYPE_PERF_EVENT.patch ++++++ >From a9a8284ebebfdad29f4596c14cc9d5ae07b33430 Mon Sep 17 00:00:00 2001 From: Quentin Monnet <[email protected]> Date: Wed, 10 May 2023 18:22:50 +0100 Subject: [PATCH] bpftool: Use a local copy of BPF_LINK_TYPE_PERF_EVENT in pid_iter.bpf.c In order to allow the BPF program in bpftool's pid_iter.bpf.c to compile correctly on hosts where vmlinux.h does not define BPF_LINK_TYPE_PERF_EVENT (running kernel versions lower than 5.15, for example), define and use a local, CO-RE compatible copy of the enum value. Signed-off-by: Quentin Monnet <[email protected]> --- tools/bpf/bpftool/skeleton/pid_iter.bpf.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/skeleton/pid_iter.bpf.c b/src/skeleton/pid_iter.bpf.c index 3a4c4f7d83d8..26004f0c5a6a 100644 --- a/src/skeleton/pid_iter.bpf.c +++ b/src/skeleton/pid_iter.bpf.c @@ -24,6 +24,10 @@ struct perf_event___local { u64 bpf_cookie; } __attribute__((preserve_access_index)); +enum bpf_link_type___local { + BPF_LINK_TYPE_PERF_EVENT___local = 7, +}; + extern const void bpf_link_fops __ksym; extern const void bpf_map_fops __ksym; extern const void bpf_prog_fops __ksym; @@ -93,10 +97,13 @@ int iter(struct bpf_iter__task_file *ctx) e.pid = task->tgid; e.id = get_obj_id(file->private_data, obj_type); - if (obj_type == BPF_OBJ_LINK) { + if (obj_type == BPF_OBJ_LINK && + bpf_core_enum_value_exists(enum bpf_link_type___local, + BPF_LINK_TYPE_PERF_EVENT___local)) { struct bpf_link *link = (struct bpf_link *) file->private_data; - if (BPF_CORE_READ(link, type) == BPF_LINK_TYPE_PERF_EVENT) { + if (link->type == bpf_core_enum_value(enum bpf_link_type___local, + BPF_LINK_TYPE_PERF_EVENT___local)) { e.has_bpf_cookie = true; e.bpf_cookie = get_bpf_cookie(link); } -- 2.40.0 ++++++ binutils-2.40.patch ++++++ --- /var/tmp/diff_new_pack.vUE7oV/_old 2023-05-16 14:21:57.209864194 +0200 +++ /var/tmp/diff_new_pack.vUE7oV/_new 2023-05-16 14:21:57.213864217 +0200 @@ -1,7 +1,7 @@ diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile index f610e184ce02..21cd7505e871 100644 ---- a/tools/bpf/bpftool/Makefile -+++ b/tools/bpf/bpftool/Makefile +--- a/src/Makefile ++++ b/src/Makefile @@ -154,6 +154,8 @@ else # Fall back on libbfd ifeq ($(feature-libbfd),1)
