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)

Reply via email to