Commit f1bdebbb authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

perf bpf: Fix build with libbpf 0.7.0 by checking if bpf_program__set_insns() is available



During the transition to libbpf 1.0 some functions that perf used were
deprecated and finally removed from libbpf, so bpf_program__set_insns()
was introduced for perf to continue to use its bpf loader.

But when build with LIBBPF_DYNAMIC=1 we now need to check if that
function is available so that perf can build with older libbpf versions,
even if the end result is emitting a warning to the user that the use
of the perf BPF loader requires a newer libbpf, since bpf_program__set_insns()
touches libbpf objects internal state.

This affects only 'perf trace' when using bpf C code or pre-compiled
bytecode as an event.

Noticed on RHEL9, that has libbpf 0.7.0, where bpf_program__set_insns()
isn't available.

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 409fb6bd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ FEATURE_TESTS_EXTRA := \
         libbpf-bpf_prog_load           \
         libbpf-bpf_object__next_program \
         libbpf-bpf_object__next_map    \
         libbpf-bpf_program__set_insns  \
         libbpf-bpf_create_map		\
         libpfm4                        \
         libdebuginfod			\
+4 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ FILES= \
         test-libbpf-bpf_map_create.bin		\
         test-libbpf-bpf_object__next_program.bin \
         test-libbpf-bpf_object__next_map.bin   \
         test-libbpf-bpf_program__set_insns.bin	\
         test-libbpf-btf__raw_data.bin          \
         test-get_cpuid.bin                     \
         test-sdt.bin                           \
@@ -316,6 +317,9 @@ $(OUTPUT)test-libbpf-bpf_object__next_program.bin:
$(OUTPUT)test-libbpf-bpf_object__next_map.bin:
	$(BUILD) -lbpf

$(OUTPUT)test-libbpf-bpf_program__set_insns.bin:
	$(BUILD) -lbpf

$(OUTPUT)test-libbpf-btf__raw_data.bin:
	$(BUILD) -lbpf

+8 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
#include <bpf/libbpf.h>

int main(void)
{
	bpf_program__set_insns(NULL /* prog */, NULL /* new_insns */, 0 /* new_insn_cnt */);
	return 0;
}
+5 −0
Original line number Diff line number Diff line
@@ -588,6 +588,10 @@ ifndef NO_LIBELF
          ifeq ($(feature-libbpf-bpf_object__next_map), 1)
            CFLAGS += -DHAVE_LIBBPF_BPF_OBJECT__NEXT_MAP
          endif
          $(call feature_check,libbpf-bpf_program__set_insns)
          ifeq ($(feature-libbpf-bpf_program__set_insns), 1)
            CFLAGS += -DHAVE_LIBBPF_BPF_PROGRAM__SET_INSNS
          endif
          $(call feature_check,libbpf-btf__raw_data)
          ifeq ($(feature-libbpf-btf__raw_data), 1)
            CFLAGS += -DHAVE_LIBBPF_BTF__RAW_DATA
@@ -604,6 +608,7 @@ ifndef NO_LIBELF
        CFLAGS += -DHAVE_LIBBPF_BPF_PROG_LOAD
        CFLAGS += -DHAVE_LIBBPF_BPF_OBJECT__NEXT_PROGRAM
        CFLAGS += -DHAVE_LIBBPF_BPF_OBJECT__NEXT_MAP
        CFLAGS += -DHAVE_LIBBPF_BPF_PROGRAM__SET_INSNS
        CFLAGS += -DHAVE_LIBBPF_BTF__RAW_DATA
        CFLAGS += -DHAVE_LIBBPF_BPF_MAP_CREATE
      endif
+18 −0
Original line number Diff line number Diff line
@@ -36,6 +36,24 @@

#include <internal/xyarray.h>

#ifndef HAVE_LIBBPF_BPF_PROGRAM__SET_INSNS
int bpf_program__set_insns(struct bpf_program *prog __maybe_unused,
			   struct bpf_insn *new_insns __maybe_unused, size_t new_insn_cnt __maybe_unused)
{
	pr_err("%s: not support, update libbpf\n", __func__);
	return -ENOTSUP;
}

int libbpf_register_prog_handler(const char *sec __maybe_unused,
                                 enum bpf_prog_type prog_type __maybe_unused,
                                 enum bpf_attach_type exp_attach_type __maybe_unused,
                                 const struct libbpf_prog_handler_opts *opts __maybe_unused)
{
	pr_err("%s: not support, update libbpf\n", __func__);
	return -ENOTSUP;
}
#endif

/* temporarily disable libbpf deprecation warnings */
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"