• Arnaldo Carvalho de Melo's avatar
    perf build: Fix check for btf__load_from_kernel_by_id() in libbpf · 0ae065a5
    Arnaldo Carvalho de Melo authored
    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: 218e7b77 ("perf bpf: Provide a weak btf__load_from_kernel_by_id() for older libbpf versions")
    Reported-by: default avatarAvi Kivity <avi@scylladb.com>
    Link: https://lore.kernel.org/linux-perf-users/f0add43b-3de5-20c5-22c4-70aff4af959f@scylladb.com
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Ian Rogers <irogers@google.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Link: https://lore.kernel.org/linux-perf-users/YobjjFOblY4Xvwo7@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    0ae065a5
Makefile.config 38.6 KB