perf build: Stop using __weak bpf_prog_load() to handle older libbpf versions
authorJiri Olsa <jolsa@kernel.org>
Tue, 24 May 2022 11:04:43 +0000 (13:04 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 26 May 2022 14:02:02 +0000 (11:02 -0300)
By adding a feature test for bpf_prog_load() and providing a fallback if
it isn't present in older versions of libbpf.

Committer testing:

  $ rpm -q libbpf-devel
  libbpf-devel-0.4.0-2.fc35.x86_64
  $ make -C tools/perf LIBBPF_DYNAMIC=1 O=/tmp/build/perf install-bin
  $ cat /tmp/build/perf/feature/test-libbpf-bpf_prog_load.make.output
  test-libbpf-bpf_prog_load.c: In function ‘main’:
  test-libbpf-bpf_prog_load.c:6:16: error: implicit declaration of function ‘bpf_prog_load’ [-Werror=implicit-function-declaration]
      6 |         return bpf_prog_load(0 /* prog_type */, NULL /* prog_name */,
        |                ^~~~~~~~~~~~~
  cc1: all warnings being treated as errors
  $

  $ objdump -dS /tmp/build/perf/perf | grep '<bpf_prog_load>:' -A20
  00000000005b2d70 <bpf_prog_load>:
  {
    5b2d70: 55                    push   %rbp
    5b2d71: 48 89 ce              mov    %rcx,%rsi
    5b2d74: 4c 89 c8              mov    %r9,%rax
    5b2d77: 49 89 d2              mov    %rdx,%r10
    5b2d7a: 4c 89 c2              mov    %r8,%rdx
    5b2d7d: 48 89 e5              mov    %rsp,%rbp
    5b2d80: 48 83 ec 18           sub    $0x18,%rsp
    5b2d84: 64 48 8b 0c 25 28 00  mov    %fs:0x28,%rcx
    5b2d8b: 00 00
    5b2d8d: 48 89 4d f8           mov    %rcx,-0x8(%rbp)
    5b2d91: 31 c9                 xor    %ecx,%ecx
   return bpf_load_program(prog_type, insns, insn_cnt, license,
    5b2d93: 41 8b 49 5c           mov    0x5c(%r9),%ecx
    5b2d97: 51                    push   %rcx
    5b2d98: 4d 8b 49 60           mov    0x60(%r9),%r9
    5b2d9c: 4c 89 d1              mov    %r10,%rcx
    5b2d9f: 44 8b 40 1c           mov    0x1c(%rax),%r8d
    5b2da3: e8 f8 aa e5 ff        call   40d8a0 <bpf_load_program@plt>
  }
  $

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ilya Leoshkevich <iii@linux.ibm.com>
Cc: Sumanth Korikkar <sumanthk@linux.ibm.com>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Link: http://lore.kernel.org/linux-perf-users/YozLKby7ITEtchC9@krava
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/build/Makefile.feature
tools/build/feature/Makefile
tools/build/feature/test-libbpf-bpf_prog_load.c [new file with mode: 0644]
tools/perf/Makefile.config
tools/perf/util/bpf-event.c

index c6a48d0..fa5f7b7 100644 (file)
@@ -99,6 +99,7 @@ FEATURE_TESTS_EXTRA :=                  \
          clang                          \
          libbpf                         \
          libbpf-btf__load_from_kernel_by_id \
+         libbpf-bpf_prog_load           \
          libpfm4                        \
          libdebuginfod                 \
          clang-bpf-co-re
index cb4a2a4..b3fdcc6 100644 (file)
@@ -58,6 +58,7 @@ FILES=                                          \
          test-bpf.bin                           \
          test-libbpf.bin                        \
          test-libbpf-btf__load_from_kernel_by_id.bin   \
+         test-libbpf-bpf_prog_load.bin          \
          test-get_cpuid.bin                     \
          test-sdt.bin                           \
          test-cxx.bin                           \
@@ -291,6 +292,9 @@ $(OUTPUT)test-libbpf.bin:
 $(OUTPUT)test-libbpf-btf__load_from_kernel_by_id.bin:
        $(BUILD) -lbpf
 
+$(OUTPUT)test-libbpf-bpf_prog_load.bin:
+       $(BUILD) -lbpf
+
 $(OUTPUT)test-sdt.bin:
        $(BUILD)
 
diff --git a/tools/build/feature/test-libbpf-bpf_prog_load.c b/tools/build/feature/test-libbpf-bpf_prog_load.c
new file mode 100644 (file)
index 0000000..47f516d
--- /dev/null
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <bpf/bpf.h>
+
+int main(void)
+{
+       return bpf_prog_load(0 /* prog_type */, NULL /* prog_name */,
+                            NULL /* license */, NULL /* insns */,
+                            0 /* insn_cnt */, NULL /* opts */);
+}
index e0304e7..63c92fd 100644 (file)
@@ -573,11 +573,16 @@ ifndef NO_LIBELF
           ifeq ($(feature-libbpf-btf__load_from_kernel_by_id), 1)
             CFLAGS += -DHAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID
           endif
+          $(call feature_check,libbpf-bpf_prog_load)
+          ifeq ($(feature-libbpf-bpf_prog_load), 1)
+            CFLAGS += -DHAVE_LIBBPF_BPF_PROG_LOAD
+          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
+        CFLAGS += -DHAVE_LIBBPF_BPF_PROG_LOAD
       endif
     endif
 
index 8271ab7..289bb55 100644 (file)
@@ -35,11 +35,12 @@ struct btf *btf__load_from_kernel_by_id(__u32 id)
 }
 #endif
 
-int __weak bpf_prog_load(enum bpf_prog_type prog_type,
-                        const char *prog_name __maybe_unused,
-                        const char *license,
-                        const struct bpf_insn *insns, size_t insn_cnt,
-                        const struct bpf_prog_load_opts *opts)
+#ifndef HAVE_LIBBPF_BPF_PROG_LOAD
+int bpf_prog_load(enum bpf_prog_type prog_type,
+                 const char *prog_name __maybe_unused,
+                 const char *license,
+                 const struct bpf_insn *insns, size_t insn_cnt,
+                 const struct bpf_prog_load_opts *opts)
 {
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
@@ -47,6 +48,7 @@ int __weak bpf_prog_load(enum bpf_prog_type prog_type,
                                opts->kern_version, opts->log_buf, opts->log_size);
 #pragma GCC diagnostic pop
 }
+#endif
 
 struct bpf_program * __weak
 bpf_object__next_program(const struct bpf_object *obj, struct bpf_program *prev)