[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <YoeOC2WzPB8MAC4T@kernel.org>
Date: Fri, 20 May 2022 09:48:11 -0300
From: Arnaldo Carvalho de Melo <acme@...nel.org>
To: Avi Kivity <avi@...lladb.com>
Cc: linux-perf-users@...r.kernel.org, Jiri Olsa <jolsa@...nel.org>,
Ian Rogers <irogers@...gle.com>,
Namhyung Kim <namhyung@...nel.org>,
Adrian Hunter <adrian.hunter@...el.com>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH 1/1] perf build: Fix check for
btf__load_from_kernel_by_id() in libbpf
Em Thu, May 19, 2022 at 09:40:44PM -0300, Arnaldo Carvalho de Melo escreveu:
> Avi, can you please try with this patch applied?
>
Forgot to add:
Reported-by: Avi Kivity <avi@...lladb.com>
Fixed locally, if you managed to test this, please ack :-)
- Arnaldo
>
> ---
>
> 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")
> Link: https://lore.kernel.org/linux-perf-users/f0add43b-3de5-20c5-22c4-70aff4af959f@scylladb.com
> Cc: Adrian Hunter <adrian.hunter@...el.com>
> Cc: Ian Rogers <irogers@...gle.com>
> Cc: Jiri Olsa <jolsa@...nel.org>
> Cc: Namhyung Kim <namhyung@...nel.org>
> Signed-off-by: Arnaldo Carvalho de Melo <acme@...hat.com>
> ---
> tools/build/Makefile.feature | 1 +
> tools/build/feature/Makefile | 4 ++++
> .../feature/test-libbpf-btf__load_from_kernel_by_id.c | 7 +++++++
> tools/perf/Makefile.config | 7 +++++++
> tools/perf/util/bpf-event.c | 4 +++-
> 5 files changed, 22 insertions(+), 1 deletion(-)
> create mode 100644 tools/build/feature/test-libbpf-btf__load_from_kernel_by_id.c
>
> diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature
> index ae61f464043a11fb..c6a48d0ef9ff0648 100644
> --- a/tools/build/Makefile.feature
> +++ b/tools/build/Makefile.feature
> @@ -98,6 +98,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 de66e1cc073481c5..cb4a2a4fa2e48ebf 100644
> --- a/tools/build/feature/Makefile
> +++ b/tools/build/feature/Makefile
> @@ -57,6 +57,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 \
> @@ -287,6 +288,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 0000000000000000..f7c084428735a73d
> --- /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 f3bf9297bcc03c5e..1bd64e7404b9fbd4 100644
> --- a/tools/perf/Makefile.config
> +++ b/tools/perf/Makefile.config
> @@ -553,9 +553,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 94624733af7e225a..8271ab764eb56c7b 100644
> --- a/tools/perf/util/bpf-event.c
> +++ b/tools/perf/util/bpf-event.c
> @@ -22,7 +22,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
> @@ -32,6 +33,7 @@ struct btf * __weak btf__load_from_kernel_by_id(__u32 id)
>
> return err ? ERR_PTR(err) : btf;
> }
> +#endif
>
> int __weak bpf_prog_load(enum bpf_prog_type prog_type,
> const char *prog_name __maybe_unused,
> --
> 2.35.1
--
- Arnaldo
Powered by blists - more mailing lists