Patch "perf build: Fix check for btf__load_from_kernel_by_id() in libbpf" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    perf build: Fix check for btf__load_from_kernel_by_id() in libbpf

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     perf-build-fix-check-for-btf__load_from_kernel_by_id.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit e4acb4dfffab6695c32d0a3d17a360f437b1f408
Author: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
Date:   Thu May 19 21:25:12 2022 -0300

    perf build: Fix check for btf__load_from_kernel_by_id() in libbpf
    
    [ Upstream commit 0ae065a5d265bc5ada13e350015458e0c5e5c351 ]
    
    Avi Kivity reported a problem where the __weak
    btf__load_from_kernel_by_id() in tools/perf/util/bpf-event.c was being
    used and it called btf__get_from_id() in tools/lib/bpf/btf.c that in
    turn called back to btf__load_from_kernel_by_id(), resulting in an
    endless loop.
    
    Fix this by adding a feature test to check if
    btf__load_from_kernel_by_id() is available when building perf with
    LIBBPF_DYNAMIC=1, and if not then provide the fallback to the old
    btf__get_from_id(), that doesn't call back to btf__load_from_kernel_by_id()
    since at that time it didn't exist at all.
    
    Tested on Fedora 35 where we have libbpf-devel 0.4.0 with LIBBPF_DYNAMIC
    where we don't have btf__load_from_kernel_by_id() and thus its feature
    test fail, not defining HAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID:
    
      $ cat /tmp/build/perf-urgent/feature/test-libbpf-btf__load_from_kernel_by_id.make.output
      test-libbpf-btf__load_from_kernel_by_id.c: In function ‘main’:
      test-libbpf-btf__load_from_kernel_by_id.c:6:16: error: implicit declaration of function ‘btf__load_from_kernel_by_id’ [-Werror=implicit-function-declaration]
          6 |         return btf__load_from_kernel_by_id(20151128, NULL);
            |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~
      cc1: all warnings being treated as errors
      $
    
      $ nm /tmp/build/perf-urgent/perf | grep btf__load_from_kernel_by_id
      00000000005ba180 T btf__load_from_kernel_by_id
      $
    
      $ objdump --disassemble=btf__load_from_kernel_by_id -S /tmp/build/perf-urgent/perf
    
      /tmp/build/perf-urgent/perf:     file format elf64-x86-64
      <SNIP>
      00000000005ba180 <btf__load_from_kernel_by_id>:
      #include "record.h"
      #include "util/synthetic-events.h"
    
      #ifndef HAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID
      struct btf *btf__load_from_kernel_by_id(__u32 id)
      {
        5ba180:     55                      push   %rbp
        5ba181:     48 89 e5                mov    %rsp,%rbp
        5ba184:     48 83 ec 10             sub    $0x10,%rsp
        5ba188:     64 48 8b 04 25 28 00    mov    %fs:0x28,%rax
        5ba18f:     00 00
        5ba191:     48 89 45 f8             mov    %rax,-0x8(%rbp)
        5ba195:     31 c0                   xor    %eax,%eax
             struct btf *btf;
      #pragma GCC diagnostic push
      #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
             int err = btf__get_from_id(id, &btf);
        5ba197:     48 8d 75 f0             lea    -0x10(%rbp),%rsi
        5ba19b:     e8 a0 57 e5 ff          call   40f940 <btf__get_from_id@plt>
        5ba1a0:     89 c2                   mov    %eax,%edx
      #pragma GCC diagnostic pop
    
             return err ? ERR_PTR(err) : btf;
        5ba1a2:     48 98                   cltq
        5ba1a4:     85 d2                   test   %edx,%edx
        5ba1a6:     48 0f 44 45 f0          cmove  -0x10(%rbp),%rax
      }
      <SNIP>
    
    Fixes: 218e7b775d368f38 ("perf bpf: Provide a weak btf__load_from_kernel_by_id() for older libbpf versions")
    Reported-by: Avi Kivity <avi@xxxxxxxxxxxx>
    Link: https://lore.kernel.org/linux-perf-users/f0add43b-3de5-20c5-22c4-70aff4af959f@xxxxxxxxxxxx
    Cc: Adrian Hunter <adrian.hunter@xxxxxxxxx>
    Cc: Ian Rogers <irogers@xxxxxxxxxx>
    Cc: Jiri Olsa <jolsa@xxxxxxxxxx>
    Cc: Namhyung Kim <namhyung@xxxxxxxxxx>
    Link: https://lore.kernel.org/linux-perf-users/YobjjFOblY4Xvwo7@xxxxxxxxxx
    Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
index 88dd7db55d38..6abde487bba1 100644
--- a/tools/build/Makefile.feature
+++ b/tools/build/Makefile.feature
@@ -97,6 +97,7 @@ FEATURE_TESTS_EXTRA :=                  \
          llvm-version                   \
          clang                          \
          libbpf                         \
+         libbpf-btf__load_from_kernel_by_id \
          libpfm4                        \
          libdebuginfod			\
          clang-bpf-co-re
diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile
index 0e6d685b8617..69a43d9ea331 100644
--- a/tools/build/feature/Makefile
+++ b/tools/build/feature/Makefile
@@ -56,6 +56,7 @@ FILES=                                          \
          test-lzma.bin                          \
          test-bpf.bin                           \
          test-libbpf.bin                        \
+         test-libbpf-btf__load_from_kernel_by_id.bin	\
          test-get_cpuid.bin                     \
          test-sdt.bin                           \
          test-cxx.bin                           \
@@ -283,6 +284,9 @@ $(OUTPUT)test-bpf.bin:
 $(OUTPUT)test-libbpf.bin:
 	$(BUILD) -lbpf
 
+$(OUTPUT)test-libbpf-btf__load_from_kernel_by_id.bin:
+	$(BUILD) -lbpf
+
 $(OUTPUT)test-sdt.bin:
 	$(BUILD)
 
diff --git a/tools/build/feature/test-libbpf-btf__load_from_kernel_by_id.c b/tools/build/feature/test-libbpf-btf__load_from_kernel_by_id.c
new file mode 100644
index 000000000000..f7c084428735
--- /dev/null
+++ b/tools/build/feature/test-libbpf-btf__load_from_kernel_by_id.c
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <bpf/libbpf.h>
+
+int main(void)
+{
+	return btf__load_from_kernel_by_id(20151128, NULL);
+}
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index a92f0f025ec7..e0660bc76b7b 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -548,9 +548,16 @@ ifndef NO_LIBELF
         ifeq ($(feature-libbpf), 1)
           EXTLIBS += -lbpf
           $(call detected,CONFIG_LIBBPF_DYNAMIC)
+
+          $(call feature_check,libbpf-btf__load_from_kernel_by_id)
+          ifeq ($(feature-libbpf-btf__load_from_kernel_by_id), 1)
+            CFLAGS += -DHAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID
+          endif
         else
           dummy := $(error Error: No libbpf devel library found, please install libbpf-devel);
         endif
+      else
+	CFLAGS += -DHAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID
       endif
     endif
 
diff --git a/tools/perf/util/bpf-event.c b/tools/perf/util/bpf-event.c
index 16ad0e6e9e9c..cf1b9f6ec0db 100644
--- a/tools/perf/util/bpf-event.c
+++ b/tools/perf/util/bpf-event.c
@@ -21,7 +21,8 @@
 #include "record.h"
 #include "util/synthetic-events.h"
 
-struct btf * __weak btf__load_from_kernel_by_id(__u32 id)
+#ifndef HAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID
+struct btf *btf__load_from_kernel_by_id(__u32 id)
 {
        struct btf *btf;
 #pragma GCC diagnostic push
@@ -31,6 +32,7 @@ struct btf * __weak btf__load_from_kernel_by_id(__u32 id)
 
        return err ? ERR_PTR(err) : btf;
 }
+#endif
 
 #define ptr_to_u64(ptr)    ((__u64)(unsigned long)(ptr))
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux