From 2c7333603e879924800a56bdd18e2a59c0d0b698 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Tue, 16 May 2023 06:11:34 +0000 Subject: [PATCH] import bcc-0.25.0-2.el8 --- .bcc.metadata | 2 +- .gitignore | 2 +- ...bcc-0.24.0-RHEL-libbpf-version-fixes.patch | 324 --------- ...-bpf_pseudo_fd-type-conversion-error.patch | 77 ++ ...-15-int-to-pointer-conversion-errors.patch | 96 +++ .../bcc-0.25.0-Fix-get_kprobe_functions.patch | 30 + ...-Manpages-remove-unstable-statement.patch} | 128 ++-- ...bcc-0.25.0-RHEL-libbpf-version-fixes.patch | 684 ++++++++++++++++++ ...paccept-Fix-support-for-v5.6-kernels.patch | 42 ++ ...el_struct_has_field-to-reach-field-.patch} | 24 +- SPECS/bcc.spec | 13 +- 11 files changed, 1036 insertions(+), 386 deletions(-) delete mode 100644 SOURCES/bcc-0.24.0-RHEL-libbpf-version-fixes.patch create mode 100644 SOURCES/bcc-0.25.0-Fix-bpf_pseudo_fd-type-conversion-error.patch create mode 100644 SOURCES/bcc-0.25.0-Fix-clang-15-int-to-pointer-conversion-errors.patch create mode 100644 SOURCES/bcc-0.25.0-Fix-get_kprobe_functions.patch rename SOURCES/{bcc-0.24.0-Manpages-remove-unstable-statement.patch => bcc-0.25.0-Manpages-remove-unstable-statement.patch} (93%) create mode 100644 SOURCES/bcc-0.25.0-RHEL-libbpf-version-fixes.patch create mode 100644 SOURCES/bcc-0.25.0-Revert-tools-tcpaccept-Fix-support-for-v5.6-kernels.patch rename SOURCES/{bcc-0.24.0-libbpf-Allow-kernel_struct_has_field-to-reach-field-.patch => bcc-0.25.0-libbpf-Allow-kernel_struct_has_field-to-reach-field-.patch} (72%) diff --git a/.bcc.metadata b/.bcc.metadata index e3a63ae..51078f8 100644 --- a/.bcc.metadata +++ b/.bcc.metadata @@ -1 +1 @@ -896d0249470dedfabfcc9a4c8b4089a55b793277 SOURCES/bcc-0.24.0.tar.gz +059187f62e915eb74ea7b18e19fcb185f9d18255 SOURCES/bcc-0.25.0.tar.gz diff --git a/.gitignore b/.gitignore index 277ef94..9cf0677 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/bcc-0.24.0.tar.gz +SOURCES/bcc-0.25.0.tar.gz diff --git a/SOURCES/bcc-0.24.0-RHEL-libbpf-version-fixes.patch b/SOURCES/bcc-0.24.0-RHEL-libbpf-version-fixes.patch deleted file mode 100644 index b00d20e..0000000 --- a/SOURCES/bcc-0.24.0-RHEL-libbpf-version-fixes.patch +++ /dev/null @@ -1,324 +0,0 @@ -From 8f2951559127ffb93c3e36d5fc9d870768826ae9 Mon Sep 17 00:00:00 2001 -From: Jerome Marchand -Date: Thu, 24 Mar 2022 16:08:17 +0100 -Subject: [PATCH 2/2] RHEL: libbpf version fixes - -Revert "bcc: Replace deprecated libbpf APIs" since the libbpf version -provided in RHEL 8 doesn't provide the new APIs. - -Remove BPF_MAP_TYPE_BLOOM_FILTER from bps since the libbpf version in -RHEL 8, doesn't provide bloom filter map. - -Rename btf__load_vmlinux_btf into libbpf_find_kernel_btf. The function -has been renamed upstream for naming consistency, but RHEL 8 libbpf -still uses the old name. - -Add definition of struct bpf_core_relo. ---- - introspection/bps.c | 1 - - libbpf-tools/ksnoop.c | 2 +- - src/cc/bcc_btf.cc | 73 ++++++++++++++++++++++++++++++++++++- - src/cc/libbpf.c | 84 +++++++------------------------------------ - 4 files changed, 85 insertions(+), 75 deletions(-) - -diff --git a/introspection/bps.c b/introspection/bps.c -index 232b23d4..6ec02e6c 100644 ---- a/introspection/bps.c -+++ b/introspection/bps.c -@@ -80,7 +80,6 @@ static const char * const map_type_strings[] = { - [BPF_MAP_TYPE_RINGBUF] = "ringbuf", - [BPF_MAP_TYPE_INODE_STORAGE] = "inode_storage", - [BPF_MAP_TYPE_TASK_STORAGE] = "task_storage", -- [BPF_MAP_TYPE_BLOOM_FILTER] = "bloom_filter", - }; - - #define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) -diff --git a/libbpf-tools/ksnoop.c b/libbpf-tools/ksnoop.c -index 69c58403..a6ea6107 100644 ---- a/libbpf-tools/ksnoop.c -+++ b/libbpf-tools/ksnoop.c -@@ -347,7 +347,7 @@ static struct btf *get_btf(const char *name) - name && strlen(name) > 0 ? name : "vmlinux"); - - if (!vmlinux_btf) { -- vmlinux_btf = btf__load_vmlinux_btf(); -+ vmlinux_btf = libbpf_find_kernel_btf(); - if (!vmlinux_btf) { - err = -errno; - p_err("No BTF, cannot determine type info: %s", strerror(-err)); -diff --git a/src/cc/bcc_btf.cc b/src/cc/bcc_btf.cc -index 7f551ae8..c78ba823 100644 ---- a/src/cc/bcc_btf.cc -+++ b/src/cc/bcc_btf.cc -@@ -170,6 +170,77 @@ static int btf_ext_setup_line_info(struct btf_ext *btf_ext) - return btf_ext_setup_info(btf_ext, ¶m); - } - -+/* bpf_core_relo_kind encodes which aspect of captured field/type/enum value -+ * has to be adjusted by relocations. -+ */ -+enum bpf_core_relo_kind { -+ BPF_FIELD_BYTE_OFFSET = 0, /* field byte offset */ -+ BPF_FIELD_BYTE_SIZE = 1, /* field size in bytes */ -+ BPF_FIELD_EXISTS = 2, /* field existence in target kernel */ -+ BPF_FIELD_SIGNED = 3, /* field signedness (0 - unsigned, 1 - signed) */ -+ BPF_FIELD_LSHIFT_U64 = 4, /* bitfield-specific left bitshift */ -+ BPF_FIELD_RSHIFT_U64 = 5, /* bitfield-specific right bitshift */ -+ BPF_TYPE_ID_LOCAL = 6, /* type ID in local BPF object */ -+ BPF_TYPE_ID_TARGET = 7, /* type ID in target kernel */ -+ BPF_TYPE_EXISTS = 8, /* type existence in target kernel */ -+ BPF_TYPE_SIZE = 9, /* type size in bytes */ -+ BPF_ENUMVAL_EXISTS = 10, /* enum value existence in target kernel */ -+ BPF_ENUMVAL_VALUE = 11, /* enum value integer value */ -+}; -+ -+/* The minimum bpf_core_relo checked by the loader -+ * -+ * CO-RE relocation captures the following data: -+ * - insn_off - instruction offset (in bytes) within a BPF program that needs -+ * its insn->imm field to be relocated with actual field info; -+ * - type_id - BTF type ID of the "root" (containing) entity of a relocatable -+ * type or field; -+ * - access_str_off - offset into corresponding .BTF string section. String -+ * interpretation depends on specific relocation kind: -+ * - for field-based relocations, string encodes an accessed field using -+ * a sequence of field and array indices, separated by colon (:). It's -+ * conceptually very close to LLVM's getelementptr ([0]) instruction's -+ * arguments for identifying offset to a field. -+ * - for type-based relocations, strings is expected to be just "0"; -+ * - for enum value-based relocations, string contains an index of enum -+ * value within its enum type; -+ * -+ * Example to provide a better feel. -+ * -+ * struct sample { -+ * int a; -+ * struct { -+ * int b[10]; -+ * }; -+ * }; -+ * -+ * struct sample *s = ...; -+ * int x = &s->a; // encoded as "0:0" (a is field #0) -+ * int y = &s->b[5]; // encoded as "0:1:0:5" (anon struct is field #1, -+ * // b is field #0 inside anon struct, accessing elem #5) -+ * int z = &s[10]->b; // encoded as "10:1" (ptr is used as an array) -+ * -+ * type_id for all relocs in this example will capture BTF type id of -+ * `struct sample`. -+ * -+ * Such relocation is emitted when using __builtin_preserve_access_index() -+ * Clang built-in, passing expression that captures field address, e.g.: -+ * -+ * bpf_probe_read(&dst, sizeof(dst), -+ * __builtin_preserve_access_index(&src->a.b.c)); -+ * -+ * In this case Clang will emit field relocation recording necessary data to -+ * be able to find offset of embedded `a.b.c` field within `src` struct. -+ * -+ * [0] https://llvm.org/docs/LangRef.html#getelementptr-instruction -+ */ -+struct bpf_core_relo { -+ __u32 insn_off; -+ __u32 type_id; -+ __u32 access_str_off; -+ enum bpf_core_relo_kind kind; -+}; -+ - static int btf_ext_setup_core_relos(struct btf_ext *btf_ext) - { - struct btf_ext_sec_setup_param param = { -@@ -597,7 +668,7 @@ int BTF::load(uint8_t *btf_sec, uintptr_t btf_sec_size, - return -1; - } - -- if (btf__load_into_kernel(btf)) { -+ if (btf__load(btf)) { - btf__free(btf); - warning("Loading .BTF section failed\n"); - return -1; -diff --git a/src/cc/libbpf.c b/src/cc/libbpf.c -index e6403299..7410ae1a 100644 ---- a/src/cc/libbpf.c -+++ b/src/cc/libbpf.c -@@ -297,25 +297,6 @@ static uint64_t ptr_to_u64(void *ptr) - return (uint64_t) (unsigned long) ptr; - } - --static int libbpf_bpf_map_create(struct bpf_create_map_attr *create_attr) --{ -- LIBBPF_OPTS(bpf_map_create_opts, p); -- -- p.map_flags = create_attr->map_flags; -- p.numa_node = create_attr->numa_node; -- p.btf_fd = create_attr->btf_fd; -- p.btf_key_type_id = create_attr->btf_key_type_id; -- p.btf_value_type_id = create_attr->btf_value_type_id; -- p.map_ifindex = create_attr->map_ifindex; -- if (create_attr->map_type == BPF_MAP_TYPE_STRUCT_OPS) -- p.btf_vmlinux_value_type_id = create_attr->btf_vmlinux_value_type_id; -- else -- p.inner_map_fd = create_attr->inner_map_fd; -- -- return bpf_map_create(create_attr->map_type, create_attr->name, create_attr->key_size, -- create_attr->value_size, create_attr->max_entries, &p); --} -- - int bcc_create_map_xattr(struct bpf_create_map_attr *attr, bool allow_rlimit) - { - unsigned name_len = attr->name ? strlen(attr->name) : 0; -@@ -323,7 +304,7 @@ int bcc_create_map_xattr(struct bpf_create_map_attr *attr, bool allow_rlimit) - - memcpy(map_name, attr->name, min(name_len, BPF_OBJ_NAME_LEN - 1)); - attr->name = map_name; -- int ret = libbpf_bpf_map_create(attr); -+ int ret = bpf_create_map_xattr(attr); - - if (ret < 0 && errno == EPERM) { - if (!allow_rlimit) -@@ -335,7 +316,7 @@ int bcc_create_map_xattr(struct bpf_create_map_attr *attr, bool allow_rlimit) - rl.rlim_max = RLIM_INFINITY; - rl.rlim_cur = rl.rlim_max; - if (setrlimit(RLIMIT_MEMLOCK, &rl) == 0) -- ret = libbpf_bpf_map_create(attr); -+ ret = bpf_create_map_xattr(attr); - } - } - -@@ -345,12 +326,12 @@ int bcc_create_map_xattr(struct bpf_create_map_attr *attr, bool allow_rlimit) - attr->btf_fd = 0; - attr->btf_key_type_id = 0; - attr->btf_value_type_id = 0; -- ret = libbpf_bpf_map_create(attr); -+ ret = bpf_create_map_xattr(attr); - } - - if (ret < 0 && name_len && (errno == E2BIG || errno == EINVAL)) { - map_name[0] = '\0'; -- ret = libbpf_bpf_map_create(attr); -+ ret = bpf_create_map_xattr(attr); - } - - if (ret < 0 && errno == EPERM) { -@@ -363,7 +344,7 @@ int bcc_create_map_xattr(struct bpf_create_map_attr *attr, bool allow_rlimit) - rl.rlim_max = RLIM_INFINITY; - rl.rlim_cur = rl.rlim_max; - if (setrlimit(RLIMIT_MEMLOCK, &rl) == 0) -- ret = libbpf_bpf_map_create(attr); -+ ret = bpf_create_map_xattr(attr); - } - } - return ret; -@@ -627,47 +608,6 @@ int bpf_prog_get_tag(int fd, unsigned long long *ptag) - return 0; - } - --static int libbpf_bpf_prog_load(const struct bpf_load_program_attr *load_attr, -- char *log_buf, size_t log_buf_sz) --{ -- LIBBPF_OPTS(bpf_prog_load_opts, p); -- -- if (!load_attr || !log_buf != !log_buf_sz) { -- errno = EINVAL; -- return -EINVAL; -- } -- -- p.expected_attach_type = load_attr->expected_attach_type; -- switch (load_attr->prog_type) { -- case BPF_PROG_TYPE_STRUCT_OPS: -- case BPF_PROG_TYPE_LSM: -- p.attach_btf_id = load_attr->attach_btf_id; -- break; -- case BPF_PROG_TYPE_TRACING: -- case BPF_PROG_TYPE_EXT: -- p.attach_btf_id = load_attr->attach_btf_id; -- p.attach_prog_fd = load_attr->attach_prog_fd; -- break; -- default: -- p.prog_ifindex = load_attr->prog_ifindex; -- p.kern_version = load_attr->kern_version; -- } -- p.log_level = load_attr->log_level; -- p.log_buf = log_buf; -- p.log_size = log_buf_sz; -- p.prog_btf_fd = load_attr->prog_btf_fd; -- p.func_info_rec_size = load_attr->func_info_rec_size; -- p.func_info_cnt = load_attr->func_info_cnt; -- p.func_info = load_attr->func_info; -- p.line_info_rec_size = load_attr->line_info_rec_size; -- p.line_info_cnt = load_attr->line_info_cnt; -- p.line_info = load_attr->line_info; -- p.prog_flags = load_attr->prog_flags; -- -- return bpf_prog_load(load_attr->prog_type, load_attr->name, load_attr->license, -- load_attr->insns, load_attr->insns_cnt, &p); --} -- - int bcc_prog_load_xattr(struct bpf_load_program_attr *attr, int prog_len, - char *log_buf, unsigned log_buf_size, bool allow_rlimit) - { -@@ -750,7 +690,7 @@ int bcc_prog_load_xattr(struct bpf_load_program_attr *attr, int prog_len, - attr->name = prog_name; - } - -- ret = libbpf_bpf_prog_load(attr, attr_log_buf, attr_log_buf_size); -+ ret = bpf_load_program_xattr(attr, attr_log_buf, attr_log_buf_size); - - // func_info/line_info may not be supported in old kernels. - if (ret < 0 && attr->func_info && errno == EINVAL) { -@@ -761,14 +701,14 @@ int bcc_prog_load_xattr(struct bpf_load_program_attr *attr, int prog_len, - attr->line_info = NULL; - attr->line_info_cnt = 0; - attr->line_info_rec_size = 0; -- ret = libbpf_bpf_prog_load(attr, attr_log_buf, attr_log_buf_size); -+ ret = bpf_load_program_xattr(attr, attr_log_buf, attr_log_buf_size); - } - - // BPF object name is not supported on older Kernels. - // If we failed due to this, clear the name and try again. - if (ret < 0 && name_len && (errno == E2BIG || errno == EINVAL)) { - prog_name[0] = '\0'; -- ret = libbpf_bpf_prog_load(attr, attr_log_buf, attr_log_buf_size); -+ ret = bpf_load_program_xattr(attr, attr_log_buf, attr_log_buf_size); - } - - if (ret < 0 && errno == EPERM) { -@@ -787,7 +727,7 @@ int bcc_prog_load_xattr(struct bpf_load_program_attr *attr, int prog_len, - rl.rlim_max = RLIM_INFINITY; - rl.rlim_cur = rl.rlim_max; - if (setrlimit(RLIMIT_MEMLOCK, &rl) == 0) -- ret = libbpf_bpf_prog_load(attr, attr_log_buf, attr_log_buf_size); -+ ret = bpf_load_program_xattr(attr, attr_log_buf, attr_log_buf_size); - } - } - -@@ -805,7 +745,7 @@ int bcc_prog_load_xattr(struct bpf_load_program_attr *attr, int prog_len, - // If logging is not already enabled, enable it and do the syscall again. - if (attr->log_level == 0) { - attr->log_level = 1; -- ret = libbpf_bpf_prog_load(attr, log_buf, log_buf_size); -+ ret = bpf_load_program_xattr(attr, log_buf, log_buf_size); - } - // Print the log message and return. - bpf_print_hints(ret, log_buf); -@@ -829,7 +769,7 @@ int bcc_prog_load_xattr(struct bpf_load_program_attr *attr, int prog_len, - goto return_result; - } - tmp_log_buf[0] = 0; -- ret = libbpf_bpf_prog_load(attr, tmp_log_buf, tmp_log_buf_size); -+ ret = bpf_load_program_xattr(attr, tmp_log_buf, tmp_log_buf_size); - if (ret < 0 && errno == ENOSPC) { - // Temporary buffer size is not enough. Double it and try again. - free(tmp_log_buf); -@@ -1369,7 +1309,7 @@ int kernel_struct_has_field(const char *struct_name, const char *field_name) - struct btf *btf; - int i, ret, btf_id; - -- btf = btf__load_vmlinux_btf(); -+ btf = libbpf_find_kernel_btf(); - ret = libbpf_get_error(btf); - if (ret) - return -1; --- -2.35.3 - diff --git a/SOURCES/bcc-0.25.0-Fix-bpf_pseudo_fd-type-conversion-error.patch b/SOURCES/bcc-0.25.0-Fix-bpf_pseudo_fd-type-conversion-error.patch new file mode 100644 index 0000000..7ee0a2c --- /dev/null +++ b/SOURCES/bcc-0.25.0-Fix-bpf_pseudo_fd-type-conversion-error.patch @@ -0,0 +1,77 @@ +From 728005aac7c23590a406ac67235d915e416bff5d Mon Sep 17 00:00:00 2001 +From: Yonghong Song +Date: Sat, 13 Aug 2022 17:50:07 -0700 +Subject: [PATCH 1/2] Fix bpf_pseudo_fd() type conversion error + +With llvm15 and llvm16, the following command line + sudo ./trace.py 'smp_call_function_single "%K", arg1' +will cause error: + /virtual/main.c:60:36: error: incompatible integer to pointer conversion passing 'u64' + (aka 'unsigned long long') to parameter of type 'void *' [-Wint-conversion] + bpf_perf_event_output(ctx, bpf_pseudo_fd(1, -1), CUR_CPU_IDENTIFIER, &__data, sizeof(__data)); + ^~~~~~~~~~~~~~~~~~~~ + 1 error generated. + Failed to compile BPF module + +In helpers.h, we have + u64 bpf_pseudo_fd(u64, u64) asm("llvm.bpf.pseudo"); +Apparently, <= llvm14 can tolerate u64 -> 'void *' conversion, but +llvm15 by default will cause an error. + +Let us explicitly convert bpf_pseudo_fd to 'void *' to avoid +such errors. + +Signed-off-by: Yonghong Song +--- + src/cc/frontends/clang/b_frontend_action.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/src/cc/frontends/clang/b_frontend_action.cc b/src/cc/frontends/clang/b_frontend_action.cc +index a4e05b16..dbeba3e4 100644 +--- a/src/cc/frontends/clang/b_frontend_action.cc ++++ b/src/cc/frontends/clang/b_frontend_action.cc +@@ -957,7 +957,7 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) { + string arg0 = rewriter_.getRewrittenText(expansionRange(Call->getArg(0)->getSourceRange())); + string args_other = rewriter_.getRewrittenText(expansionRange(SourceRange(GET_BEGINLOC(Call->getArg(1)), + GET_ENDLOC(Call->getArg(2))))); +- txt = "bpf_perf_event_output(" + arg0 + ", bpf_pseudo_fd(1, " + fd + ")"; ++ txt = "bpf_perf_event_output(" + arg0 + ", (void *)bpf_pseudo_fd(1, " + fd + ")"; + txt += ", CUR_CPU_IDENTIFIER, " + args_other + ")"; + + // e.g. +@@ -986,7 +986,7 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) { + string meta_len = rewriter_.getRewrittenText(expansionRange(Call->getArg(3)->getSourceRange())); + txt = "bpf_perf_event_output(" + + skb + ", " + +- "bpf_pseudo_fd(1, " + fd + "), " + ++ "(void *)bpf_pseudo_fd(1, " + fd + "), " + + "((__u64)" + skb_len + " << 32) | BPF_F_CURRENT_CPU, " + + meta + ", " + + meta_len + ");"; +@@ -1006,12 +1006,12 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) { + string keyp = rewriter_.getRewrittenText(expansionRange(Call->getArg(1)->getSourceRange())); + string flag = rewriter_.getRewrittenText(expansionRange(Call->getArg(2)->getSourceRange())); + txt = "bpf_" + string(memb_name) + "(" + ctx + ", " + +- "bpf_pseudo_fd(1, " + fd + "), " + keyp + ", " + flag + ");"; ++ "(void *)bpf_pseudo_fd(1, " + fd + "), " + keyp + ", " + flag + ");"; + } else if (memb_name == "ringbuf_output") { + string name = string(Ref->getDecl()->getName()); + string args = rewriter_.getRewrittenText(expansionRange(SourceRange(GET_BEGINLOC(Call->getArg(0)), + GET_ENDLOC(Call->getArg(2))))); +- txt = "bpf_ringbuf_output(bpf_pseudo_fd(1, " + fd + ")"; ++ txt = "bpf_ringbuf_output((void *)bpf_pseudo_fd(1, " + fd + ")"; + txt += ", " + args + ")"; + + // e.g. +@@ -1033,7 +1033,7 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) { + } else if (memb_name == "ringbuf_reserve") { + string name = string(Ref->getDecl()->getName()); + string arg0 = rewriter_.getRewrittenText(expansionRange(Call->getArg(0)->getSourceRange())); +- txt = "bpf_ringbuf_reserve(bpf_pseudo_fd(1, " + fd + ")"; ++ txt = "bpf_ringbuf_reserve((void *)bpf_pseudo_fd(1, " + fd + ")"; + txt += ", " + arg0 + ", 0)"; // Flags in reserve are meaningless + } else if (memb_name == "ringbuf_discard") { + string name = string(Ref->getDecl()->getName()); +-- +2.38.1 + diff --git a/SOURCES/bcc-0.25.0-Fix-clang-15-int-to-pointer-conversion-errors.patch b/SOURCES/bcc-0.25.0-Fix-clang-15-int-to-pointer-conversion-errors.patch new file mode 100644 index 0000000..6b12079 --- /dev/null +++ b/SOURCES/bcc-0.25.0-Fix-clang-15-int-to-pointer-conversion-errors.patch @@ -0,0 +1,96 @@ +From f5a6c22f613d0566ba542f38f349be379e3844e8 Mon Sep 17 00:00:00 2001 +From: Jerome Marchand +Date: Wed, 26 Oct 2022 14:41:54 +0200 +Subject: [PATCH 2/2] Fix clang 15 int to pointer conversion errors + +Since version 15, clang issues error for implicit conversion of +integer to pointer. Several tools are broken. This patch add explicit +pointer cast where needed. + +Fixes the following errors: +/virtual/main.c:37:18: error: incompatible integer to pointer conversion initializing 'struct request *' with an expression of type 'unsigned long' [-Wint-conversion] + struct request *req = ctx->di; + ^ ~~~~~~~ +/virtual/main.c:49:18: error: incompatible integer to pointer conversion initializing 'struct request *' with an expression of type 'unsigned long' [-Wint-conversion] + struct request *req = ctx->di; + ^ ~~~~~~~ +2 errors generated. + +/virtual/main.c:73:19: error: incompatible integer to pointer conversion initializing 'struct pt_regs *' with an expression of type 'unsigned long' [-Wint-conversion] + struct pt_regs * __ctx = ctx->di; + ^ ~~~~~~~ +/virtual/main.c:100:240: error: incompatible integer to pointer conversion passing 'u64' (aka 'unsigned long long') to parameter of type 'const void *' [-Wint-conversion] + data.ppid = ({ typeof(pid_t) _val; __builtin_memset(&_val, 0, sizeof(_val)); bpf_probe_read(&_val, sizeof(_val), (u64)&({ typeof(struct task_struct *) _val; __builtin_memset(&_val, 0, sizeof(_val)); bpf_probe_read(&_val, sizeof(_val), (u64)&task->real_parent); _val; })->tgid); _val; }); + ^~~~~~~~~~~~~~~~~~~~~~~ +/virtual/main.c:100:118: error: incompatible integer to pointer conversion passing 'u64' (aka 'unsigned long long') to parameter of type 'const void *' [-Wint-conversion] + data.ppid = ({ typeof(pid_t) _val; __builtin_memset(&_val, 0, sizeof(_val)); bpf_probe_read(&_val, sizeof(_val), (u64)&({ typeof(struct task_struct *) _val; __builtin_memset(&_val, 0, sizeof(_val)); bpf_probe_read(&_val, sizeof(_val), (u64)&task->real_parent); _val; })->tgid); _val; }); + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Signed-off-by: Jerome Marchand +--- + src/cc/frontends/clang/b_frontend_action.cc | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/src/cc/frontends/clang/b_frontend_action.cc b/src/cc/frontends/clang/b_frontend_action.cc +index dbeba3e4..c0582464 100644 +--- a/src/cc/frontends/clang/b_frontend_action.cc ++++ b/src/cc/frontends/clang/b_frontend_action.cc +@@ -517,9 +517,9 @@ bool ProbeVisitor::VisitUnaryOperator(UnaryOperator *E) { + string pre, post; + pre = "({ typeof(" + E->getType().getAsString() + ") _val; __builtin_memset(&_val, 0, sizeof(_val));"; + if (cannot_fall_back_safely) +- pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (u64)"; ++ pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (void *)"; + else +- pre += " bpf_probe_read(&_val, sizeof(_val), (u64)"; ++ pre += " bpf_probe_read(&_val, sizeof(_val), (void *)"; + post = "); _val; })"; + rewriter_.ReplaceText(expansionLoc(E->getOperatorLoc()), 1, pre); + rewriter_.InsertTextAfterToken(expansionLoc(GET_ENDLOC(sub)), post); +@@ -581,9 +581,9 @@ bool ProbeVisitor::VisitMemberExpr(MemberExpr *E) { + string pre, post; + pre = "({ typeof(" + E->getType().getAsString() + ") _val; __builtin_memset(&_val, 0, sizeof(_val));"; + if (cannot_fall_back_safely) +- pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (u64)&"; ++ pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (void *)&"; + else +- pre += " bpf_probe_read(&_val, sizeof(_val), (u64)&"; ++ pre += " bpf_probe_read(&_val, sizeof(_val), (void *)&"; + post = rhs + "); _val; })"; + rewriter_.InsertText(expansionLoc(GET_BEGINLOC(E)), pre); + rewriter_.ReplaceText(expansionRange(SourceRange(member, GET_ENDLOC(E))), post); +@@ -635,9 +635,9 @@ bool ProbeVisitor::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { + + pre = "({ typeof(" + E->getType().getAsString() + ") _val; __builtin_memset(&_val, 0, sizeof(_val));"; + if (cannot_fall_back_safely) +- pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (u64)(("; ++ pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (void *)(("; + else +- pre += " bpf_probe_read(&_val, sizeof(_val), (u64)(("; ++ pre += " bpf_probe_read(&_val, sizeof(_val), (void *)(("; + if (isMemberDereference(base)) { + pre += "&"; + // If the base of the array subscript is a member dereference, we'll rewrite +@@ -747,8 +747,8 @@ void BTypeVisitor::genParamDirectAssign(FunctionDecl *D, string& preamble, + arg->addAttr(UnavailableAttr::CreateImplicit(C, "ptregs")); + size_t d = idx - 1; + const char *reg = calling_conv_regs[d]; +- preamble += " " + text + " = " + fn_args_[0]->getName().str() + "->" + +- string(reg) + ";"; ++ preamble += " " + text + " = (" + arg->getType().getAsString() + ")" + ++ fn_args_[0]->getName().str() + "->" + string(reg) + ";"; + } + } + } +@@ -762,7 +762,7 @@ void BTypeVisitor::genParamIndirectAssign(FunctionDecl *D, string& preamble, + + if (idx == 0) { + new_ctx = "__" + arg->getName().str(); +- preamble += " struct pt_regs * " + new_ctx + " = " + ++ preamble += " struct pt_regs * " + new_ctx + " = (void *)" + + arg->getName().str() + "->" + + string(calling_conv_regs[0]) + ";"; + } else { +-- +2.38.1 + diff --git a/SOURCES/bcc-0.25.0-Fix-get_kprobe_functions.patch b/SOURCES/bcc-0.25.0-Fix-get_kprobe_functions.patch new file mode 100644 index 0000000..b3b224f --- /dev/null +++ b/SOURCES/bcc-0.25.0-Fix-get_kprobe_functions.patch @@ -0,0 +1,30 @@ +From c27899b15bca6188d34c0b87b3389eeda2a90cb5 Mon Sep 17 00:00:00 2001 +From: Jerome Marchand +Date: Mon, 9 Jan 2023 18:17:20 +0100 +Subject: [PATCH] Fix get_kprobe_functions + +get_kprobe_functions will not only return a function that matches the +regular expression, but also any function that starts with a +substrings that matches it. This is obviously not the intended +behavior. +The issue is easily fixed by replacing re.match by re.fullmatch. +--- + src/python/bcc/__init__.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/python/bcc/__init__.py b/src/python/bcc/__init__.py +index 7175b98e..970ddcc2 100644 +--- a/src/python/bcc/__init__.py ++++ b/src/python/bcc/__init__.py +@@ -745,7 +745,7 @@ DEBUG_BTF = 0x20 + # Exclude all gcc 8's extra .cold functions + elif re.match(b'^.*\.cold(\.\d+)?$', fn): + continue +- if (t.lower() in [b't', b'w']) and re.match(event_re, fn) \ ++ if (t.lower() in [b't', b'w']) and re.fullmatch(event_re, fn) \ + and fn not in blacklist: + fns.append(fn) + return set(fns) # Some functions may appear more than once +-- +2.38.1 + diff --git a/SOURCES/bcc-0.24.0-Manpages-remove-unstable-statement.patch b/SOURCES/bcc-0.25.0-Manpages-remove-unstable-statement.patch similarity index 93% rename from SOURCES/bcc-0.24.0-Manpages-remove-unstable-statement.patch rename to SOURCES/bcc-0.25.0-Manpages-remove-unstable-statement.patch index 7b60d98..904bff1 100644 --- a/SOURCES/bcc-0.24.0-Manpages-remove-unstable-statement.patch +++ b/SOURCES/bcc-0.25.0-Manpages-remove-unstable-statement.patch @@ -1,7 +1,7 @@ -From 6362a8e023cb53a523ab5a3d11bddcdbe05229fc Mon Sep 17 00:00:00 2001 +From ce407eab95f96badd1879c9c7342eeabcfd17311 Mon Sep 17 00:00:00 2001 From: Jerome Marchand Date: Tue, 6 Aug 2019 14:44:33 +0200 -Subject: [PATCH] Manpages: remove unstable statement +Subject: [PATCH 1/3] Manpages: remove unstable statement The tools are tested before each release. They should be stable enough. @@ -11,6 +11,7 @@ enough. man/man8/bindsnoop.8 | 2 -- man/man8/biolatency.8 | 2 -- man/man8/biolatpcts.8 | 2 -- + man/man8/biopattern.8 | 2 -- man/man8/biosnoop.8 | 2 -- man/man8/biotop.8 | 2 -- man/man8/bitesize.8 | 2 -- @@ -81,6 +82,7 @@ enough. man/man8/syncsnoop.8 | 2 -- man/man8/syscount.8 | 2 -- man/man8/tcpaccept.8 | 2 -- + man/man8/tcpcong.8 | 2 -- man/man8/tcpconnect.8 | 2 -- man/man8/tcpconnlat.8 | 2 -- man/man8/tcpdrop.8 | 2 -- @@ -110,10 +112,10 @@ enough. man/man8/xfsslower.8 | 2 -- man/man8/zfsdist.8 | 2 -- man/man8/zfsslower.8 | 2 -- - 104 files changed, 210 deletions(-) + 106 files changed, 214 deletions(-) diff --git a/man/man8/argdist.8 b/man/man8/argdist.8 -index 3033571b..91f13a33 100644 +index 75b7fe63..99291521 100644 --- a/man/man8/argdist.8 +++ b/man/man8/argdist.8 @@ -191,7 +191,5 @@ Also look in the bcc distribution for a companion _examples.txt file containing @@ -151,17 +153,17 @@ index f8fa1850..05ed95a7 100644 Pavel Dubovitsky .SH SEE ALSO diff --git a/man/man8/biolatency.8 b/man/man8/biolatency.8 -index c13f6c8a..6beef490 100644 +index db2ef484..21c3930e 100644 --- a/man/man8/biolatency.8 +++ b/man/man8/biolatency.8 -@@ -105,8 +105,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -108,8 +108,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux -.SH STABILITY -Unstable - in development. .SH AUTHOR - Brendan Gregg + Brendan Gregg, Rocky Xing .SH SEE ALSO diff --git a/man/man8/biolatpcts.8 b/man/man8/biolatpcts.8 index 7a06a11d..9dd41d08 100644 @@ -176,34 +178,47 @@ index 7a06a11d..9dd41d08 100644 .SH AUTHOR Tejun Heo .SH SEE ALSO +diff --git a/man/man8/biopattern.8 b/man/man8/biopattern.8 +index 451d667f..70ba73e7 100644 +--- a/man/man8/biopattern.8 ++++ b/man/man8/biopattern.8 +@@ -70,8 +70,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing + example usage, output, and commentary for this tool. + .SH OS + Linux +-.SH STABILITY +-Unstable - in development. + .SH AUTHOR + Rocky Xing + .SH SEE ALSO diff --git a/man/man8/biosnoop.8 b/man/man8/biosnoop.8 -index 4c073f76..2b2f7434 100644 +index 24f19edf..06a85757 100644 --- a/man/man8/biosnoop.8 +++ b/man/man8/biosnoop.8 -@@ -79,8 +79,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -82,8 +82,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux -.SH STABILITY -Unstable - in development. .SH AUTHOR - Brendan Gregg + Brendan Gregg, Rocky Xing .SH SEE ALSO diff --git a/man/man8/biotop.8 b/man/man8/biotop.8 -index ed25521f..b00bf68a 100644 +index 47392bc7..ac71d34e 100644 --- a/man/man8/biotop.8 +++ b/man/man8/biotop.8 -@@ -95,8 +95,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -98,8 +98,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux -.SH STABILITY -Unstable - in development. .SH AUTHOR - Brendan Gregg + Brendan Gregg, Rocky Xing .SH INSPIRATION diff --git a/man/man8/bitesize.8 b/man/man8/bitesize.8 -index 99cdbaab..529a1e26 100644 +index 655f69e7..314560b8 100644 --- a/man/man8/bitesize.8 +++ b/man/man8/bitesize.8 @@ -43,8 +43,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing @@ -279,17 +294,17 @@ index 172194d4..575941fc 100644 Allan McAleavy .SH SEE ALSO diff --git a/man/man8/cachetop.8 b/man/man8/cachetop.8 -index 5642fa1d..1fe4067b 100644 +index bb7bb3cc..079b3cbf 100644 --- a/man/man8/cachetop.8 +++ b/man/man8/cachetop.8 -@@ -83,8 +83,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -90,8 +90,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux -.SH STABILITY -Unstable - in development. .SH AUTHOR - Emmanuel Bretelle + Emmanuel Bretelle, Rocky Xing .SH SEE ALSO diff --git a/man/man8/capable.8 b/man/man8/capable.8 index 342946f8..2b7d13ba 100644 @@ -317,17 +332,17 @@ index a2933d7a..c1339579 100644 .SH AUTHOR Wenbo Zhang diff --git a/man/man8/cpudist.8 b/man/man8/cpudist.8 -index b5179102..a7825d64 100644 +index 59937baa..1d6a7198 100644 --- a/man/man8/cpudist.8 +++ b/man/man8/cpudist.8 -@@ -99,8 +99,6 @@ Also look in the bcc distribution for a companion _example.txt file containing +@@ -115,8 +115,6 @@ Also look in the bcc distribution for a companion _example.txt file containing example usage, output, and commentary for this tool. .SH OS Linux -.SH STABILITY -Unstable - in development. .SH AUTHOR - Sasha Goldshtein + Sasha Goldshtein, Rocky Xing .SH SEE ALSO diff --git a/man/man8/cpuunclaimed.8 b/man/man8/cpuunclaimed.8 index 674be499..107ff67b 100644 @@ -433,10 +448,10 @@ index cc61a676..9a0fd3d9 100644 Erwan Velu .SH INSPIRATION diff --git a/man/man8/drsnoop.8 b/man/man8/drsnoop.8 -index 572c0dce..3563da81 100644 +index 90ca901f..64cc1c68 100644 --- a/man/man8/drsnoop.8 +++ b/man/man8/drsnoop.8 -@@ -104,7 +104,5 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -107,7 +107,5 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux @@ -523,7 +538,7 @@ index fe912436..d567986b 100644 Brendan Gregg .SH SEE ALSO diff --git a/man/man8/filetop.8 b/man/man8/filetop.8 -index ba0cbd6e..1f818d68 100644 +index 2d5f191d..6b588ef9 100644 --- a/man/man8/filetop.8 +++ b/man/man8/filetop.8 @@ -111,8 +111,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing @@ -536,7 +551,7 @@ index ba0cbd6e..1f818d68 100644 Brendan Gregg .SH INSPIRATION diff --git a/man/man8/funccount.8 b/man/man8/funccount.8 -index 16ce4fc0..1c7b71c1 100644 +index b2cb8575..9e019d92 100644 --- a/man/man8/funccount.8 +++ b/man/man8/funccount.8 @@ -104,8 +104,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing @@ -549,7 +564,7 @@ index 16ce4fc0..1c7b71c1 100644 Brendan Gregg, Sasha Goldshtein .SH SEE ALSO diff --git a/man/man8/funcinterval.8 b/man/man8/funcinterval.8 -index 8a603998..39be3377 100755 +index 77128290..f76ff315 100644 --- a/man/man8/funcinterval.8 +++ b/man/man8/funcinterval.8 @@ -114,8 +114,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing @@ -562,10 +577,10 @@ index 8a603998..39be3377 100755 Edward Wu .SH SEE ALSO diff --git a/man/man8/funclatency.8 b/man/man8/funclatency.8 -index 3eef805b..22496d18 100644 +index 9012b832..088b26cd 100644 --- a/man/man8/funclatency.8 +++ b/man/man8/funclatency.8 -@@ -130,8 +130,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -131,8 +131,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux @@ -601,17 +616,17 @@ index a9d18e07..876f3983 100644 Brendan Gregg .SH SEE ALSO diff --git a/man/man8/hardirqs.8 b/man/man8/hardirqs.8 -index 12ae6be5..1b38779a 100644 +index aa9afb84..e74d56b3 100644 --- a/man/man8/hardirqs.8 +++ b/man/man8/hardirqs.8 -@@ -88,8 +88,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -95,8 +95,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux -.SH STABILITY -Unstable - in development. .SH AUTHOR - Brendan Gregg, Hengqi Chen + Brendan Gregg, Hengqi Chen, Rocky Xing .SH SEE ALSO diff --git a/man/man8/inject.8 b/man/man8/inject.8 index 2ab80dbb..85b36b6e 100644 @@ -666,10 +681,10 @@ index c0cb4c98..0b56cecc 100644 .SH AUTHOR Fei Li diff --git a/man/man8/llcstat.8 b/man/man8/llcstat.8 -index 36dbed7d..2b554c46 100644 +index 5a28d338..7440fe3b 100644 --- a/man/man8/llcstat.8 +++ b/man/man8/llcstat.8 -@@ -63,8 +63,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -66,8 +66,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux @@ -679,7 +694,7 @@ index 36dbed7d..2b554c46 100644 Teng Qin .SH SEE ALSO diff --git a/man/man8/mdflush.8 b/man/man8/mdflush.8 -index 9d10ca87..3c3b9bba 100644 +index e22c46b3..66939b25 100644 --- a/man/man8/mdflush.8 +++ b/man/man8/mdflush.8 @@ -49,8 +49,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing @@ -781,10 +796,10 @@ index be5387b9..270991d8 100644 Brendan Gregg .SH SEE ALSO diff --git a/man/man8/offwaketime.8 b/man/man8/offwaketime.8 -index 7334b6f8..f0704e92 100644 +index 44e3b684..4f4880e3 100644 --- a/man/man8/offwaketime.8 +++ b/man/man8/offwaketime.8 -@@ -107,8 +107,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -110,8 +110,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux @@ -833,7 +848,7 @@ index 2164ffaf..9d272c81 100644 Brendan Gregg .SH SEE ALSO diff --git a/man/man8/profile.8 b/man/man8/profile.8 -index 30871afe..8523a731 100644 +index 916224a9..6339dbfa 100644 --- a/man/man8/profile.8 +++ b/man/man8/profile.8 @@ -148,8 +148,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing @@ -946,17 +961,17 @@ index cd3ffa27..94432544 100644 -.SH STABILITY -Unstable - in development. diff --git a/man/man8/softirqs.8 b/man/man8/softirqs.8 -index a9a14414..df2fc90b 100644 +index fa475f78..311fd0e6 100644 --- a/man/man8/softirqs.8 +++ b/man/man8/softirqs.8 -@@ -85,8 +85,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -99,8 +99,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux -.SH STABILITY -Unstable - in development. .SH AUTHORS - Brendan Gregg, Sasha Goldshtein + Brendan Gregg, Sasha Goldshtein, Rocky Xing .SH SEE ALSO diff --git a/man/man8/solisten.8 b/man/man8/solisten.8 index 4d8ffe95..fd863447 100644 @@ -982,10 +997,10 @@ index ffad57c5..df80437f 100644 Jiri Olsa .SH SEE ALSO diff --git a/man/man8/sslsniff.8 b/man/man8/sslsniff.8 -index df81664b..1d2749fa 100644 +index 4b80191a..86219f8a 100644 --- a/man/man8/sslsniff.8 +++ b/man/man8/sslsniff.8 -@@ -86,8 +86,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -108,8 +108,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux @@ -1021,10 +1036,10 @@ index c0555043..d1560b3c 100644 Brendan Gregg .SH SEE ALSO diff --git a/man/man8/swapin.8 b/man/man8/swapin.8 -index c5ef1ffc..89600460 100644 +index 9ef2eb9c..7347899d 100644 --- a/man/man8/swapin.8 +++ b/man/man8/swapin.8 -@@ -50,8 +50,6 @@ Also look in the bcc distribution for a companion _examples.txt file +@@ -56,8 +56,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux @@ -1047,17 +1062,17 @@ index 8543f213..cd7b0629 100644 Brendan Gregg .SH SEE ALSO diff --git a/man/man8/syscount.8 b/man/man8/syscount.8 -index d13793be..88343e14 100644 +index 8c245dd8..54f9fe66 100644 --- a/man/man8/syscount.8 +++ b/man/man8/syscount.8 -@@ -102,8 +102,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -108,8 +108,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux -.SH STABILITY -Unstable - in development. .SH AUTHOR - Sasha Goldshtein + Sasha Goldshtein, Rocky Xing .SH SEE ALSO diff --git a/man/man8/tcpaccept.8 b/man/man8/tcpaccept.8 index 05b79693..6dd35301 100644 @@ -1072,6 +1087,19 @@ index 05b79693..6dd35301 100644 .SH AUTHOR Brendan Gregg .SH SEE ALSO +diff --git a/man/man8/tcpcong.8 b/man/man8/tcpcong.8 +index 877ed805..3fd0a253 100644 +--- a/man/man8/tcpcong.8 ++++ b/man/man8/tcpcong.8 +@@ -128,8 +128,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing + example usage, output, and commentary for this tool. + .SH OS + Linux +-.SH STABILITY +-Unstable - in development. + .SH AUTHOR + jacky gan + .SH SEE ALSO diff --git a/man/man8/tcpconnect.8 b/man/man8/tcpconnect.8 index 0ea84686..04952d74 100644 --- a/man/man8/tcpconnect.8 @@ -1138,7 +1166,7 @@ index 0b643d11..aebdab73 100644 Brendan Gregg .SH SEE ALSO diff --git a/man/man8/tcprtt.8 b/man/man8/tcprtt.8 -index 1ed32d6e..4ccf88e0 100644 +index fcd8bfe9..4ee6b8b5 100644 --- a/man/man8/tcprtt.8 +++ b/man/man8/tcprtt.8 @@ -95,8 +95,6 @@ Also look in the bcc distribution for a companion _examples.txt file containing @@ -1241,10 +1269,10 @@ index da5edf37..f7e459da 100644 .SH AUTHOR Sasha Goldshtein diff --git a/man/man8/trace.8 b/man/man8/trace.8 -index acfff58f..17aa20bc 100644 +index c4417e5f..bd1b11b2 100644 --- a/man/man8/trace.8 +++ b/man/man8/trace.8 -@@ -216,7 +216,5 @@ Also look in the bcc distribution for a companion _examples.txt file containing +@@ -217,7 +217,5 @@ Also look in the bcc distribution for a companion _examples.txt file containing example usage, output, and commentary for this tool. .SH OS Linux @@ -1448,5 +1476,5 @@ index d1e2f9c1..31d382f6 100644 Brendan Gregg .SH SEE ALSO -- -2.35.3 +2.38.1 diff --git a/SOURCES/bcc-0.25.0-RHEL-libbpf-version-fixes.patch b/SOURCES/bcc-0.25.0-RHEL-libbpf-version-fixes.patch new file mode 100644 index 0000000..fa08b57 --- /dev/null +++ b/SOURCES/bcc-0.25.0-RHEL-libbpf-version-fixes.patch @@ -0,0 +1,684 @@ +From 66d9bffa99738bbed50b3d5b2d87990cdb5e4a58 Mon Sep 17 00:00:00 2001 +From: Jerome Marchand +Date: Mon, 28 Nov 2022 12:23:59 +0100 +Subject: [PATCH] RHEL: libbpf version fixes + +Revert "[bcc] stop using deprecated `bpf_load_program_attr`" +Revert "backport `struct bpf_create_map_attr`" +Revert "bcc: Replace deprecated libbpf API" + +Revert "bcc: Replace deprecated libbpf APIs" since the libbpf version +provided in RHEL 8 doesn't provide the new APIs. + +Remove BPF_MAP_TYPE_BLOOM_FILTER from bps since the libbpf version in +RHEL 8, doesn't provide bloom filter map. + +Rename btf__load_vmlinux_btf into libbpf_find_kernel_btf. The function +has been renamed upstream for naming consistency, but RHEL 8 libbpf +still uses the old name. + +Also use the older btf__get_nr_types() instead of btf__type_cnt() for +the same reason. + +Add definition of struct bpf_core_relo. +--- + introspection/bps.c | 1 - + libbpf-tools/ksnoop.c | 4 +- + src/cc/bcc_btf.cc | 73 +++++++++++++++- + src/cc/bpf_module.cc | 38 ++++---- + src/cc/common.cc | 4 +- + src/cc/libbpf.c | 196 +++++++++++++++--------------------------- + src/cc/libbpf.h | 28 ++---- + 7 files changed, 169 insertions(+), 175 deletions(-) + +diff --git a/introspection/bps.c b/introspection/bps.c +index 232b23d4..6ec02e6c 100644 +--- a/introspection/bps.c ++++ b/introspection/bps.c +@@ -80,7 +80,6 @@ static const char * const map_type_strings[] = { + [BPF_MAP_TYPE_RINGBUF] = "ringbuf", + [BPF_MAP_TYPE_INODE_STORAGE] = "inode_storage", + [BPF_MAP_TYPE_TASK_STORAGE] = "task_storage", +- [BPF_MAP_TYPE_BLOOM_FILTER] = "bloom_filter", + }; + + #define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) +diff --git a/libbpf-tools/ksnoop.c b/libbpf-tools/ksnoop.c +index 87fe175c..960e901b 100644 +--- a/libbpf-tools/ksnoop.c ++++ b/libbpf-tools/ksnoop.c +@@ -347,7 +347,7 @@ static struct btf *get_btf(const char *name) + name && strlen(name) > 0 ? name : "vmlinux"); + + if (!vmlinux_btf) { +- vmlinux_btf = btf__load_vmlinux_btf(); ++ vmlinux_btf = libbpf_find_kernel_btf(); + if (!vmlinux_btf) { + err = -errno; + p_err("No BTF, cannot determine type info: %s", strerror(-err)); +@@ -357,7 +357,7 @@ static struct btf *get_btf(const char *name) + if (!name || strlen(name) == 0) + return vmlinux_btf; + +- mod_btf = btf__load_module_btf(name, vmlinux_btf); ++ mod_btf = libbpf_find_kernel_btf(name, vmlinux_btf); + if (!mod_btf) { + err = -errno; + p_err("No BTF for module '%s': %s", name, strerror(-err)); +diff --git a/src/cc/bcc_btf.cc b/src/cc/bcc_btf.cc +index be248612..74fc902c 100644 +--- a/src/cc/bcc_btf.cc ++++ b/src/cc/bcc_btf.cc +@@ -170,6 +170,77 @@ static int btf_ext_setup_line_info(struct btf_ext *btf_ext) + return btf_ext_setup_info(btf_ext, ¶m); + } + ++/* bpf_core_relo_kind encodes which aspect of captured field/type/enum value ++ * has to be adjusted by relocations. ++ */ ++enum bpf_core_relo_kind { ++ BPF_FIELD_BYTE_OFFSET = 0, /* field byte offset */ ++ BPF_FIELD_BYTE_SIZE = 1, /* field size in bytes */ ++ BPF_FIELD_EXISTS = 2, /* field existence in target kernel */ ++ BPF_FIELD_SIGNED = 3, /* field signedness (0 - unsigned, 1 - signed) */ ++ BPF_FIELD_LSHIFT_U64 = 4, /* bitfield-specific left bitshift */ ++ BPF_FIELD_RSHIFT_U64 = 5, /* bitfield-specific right bitshift */ ++ BPF_TYPE_ID_LOCAL = 6, /* type ID in local BPF object */ ++ BPF_TYPE_ID_TARGET = 7, /* type ID in target kernel */ ++ BPF_TYPE_EXISTS = 8, /* type existence in target kernel */ ++ BPF_TYPE_SIZE = 9, /* type size in bytes */ ++ BPF_ENUMVAL_EXISTS = 10, /* enum value existence in target kernel */ ++ BPF_ENUMVAL_VALUE = 11, /* enum value integer value */ ++}; ++ ++/* The minimum bpf_core_relo checked by the loader ++ * ++ * CO-RE relocation captures the following data: ++ * - insn_off - instruction offset (in bytes) within a BPF program that needs ++ * its insn->imm field to be relocated with actual field info; ++ * - type_id - BTF type ID of the "root" (containing) entity of a relocatable ++ * type or field; ++ * - access_str_off - offset into corresponding .BTF string section. String ++ * interpretation depends on specific relocation kind: ++ * - for field-based relocations, string encodes an accessed field using ++ * a sequence of field and array indices, separated by colon (:). It's ++ * conceptually very close to LLVM's getelementptr ([0]) instruction's ++ * arguments for identifying offset to a field. ++ * - for type-based relocations, strings is expected to be just "0"; ++ * - for enum value-based relocations, string contains an index of enum ++ * value within its enum type; ++ * ++ * Example to provide a better feel. ++ * ++ * struct sample { ++ * int a; ++ * struct { ++ * int b[10]; ++ * }; ++ * }; ++ * ++ * struct sample *s = ...; ++ * int x = &s->a; // encoded as "0:0" (a is field #0) ++ * int y = &s->b[5]; // encoded as "0:1:0:5" (anon struct is field #1, ++ * // b is field #0 inside anon struct, accessing elem #5) ++ * int z = &s[10]->b; // encoded as "10:1" (ptr is used as an array) ++ * ++ * type_id for all relocs in this example will capture BTF type id of ++ * `struct sample`. ++ * ++ * Such relocation is emitted when using __builtin_preserve_access_index() ++ * Clang built-in, passing expression that captures field address, e.g.: ++ * ++ * bpf_probe_read(&dst, sizeof(dst), ++ * __builtin_preserve_access_index(&src->a.b.c)); ++ * ++ * In this case Clang will emit field relocation recording necessary data to ++ * be able to find offset of embedded `a.b.c` field within `src` struct. ++ * ++ * [0] https://llvm.org/docs/LangRef.html#getelementptr-instruction ++ */ ++struct bpf_core_relo { ++ __u32 insn_off; ++ __u32 type_id; ++ __u32 access_str_off; ++ enum bpf_core_relo_kind kind; ++}; ++ + static int btf_ext_setup_core_relos(struct btf_ext *btf_ext) + { + struct btf_ext_sec_setup_param param = { +@@ -597,7 +668,7 @@ int BTF::load(uint8_t *btf_sec, uintptr_t btf_sec_size, + return -1; + } + +- if (btf__load_into_kernel(btf)) { ++ if (btf__load(btf)) { + btf__free(btf); + warning("Loading .BTF section failed\n"); + return -1; +diff --git a/src/cc/bpf_module.cc b/src/cc/bpf_module.cc +index 86f6a228..490fffe8 100644 +--- a/src/cc/bpf_module.cc ++++ b/src/cc/bpf_module.cc +@@ -407,7 +407,7 @@ int BPFModule::create_maps(std::map> &map_tids, + } + + if (pinned_id <= 0) { +- struct bcc_create_map_attr attr = {}; ++ struct bpf_create_map_attr attr = {}; + attr.map_type = (enum bpf_map_type)map_type; + attr.name = map_name; + attr.key_size = key_size; +@@ -982,22 +982,26 @@ int BPFModule::bcc_func_load(int prog_type, const char *name, + const char *license, unsigned kern_version, + int log_level, char *log_buf, unsigned log_buf_size, + const char *dev_name, unsigned flags, int expected_attach_type) { +- struct bpf_prog_load_opts opts = {}; ++ struct bpf_load_program_attr attr = {}; + unsigned func_info_cnt, line_info_cnt, finfo_rec_size, linfo_rec_size; + void *func_info = NULL, *line_info = NULL; + int ret; + ++ attr.prog_type = (enum bpf_prog_type)prog_type; + if (expected_attach_type != -1) { +- opts.expected_attach_type = (enum bpf_attach_type)expected_attach_type; ++ attr.expected_attach_type = (enum bpf_attach_type)expected_attach_type; + } +- if (prog_type != BPF_PROG_TYPE_TRACING && +- prog_type != BPF_PROG_TYPE_EXT) { +- opts.kern_version = kern_version; ++ attr.name = name; ++ attr.insns = insns; ++ attr.license = license; ++ if (attr.prog_type != BPF_PROG_TYPE_TRACING && ++ attr.prog_type != BPF_PROG_TYPE_EXT) { ++ attr.kern_version = kern_version; + } +- opts.prog_flags = flags; +- opts.log_level = log_level; ++ attr.prog_flags = flags; ++ attr.log_level = log_level; + if (dev_name) +- opts.prog_ifindex = if_nametoindex(dev_name); ++ attr.prog_ifindex = if_nametoindex(dev_name); + + if (btf_) { + int btf_fd = btf_->get_fd(); +@@ -1008,17 +1012,17 @@ int BPFModule::bcc_func_load(int prog_type, const char *name, + &finfo_rec_size, &line_info, + &line_info_cnt, &linfo_rec_size); + if (!ret) { +- opts.prog_btf_fd = btf_fd; +- opts.func_info = func_info; +- opts.func_info_cnt = func_info_cnt; +- opts.func_info_rec_size = finfo_rec_size; +- opts.line_info = line_info; +- opts.line_info_cnt = line_info_cnt; +- opts.line_info_rec_size = linfo_rec_size; ++ attr.prog_btf_fd = btf_fd; ++ attr.func_info = func_info; ++ attr.func_info_cnt = func_info_cnt; ++ attr.func_info_rec_size = finfo_rec_size; ++ attr.line_info = line_info; ++ attr.line_info_cnt = line_info_cnt; ++ attr.line_info_rec_size = linfo_rec_size; + } + } + +- ret = bcc_prog_load_xattr((enum bpf_prog_type)prog_type, name, license, insns, &opts, prog_len, log_buf, log_buf_size, allow_rlimit_); ++ ret = bcc_prog_load_xattr(&attr, prog_len, log_buf, log_buf_size, allow_rlimit_); + if (btf_) { + free(func_info); + free(line_info); +diff --git a/src/cc/common.cc b/src/cc/common.cc +index 3143adb0..11970275 100644 +--- a/src/cc/common.cc ++++ b/src/cc/common.cc +@@ -34,11 +34,11 @@ using std::experimental::optional; + static optional get_enum_val_from_btf(const char *name) { + optional val; + +- auto btf = btf__load_vmlinux_btf(); ++ auto btf = libbpf_find_kernel_btf(); + if (libbpf_get_error(btf)) + return {}; + +- for (size_t i = 1; i < btf__type_cnt(btf); i++) { ++ for (size_t i = 1; i <= btf__get_nr_types(btf); i++) { + auto t = btf__type_by_id(btf, i); + if (btf_kind(t) != BTF_KIND_ENUM) + continue; +diff --git a/src/cc/libbpf.c b/src/cc/libbpf.c +index 0c09f9b3..7042c792 100644 +--- a/src/cc/libbpf.c ++++ b/src/cc/libbpf.c +@@ -319,33 +319,14 @@ static uint64_t ptr_to_u64(void *ptr) + return (uint64_t) (unsigned long) ptr; + } + +-static int libbpf_bpf_map_create(struct bcc_create_map_attr *create_attr) +-{ +- LIBBPF_OPTS(bpf_map_create_opts, p); +- +- p.map_flags = create_attr->map_flags; +- p.numa_node = create_attr->numa_node; +- p.btf_fd = create_attr->btf_fd; +- p.btf_key_type_id = create_attr->btf_key_type_id; +- p.btf_value_type_id = create_attr->btf_value_type_id; +- p.map_ifindex = create_attr->map_ifindex; +- if (create_attr->map_type == BPF_MAP_TYPE_STRUCT_OPS) +- p.btf_vmlinux_value_type_id = create_attr->btf_vmlinux_value_type_id; +- else +- p.inner_map_fd = create_attr->inner_map_fd; +- +- return bpf_map_create(create_attr->map_type, create_attr->name, create_attr->key_size, +- create_attr->value_size, create_attr->max_entries, &p); +-} +- +-int bcc_create_map_xattr(struct bcc_create_map_attr *attr, bool allow_rlimit) ++int bcc_create_map_xattr(struct bpf_create_map_attr *attr, bool allow_rlimit) + { + unsigned name_len = attr->name ? strlen(attr->name) : 0; + char map_name[BPF_OBJ_NAME_LEN] = {}; + + memcpy(map_name, attr->name, min(name_len, BPF_OBJ_NAME_LEN - 1)); + attr->name = map_name; +- int ret = libbpf_bpf_map_create(attr); ++ int ret = bpf_create_map_xattr(attr); + + if (ret < 0 && errno == EPERM) { + if (!allow_rlimit) +@@ -357,7 +338,7 @@ int bcc_create_map_xattr(struct bcc_create_map_attr *attr, bool allow_rlimit) + rl.rlim_max = RLIM_INFINITY; + rl.rlim_cur = rl.rlim_max; + if (setrlimit(RLIMIT_MEMLOCK, &rl) == 0) +- ret = libbpf_bpf_map_create(attr); ++ ret = bpf_create_map_xattr(attr); + } + } + +@@ -367,12 +348,12 @@ int bcc_create_map_xattr(struct bcc_create_map_attr *attr, bool allow_rlimit) + attr->btf_fd = 0; + attr->btf_key_type_id = 0; + attr->btf_value_type_id = 0; +- ret = libbpf_bpf_map_create(attr); ++ ret = bpf_create_map_xattr(attr); + } + + if (ret < 0 && name_len && (errno == E2BIG || errno == EINVAL)) { + map_name[0] = '\0'; +- ret = libbpf_bpf_map_create(attr); ++ ret = bpf_create_map_xattr(attr); + } + + if (ret < 0 && errno == EPERM) { +@@ -385,7 +366,7 @@ int bcc_create_map_xattr(struct bcc_create_map_attr *attr, bool allow_rlimit) + rl.rlim_max = RLIM_INFINITY; + rl.rlim_cur = rl.rlim_max; + if (setrlimit(RLIMIT_MEMLOCK, &rl) == 0) +- ret = libbpf_bpf_map_create(attr); ++ ret = bpf_create_map_xattr(attr); + } + } + return ret; +@@ -395,7 +376,7 @@ int bcc_create_map(enum bpf_map_type map_type, const char *name, + int key_size, int value_size, + int max_entries, int map_flags) + { +- struct bcc_create_map_attr attr = {}; ++ struct bpf_create_map_attr attr = {}; + + attr.map_type = map_type; + attr.name = name; +@@ -644,70 +625,24 @@ int bpf_prog_get_tag(int fd, unsigned long long *ptag) + return -2; + } + +-static int libbpf_bpf_prog_load(enum bpf_prog_type prog_type, +- const char *prog_name, const char *license, +- const struct bpf_insn *insns, size_t insn_cnt, +- struct bpf_prog_load_opts *opts, +- char *log_buf, size_t log_buf_sz) +-{ +- +- LIBBPF_OPTS(bpf_prog_load_opts, p); +- +- if (!opts || !log_buf != !log_buf_sz) { +- errno = EINVAL; +- return -EINVAL; +- } +- +- p.expected_attach_type = opts->expected_attach_type; +- switch (prog_type) { +- case BPF_PROG_TYPE_STRUCT_OPS: +- case BPF_PROG_TYPE_LSM: +- p.attach_btf_id = opts->attach_btf_id; +- break; +- case BPF_PROG_TYPE_TRACING: +- case BPF_PROG_TYPE_EXT: +- p.attach_btf_id = opts->attach_btf_id; +- p.attach_prog_fd = opts->attach_prog_fd; +- break; +- default: +- p.prog_ifindex = opts->prog_ifindex; +- p.kern_version = opts->kern_version; +- } +- p.log_level = opts->log_level; +- p.log_buf = log_buf; +- p.log_size = log_buf_sz; +- p.prog_btf_fd = opts->prog_btf_fd; +- p.func_info_rec_size = opts->func_info_rec_size; +- p.func_info_cnt = opts->func_info_cnt; +- p.func_info = opts->func_info; +- p.line_info_rec_size = opts->line_info_rec_size; +- p.line_info_cnt = opts->line_info_cnt; +- p.line_info = opts->line_info; +- p.prog_flags = opts->prog_flags; +- +- return bpf_prog_load(prog_type, prog_name, license, +- insns, insn_cnt, &p); +-} +- +-int bcc_prog_load_xattr(enum bpf_prog_type prog_type, const char *prog_name, +- const char *license, const struct bpf_insn *insns, +- struct bpf_prog_load_opts *opts, int prog_len, ++int bcc_prog_load_xattr(struct bpf_load_program_attr *attr, int prog_len, + char *log_buf, unsigned log_buf_size, bool allow_rlimit) + { +- unsigned name_len = prog_name ? strlen(prog_name) : 0; +- char *tmp_log_buf = NULL, *opts_log_buf = NULL; +- unsigned tmp_log_buf_size = 0, opts_log_buf_size = 0; ++ unsigned name_len = attr->name ? strlen(attr->name) : 0; ++ char *tmp_log_buf = NULL, *attr_log_buf = NULL; ++ unsigned tmp_log_buf_size = 0, attr_log_buf_size = 0; + int ret = 0, name_offset = 0, expected_attach_type = 0; +- char new_prog_name[BPF_OBJ_NAME_LEN] = {}; ++ char prog_name[BPF_OBJ_NAME_LEN] = {}; + + unsigned insns_cnt = prog_len / sizeof(struct bpf_insn); ++ attr->insns_cnt = insns_cnt; + +- if (opts->log_level > 0) { ++ if (attr->log_level > 0) { + if (log_buf_size > 0) { + // Use user-provided log buffer if available. + log_buf[0] = 0; +- opts_log_buf = log_buf; +- opts_log_buf_size = log_buf_size; ++ attr_log_buf = log_buf; ++ attr_log_buf_size = log_buf_size; + } else { + // Create and use temporary log buffer if user didn't provide one. + tmp_log_buf_size = LOG_BUF_SIZE; +@@ -715,82 +650,82 @@ int bcc_prog_load_xattr(enum bpf_prog_type prog_type, const char *prog_name, + if (!tmp_log_buf) { + fprintf(stderr, "bpf: Failed to allocate temporary log buffer: %s\n\n", + strerror(errno)); +- opts->log_level = 0; ++ attr->log_level = 0; + } else { + tmp_log_buf[0] = 0; +- opts_log_buf = tmp_log_buf; +- opts_log_buf_size = tmp_log_buf_size; ++ attr_log_buf = tmp_log_buf; ++ attr_log_buf_size = tmp_log_buf_size; + } + } + } + +- + if (name_len) { +- if (strncmp(prog_name, "kprobe__", 8) == 0) ++ if (strncmp(attr->name, "kprobe__", 8) == 0) + name_offset = 8; +- else if (strncmp(prog_name, "kretprobe__", 11) == 0) ++ else if (strncmp(attr->name, "kretprobe__", 11) == 0) + name_offset = 11; +- else if (strncmp(prog_name, "tracepoint__", 12) == 0) ++ else if (strncmp(attr->name, "tracepoint__", 12) == 0) + name_offset = 12; +- else if (strncmp(prog_name, "raw_tracepoint__", 16) == 0) ++ else if (strncmp(attr->name, "raw_tracepoint__", 16) == 0) + name_offset = 16; +- else if (strncmp(prog_name, "kfunc__", 7) == 0) { ++ else if (strncmp(attr->name, "kfunc__", 7) == 0) { + name_offset = 7; + expected_attach_type = BPF_TRACE_FENTRY; +- } else if (strncmp(prog_name, "kmod_ret__", 10) == 0) { ++ } else if (strncmp(attr->name, "kmod_ret__", 10) == 0) { + name_offset = 10; + expected_attach_type = BPF_MODIFY_RETURN; +- } else if (strncmp(prog_name, "kretfunc__", 10) == 0) { ++ } else if (strncmp(attr->name, "kretfunc__", 10) == 0) { + name_offset = 10; + expected_attach_type = BPF_TRACE_FEXIT; +- } else if (strncmp(prog_name, "lsm__", 5) == 0) { ++ } else if (strncmp(attr->name, "lsm__", 5) == 0) { + name_offset = 5; + expected_attach_type = BPF_LSM_MAC; +- } else if (strncmp(prog_name, "bpf_iter__", 10) == 0) { ++ } else if (strncmp(attr->name, "bpf_iter__", 10) == 0) { + name_offset = 10; + expected_attach_type = BPF_TRACE_ITER; + } + +- if (prog_type == BPF_PROG_TYPE_TRACING || +- prog_type == BPF_PROG_TYPE_LSM) { +- ret = libbpf_find_vmlinux_btf_id(prog_name + name_offset, ++ if (attr->prog_type == BPF_PROG_TYPE_TRACING || ++ attr->prog_type == BPF_PROG_TYPE_LSM) { ++ ret = libbpf_find_vmlinux_btf_id(attr->name + name_offset, + expected_attach_type); + if (ret == -EINVAL) { + fprintf(stderr, "bpf: vmlinux BTF is not found\n"); + return ret; + } else if (ret < 0) { + fprintf(stderr, "bpf: %s is not found in vmlinux BTF\n", +- prog_name + name_offset); ++ attr->name + name_offset); + return ret; + } + +- opts->attach_btf_id = ret; +- opts->expected_attach_type = expected_attach_type; ++ attr->attach_btf_id = ret; ++ attr->expected_attach_type = expected_attach_type; + } + +- memcpy(new_prog_name, prog_name + name_offset, ++ memcpy(prog_name, attr->name + name_offset, + min(name_len - name_offset, BPF_OBJ_NAME_LEN - 1)); ++ attr->name = prog_name; + } + +- ret = libbpf_bpf_prog_load(prog_type, new_prog_name, license, insns, insns_cnt, opts, opts_log_buf, opts_log_buf_size); ++ ret = bpf_load_program_xattr(attr, attr_log_buf, attr_log_buf_size); + + // func_info/line_info may not be supported in old kernels. +- if (ret < 0 && opts->func_info && errno == EINVAL) { +- opts->prog_btf_fd = 0; +- opts->func_info = NULL; +- opts->func_info_cnt = 0; +- opts->func_info_rec_size = 0; +- opts->line_info = NULL; +- opts->line_info_cnt = 0; +- opts->line_info_rec_size = 0; +- ret = libbpf_bpf_prog_load(prog_type, new_prog_name, license, insns, insns_cnt, opts, opts_log_buf, opts_log_buf_size); ++ if (ret < 0 && attr->func_info && errno == EINVAL) { ++ attr->prog_btf_fd = 0; ++ attr->func_info = NULL; ++ attr->func_info_cnt = 0; ++ attr->func_info_rec_size = 0; ++ attr->line_info = NULL; ++ attr->line_info_cnt = 0; ++ attr->line_info_rec_size = 0; ++ ret = bpf_load_program_xattr(attr, attr_log_buf, attr_log_buf_size); + } + + // BPF object name is not supported on older Kernels. + // If we failed due to this, clear the name and try again. + if (ret < 0 && name_len && (errno == E2BIG || errno == EINVAL)) { +- new_prog_name[0] = '\0'; +- ret = libbpf_bpf_prog_load(prog_type, new_prog_name, license, insns, insns_cnt, opts, opts_log_buf, opts_log_buf_size); ++ prog_name[0] = '\0'; ++ ret = bpf_load_program_xattr(attr, attr_log_buf, attr_log_buf_size); + } + + if (ret < 0 && errno == EPERM) { +@@ -809,14 +744,14 @@ int bcc_prog_load_xattr(enum bpf_prog_type prog_type, const char *prog_name, + rl.rlim_max = RLIM_INFINITY; + rl.rlim_cur = rl.rlim_max; + if (setrlimit(RLIMIT_MEMLOCK, &rl) == 0) +- ret = libbpf_bpf_prog_load(prog_type, new_prog_name, license, insns, insns_cnt, opts, opts_log_buf, opts_log_buf_size); ++ ret = bpf_load_program_xattr(attr, attr_log_buf, attr_log_buf_size); + } + } + + if (ret < 0 && errno == E2BIG) { + fprintf(stderr, + "bpf: %s. Program %s too large (%u insns), at most %d insns\n\n", +- strerror(errno), new_prog_name, insns_cnt, BPF_MAXINSNS); ++ strerror(errno), attr->name, insns_cnt, BPF_MAXINSNS); + return -1; + } + +@@ -825,9 +760,9 @@ int bcc_prog_load_xattr(enum bpf_prog_type prog_type, const char *prog_name, + // User has provided a log buffer. + if (log_buf_size) { + // If logging is not already enabled, enable it and do the syscall again. +- if (opts->log_level == 0) { +- opts->log_level = 1; +- ret = libbpf_bpf_prog_load(prog_type, new_prog_name, license, insns, insns_cnt, opts, log_buf, log_buf_size); ++ if (attr->log_level == 0) { ++ attr->log_level = 1; ++ ret = bpf_load_program_xattr(attr, log_buf, log_buf_size); + } + // Print the log message and return. + bpf_print_hints(ret, log_buf); +@@ -841,8 +776,8 @@ int bcc_prog_load_xattr(enum bpf_prog_type prog_type, const char *prog_name, + if (tmp_log_buf) + free(tmp_log_buf); + tmp_log_buf_size = LOG_BUF_SIZE; +- if (opts->log_level == 0) +- opts->log_level = 1; ++ if (attr->log_level == 0) ++ attr->log_level = 1; + for (;;) { + tmp_log_buf = malloc(tmp_log_buf_size); + if (!tmp_log_buf) { +@@ -851,7 +786,7 @@ int bcc_prog_load_xattr(enum bpf_prog_type prog_type, const char *prog_name, + goto return_result; + } + tmp_log_buf[0] = 0; +- ret = libbpf_bpf_prog_load(prog_type, new_prog_name, license, insns, insns_cnt, opts, tmp_log_buf, tmp_log_buf_size); ++ ret = bpf_load_program_xattr(attr, tmp_log_buf, tmp_log_buf_size); + if (ret < 0 && errno == ENOSPC) { + // Temporary buffer size is not enough. Double it and try again. + free(tmp_log_buf); +@@ -865,7 +800,7 @@ int bcc_prog_load_xattr(enum bpf_prog_type prog_type, const char *prog_name, + + // Check if we should print the log message if log_level is not 0, + // either specified by user or set due to error. +- if (opts->log_level > 0) { ++ if (attr->log_level > 0) { + // Don't print if user enabled logging and provided log buffer, + // but there is no error. + if (log_buf && ret < 0) +@@ -885,13 +820,16 @@ int bcc_prog_load(enum bpf_prog_type prog_type, const char *name, + const char *license, unsigned kern_version, + int log_level, char *log_buf, unsigned log_buf_size) + { +- struct bpf_prog_load_opts opts = {}; +- ++ struct bpf_load_program_attr attr = {}; + ++ attr.prog_type = prog_type; ++ attr.name = name; ++ attr.insns = insns; ++ attr.license = license; + if (prog_type != BPF_PROG_TYPE_TRACING && prog_type != BPF_PROG_TYPE_EXT) +- opts.kern_version = kern_version; +- opts.log_level = log_level; +- return bcc_prog_load_xattr(prog_type, name, license, insns, &opts, prog_len, log_buf, log_buf_size, true); ++ attr.kern_version = kern_version; ++ attr.log_level = log_level; ++ return bcc_prog_load_xattr(&attr, prog_len, log_buf, log_buf_size, true); + } + + int bpf_open_raw_sock(const char *name) +@@ -1388,7 +1326,7 @@ int kernel_struct_has_field(const char *struct_name, const char *field_name) + struct btf *btf; + int i, ret, btf_id; + +- btf = btf__load_vmlinux_btf(); ++ btf = libbpf_find_kernel_btf(); + ret = libbpf_get_error(btf); + if (ret) + return -1; +@@ -1565,7 +1503,7 @@ int bpf_attach_xdp(const char *dev_name, int progfd, uint32_t flags) { + return -1; + } + +- ret = bpf_xdp_attach(ifindex, progfd, flags, NULL); ++ ret = bpf_set_link_xdp_fd(ifindex, progfd, flags); + if (ret) { + libbpf_strerror(ret, err_buf, sizeof(err_buf)); + fprintf(stderr, "bpf: Attaching prog to %s: %s\n", dev_name, err_buf); +diff --git a/src/cc/libbpf.h b/src/cc/libbpf.h +index dd86f0a9..e001d740 100644 +--- a/src/cc/libbpf.h ++++ b/src/cc/libbpf.h +@@ -27,25 +27,8 @@ + extern "C" { + #endif + +-struct bcc_create_map_attr { +- const char *name; +- enum bpf_map_type map_type; +- __u32 map_flags; +- __u32 key_size; +- __u32 value_size; +- __u32 max_entries; +- __u32 numa_node; +- __u32 btf_fd; +- __u32 btf_key_type_id; +- __u32 btf_value_type_id; +- __u32 map_ifindex; +- union { +- __u32 inner_map_fd; +- __u32 btf_vmlinux_value_type_id; +- }; +-}; +- +-struct bpf_prog_load_opts; ++struct bpf_create_map_attr; ++struct bpf_load_program_attr; + + enum bpf_probe_attach_type { + BPF_PROBE_ENTRY, +@@ -61,7 +44,7 @@ struct bcc_perf_buffer_opts { + int bcc_create_map(enum bpf_map_type map_type, const char *name, + int key_size, int value_size, int max_entries, + int map_flags); +-int bcc_create_map_xattr(struct bcc_create_map_attr *attr, bool allow_rlimit); ++int bcc_create_map_xattr(struct bpf_create_map_attr *attr, bool allow_rlimit); + int bpf_update_elem(int fd, void *key, void *value, unsigned long long flags); + int bpf_lookup_elem(int fd, void *key, void *value); + int bpf_delete_elem(int fd, void *key); +@@ -89,11 +72,10 @@ int bcc_prog_load(enum bpf_prog_type prog_type, const char *name, + const struct bpf_insn *insns, int prog_len, + const char *license, unsigned kern_version, + int log_level, char *log_buf, unsigned log_buf_size); +-int bcc_prog_load_xattr(enum bpf_prog_type prog_type, const char *prog_name, +- const char *license, const struct bpf_insn *insns, +- struct bpf_prog_load_opts *opts, ++int bcc_prog_load_xattr(struct bpf_load_program_attr *attr, + int prog_len, char *log_buf, + unsigned log_buf_size, bool allow_rlimit); ++ + int bpf_attach_socket(int sockfd, int progfd); + + /* create RAW socket. If name is not NULL/a non-empty null-terminated string, +-- +2.38.1 + diff --git a/SOURCES/bcc-0.25.0-Revert-tools-tcpaccept-Fix-support-for-v5.6-kernels.patch b/SOURCES/bcc-0.25.0-Revert-tools-tcpaccept-Fix-support-for-v5.6-kernels.patch new file mode 100644 index 0000000..1c31ae9 --- /dev/null +++ b/SOURCES/bcc-0.25.0-Revert-tools-tcpaccept-Fix-support-for-v5.6-kernels.patch @@ -0,0 +1,42 @@ +From acee5d39d24b102e8ed09a242cb1c53246a1fb7f Mon Sep 17 00:00:00 2001 +From: Jerome Marchand +Date: Tue, 29 Nov 2022 15:33:49 +0100 +Subject: [PATCH] Revert "tools/tcpaccept: Fix support for v5.6+ kernels" + +This reverts commit 28955512d991ee3849c2a9accfc54bef9cd35f21. + +It breaks tcpaccept on RHEL 8 kernel. +--- + tools/tcpaccept.py | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +diff --git a/tools/tcpaccept.py b/tools/tcpaccept.py +index b2ace4fa..d3e44143 100755 +--- a/tools/tcpaccept.py ++++ b/tools/tcpaccept.py +@@ -116,7 +116,7 @@ int kretprobe__inet_csk_accept(struct pt_regs *ctx) + return 0; + + // check this is TCP +- u16 protocol = 0; ++ u8 protocol = 0; + // workaround for reading the sk_protocol bitfield: + + // Following comments add by Joe Yin: +@@ -132,12 +132,7 @@ int kretprobe__inet_csk_accept(struct pt_regs *ctx) + int gso_max_segs_offset = offsetof(struct sock, sk_gso_max_segs); + int sk_lingertime_offset = offsetof(struct sock, sk_lingertime); + +- +- // Since kernel v5.6 sk_protocol is its own u16 field and gso_max_segs +- // precedes sk_lingertime. +- if (sk_lingertime_offset - gso_max_segs_offset == 2) +- protocol = newsk->sk_protocol; +- else if (sk_lingertime_offset - gso_max_segs_offset == 4) ++ if (sk_lingertime_offset - gso_max_segs_offset == 4) + // 4.10+ with little endian + #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + protocol = *(u8 *)((u64)&newsk->sk_gso_max_segs - 3); +-- +2.38.1 + diff --git a/SOURCES/bcc-0.24.0-libbpf-Allow-kernel_struct_has_field-to-reach-field-.patch b/SOURCES/bcc-0.25.0-libbpf-Allow-kernel_struct_has_field-to-reach-field-.patch similarity index 72% rename from SOURCES/bcc-0.24.0-libbpf-Allow-kernel_struct_has_field-to-reach-field-.patch rename to SOURCES/bcc-0.25.0-libbpf-Allow-kernel_struct_has_field-to-reach-field-.patch index 9f58ae0..66baec5 100644 --- a/SOURCES/bcc-0.24.0-libbpf-Allow-kernel_struct_has_field-to-reach-field-.patch +++ b/SOURCES/bcc-0.25.0-libbpf-Allow-kernel_struct_has_field-to-reach-field-.patch @@ -1,24 +1,30 @@ -From e9ae2826b8712d491362771233ed6bf21ae1a07a Mon Sep 17 00:00:00 2001 +From 16277e3910c9281d807fc6d3b4ce41c62d7d265e Mon Sep 17 00:00:00 2001 From: Jerome Marchand Date: Thu, 19 May 2022 16:37:40 +0200 Subject: [PATCH 3/3] libbpf: Allow kernel_struct_has_field to reach field in unnamed struct or union -Some field can belong to unnamed struct or union. In C, they are -accessed as if their belong directly to the parent struct or union but -this is not the case for BTF. +Some fields can belong to unnamed struct or union (e.g. rcu and +rcu_users fields of task_struct). In C, they are accessed as if their +belong directly to the parent of the unnamed struct or union but this +is not the case for BTF. When looking for a field, kernel_struct_has_field should also look -reccursively into unnamed structs or unions. +reccursively into unnamed structs or unions. That allows code such as +the following to work as expected: + +BPF.kernel_struct_has_field('task_struct', 'rcu') + +Signed-off-by: Jerome Marchand --- src/cc/libbpf.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/cc/libbpf.c b/src/cc/libbpf.c -index 7410ae1a..e98b8852 100644 +index 5f7a3f68..bdfde1f5 100644 --- a/src/cc/libbpf.c +++ b/src/cc/libbpf.c -@@ -1302,12 +1302,27 @@ bool bpf_has_kernel_btf(void) +@@ -1319,12 +1319,27 @@ bool bpf_has_kernel_btf(void) return true; } @@ -48,7 +54,7 @@ index 7410ae1a..e98b8852 100644 btf = libbpf_find_kernel_btf(); ret = libbpf_get_error(btf); -@@ -1321,14 +1336,7 @@ int kernel_struct_has_field(const char *struct_name, const char *field_name) +@@ -1338,14 +1353,7 @@ int kernel_struct_has_field(const char *struct_name, const char *field_name) } btf_type = btf__type_by_id(btf, btf_id); @@ -65,5 +71,5 @@ index 7410ae1a..e98b8852 100644 cleanup: btf__free(btf); -- -2.35.3 +2.38.1 diff --git a/SPECS/bcc.spec b/SPECS/bcc.spec index b605ff2..7f3f43c 100644 --- a/SPECS/bcc.spec +++ b/SPECS/bcc.spec @@ -8,7 +8,7 @@ %endif Name: bcc -Version: 0.24.0 +Version: 0.25.0 Release: 2%{?dist} Summary: BPF Compiler Collection (BCC) License: ASL 2.0 @@ -17,6 +17,10 @@ Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz Patch0: %{name}-%{version}-Manpages-remove-unstable-statement.patch Patch1: %{name}-%{version}-RHEL-libbpf-version-fixes.patch Patch2: %{name}-%{version}-libbpf-Allow-kernel_struct_has_field-to-reach-field-.patch +Patch3: %{name}-%{version}-Fix-bpf_pseudo_fd-type-conversion-error.patch +Patch4: %{name}-%{version}-Fix-clang-15-int-to-pointer-conversion-errors.patch +Patch5: %{name}-%{version}-Revert-tools-tcpaccept-Fix-support-for-v5.6-kernels.patch +Patch6: %{name}-%{version}-Fix-get_kprobe_functions.patch # Arches will be included as upstream support is added and dependencies are # satisfied in the respective arches @@ -214,6 +218,13 @@ done %changelog +* Tue Jan 10 2023 Jerome Marchand - 0.25.0-2 +- Fix tcpdrop tool + +* Wed Nov 30 2022 Jerome Marchand - 0.25.0-1 +- Rebase to bcc-0.25.0 +- Rebuild on LLVM 15 + * Thu Jun 23 2022 Jerome Marchand - 0.24.0-2 - Rebuild on libbpf 0.5.0