Commit 5c83eff3 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

perf build: Stop using __weak bpf_prog_load() to handle older libbpf versions

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: default avatarJiri Olsa <jolsa@kernel.org>
Tested-by: default avatarArnaldo 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@kravaSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 73534617
...@@ -99,6 +99,7 @@ FEATURE_TESTS_EXTRA := \ ...@@ -99,6 +99,7 @@ FEATURE_TESTS_EXTRA := \
clang \ clang \
libbpf \ libbpf \
libbpf-btf__load_from_kernel_by_id \ libbpf-btf__load_from_kernel_by_id \
libbpf-bpf_prog_load \
libpfm4 \ libpfm4 \
libdebuginfod \ libdebuginfod \
clang-bpf-co-re clang-bpf-co-re
......
...@@ -58,6 +58,7 @@ FILES= \ ...@@ -58,6 +58,7 @@ FILES= \
test-bpf.bin \ test-bpf.bin \
test-libbpf.bin \ test-libbpf.bin \
test-libbpf-btf__load_from_kernel_by_id.bin \ test-libbpf-btf__load_from_kernel_by_id.bin \
test-libbpf-bpf_prog_load.bin \
test-get_cpuid.bin \ test-get_cpuid.bin \
test-sdt.bin \ test-sdt.bin \
test-cxx.bin \ test-cxx.bin \
...@@ -291,6 +292,9 @@ $(OUTPUT)test-libbpf.bin: ...@@ -291,6 +292,9 @@ $(OUTPUT)test-libbpf.bin:
$(OUTPUT)test-libbpf-btf__load_from_kernel_by_id.bin: $(OUTPUT)test-libbpf-btf__load_from_kernel_by_id.bin:
$(BUILD) -lbpf $(BUILD) -lbpf
$(OUTPUT)test-libbpf-bpf_prog_load.bin:
$(BUILD) -lbpf
$(OUTPUT)test-sdt.bin: $(OUTPUT)test-sdt.bin:
$(BUILD) $(BUILD)
......
// 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 */);
}
...@@ -573,11 +573,16 @@ ifndef NO_LIBELF ...@@ -573,11 +573,16 @@ ifndef NO_LIBELF
ifeq ($(feature-libbpf-btf__load_from_kernel_by_id), 1) ifeq ($(feature-libbpf-btf__load_from_kernel_by_id), 1)
CFLAGS += -DHAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID CFLAGS += -DHAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID
endif endif
$(call feature_check,libbpf-bpf_prog_load)
ifeq ($(feature-libbpf-bpf_prog_load), 1)
CFLAGS += -DHAVE_LIBBPF_BPF_PROG_LOAD
endif
else else
dummy := $(error Error: No libbpf devel library found, please install libbpf-devel); dummy := $(error Error: No libbpf devel library found, please install libbpf-devel);
endif endif
else else
CFLAGS += -DHAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID CFLAGS += -DHAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID
CFLAGS += -DHAVE_LIBBPF_BPF_PROG_LOAD
endif endif
endif endif
......
...@@ -35,7 +35,8 @@ struct btf *btf__load_from_kernel_by_id(__u32 id) ...@@ -35,7 +35,8 @@ struct btf *btf__load_from_kernel_by_id(__u32 id)
} }
#endif #endif
int __weak bpf_prog_load(enum bpf_prog_type prog_type, #ifndef HAVE_LIBBPF_BPF_PROG_LOAD
int bpf_prog_load(enum bpf_prog_type prog_type,
const char *prog_name __maybe_unused, const char *prog_name __maybe_unused,
const char *license, const char *license,
const struct bpf_insn *insns, size_t insn_cnt, const struct bpf_insn *insns, size_t insn_cnt,
...@@ -47,6 +48,7 @@ int __weak bpf_prog_load(enum bpf_prog_type prog_type, ...@@ -47,6 +48,7 @@ int __weak bpf_prog_load(enum bpf_prog_type prog_type,
opts->kern_version, opts->log_buf, opts->log_size); opts->kern_version, opts->log_buf, opts->log_size);
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
} }
#endif
struct bpf_program * __weak struct bpf_program * __weak
bpf_object__next_program(const struct bpf_object *obj, struct bpf_program *prev) bpf_object__next_program(const struct bpf_object *obj, struct bpf_program *prev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment