From patchwork Wed Feb 12 20:15:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ihor Solodrai X-Patchwork-Id: 13972406 Received: from out-187.mta0.migadu.com (out-187.mta0.migadu.com [91.218.175.187]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 80A6F200138 for ; Wed, 12 Feb 2025 20:16:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.187 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739391366; cv=none; b=Z9ZNAunV707FthzhptnMizHWcN0G1oo4i6tqFvKxz2ghfc1CTj/hF0/wxq1ucpEYmf7sVbhvk0iD3An1fKrvaQRsdRjupxNHsPh7TqsKqfEvIXXXzlB3fWoyt316yO867bOER5u4AebeCB4KIAoxtvY8suR2QBIpgjqUYS8o8b4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739391366; c=relaxed/simple; bh=iouqjEB0ksWahoIuXzzZPGHwYZdWDzkUmMkzCzFjKkE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OZkvTtWCVc1zkdDQgJNy1fSwnprC9BfvPda1snER3D5/+NGCOkP06SJ99fCW2VIZRTQHfN9hWQgH7MZstG3b0c3Vp63d8wMkOf29XSvMRUOvncA8hqHXIp1T90uPOpLxqQt6mbgZhUF0NtTWK74T52ymG2R7p1BD/lPHgyJyr54= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=BrYo6JO7; arc=none smtp.client-ip=91.218.175.187 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="BrYo6JO7" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1739391360; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FJL6aQxOwwqT4n7QqoafIga3ln7Sbv5E1bknA4k9LLU=; b=BrYo6JO7QNJwIGBo59T4mrq/37KfiQur3HAVrHRyDuQ7lx3mE0PuON3sJ/Tuk+8bXk+26x l9NhYAfgxqI3JF32vpT05bGDiz1Qk4cHh25rhN/ytl3boTCHN/b9noGnPH6GHykilN+qm+ 3MoI5QN9BNQNGiQMH6dLe3qyLnkx6R4= From: Ihor Solodrai To: dwarves@vger.kernel.org, bpf@vger.kernel.org Cc: acme@kernel.org, alan.maguire@oracle.com, ast@kernel.org, andrii@kernel.org, eddyz87@gmail.com, mykolal@fb.com, kernel-team@meta.com Subject: [PATCH v2 dwarves 1/4] btf_encoder: refactor btf_encoder__tag_kfuncs() Date: Wed, 12 Feb 2025 12:15:49 -0800 Message-ID: <20250212201552.1431219-2-ihor.solodrai@linux.dev> In-Reply-To: <20250212201552.1431219-1-ihor.solodrai@linux.dev> References: <20250212201552.1431219-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT btf_encoder__tag_kfuncs() is a post-processing step of BTF encoding, executed right before BTF is deduped and dumped to the output. Rewrite btf_encoder__tag_kfuncs() into btf_encoder__collect_kfuncs(). Now it only reads the .BTF_ids section of the ELF, collecting kfunc information and adding it to corresponding elf_function structs. It is executed in btf_encoder__new() if tag_kfuncs flag is set. This way kfunc information is available within entire lifetime of the btf_encoder. BTF decl tags for kfuncs are added immediately after the function is added to BTF in btf_encoder__add_func(). It's done by btf__tag_kfunc() factored out from the btf_encoder__tag_kfunc(). As a result btf_encoder__tag_kfuncs(), its subroutines and struct btf_func type are deleted, as they are no longer necessary. Link: https://lore.kernel.org/dwarves/3782640a577e6945c86d6330bc8a05018a1e5c52.camel@gmail.com/ Suggested-by: Eduard Zingerman Signed-off-by: Ihor Solodrai Acked-by: Eduard Zingerman --- btf_encoder.c | 192 +++++++++++++++----------------------------------- 1 file changed, 57 insertions(+), 135 deletions(-) diff --git a/btf_encoder.c b/btf_encoder.c index 511c1ea..965e8f0 100644 --- a/btf_encoder.c +++ b/btf_encoder.c @@ -89,6 +89,8 @@ struct elf_function { const char *name; char *alias; size_t prefixlen; + bool kfunc; + uint32_t kfunc_flags; }; struct elf_secinfo { @@ -145,11 +147,6 @@ struct btf_encoder { struct list_head elf_functions_list; }; -struct btf_func { - const char *name; - int type_id; -}; - /* Half open interval representing range of addresses containing kfuncs */ struct btf_kfunc_set_range { uint64_t start; @@ -1178,6 +1175,39 @@ out: return err; } +static int btf__add_kfunc_decl_tag(struct btf *btf, const char *tag, __u32 id, const char *kfunc) +{ + int err = btf__add_decl_tag(btf, tag, id, -1); + + if (err < 0) { + fprintf(stderr, "%s: failed to insert kfunc decl tag for '%s': %d\n", + __func__, kfunc, err); + return err; + } + return 0; +} + +static int btf__tag_kfunc(struct btf *btf, struct elf_function *kfunc, __u32 btf_fn_id) +{ + int err; + + /* Note we are unconditionally adding the btf_decl_tag even + * though vmlinux may already contain btf_decl_tags for kfuncs. + * We are ok to do this b/c we will later btf__dedup() to remove + * any duplicates. + */ + err = btf__add_kfunc_decl_tag(btf, BTF_KFUNC_TYPE_TAG, btf_fn_id, kfunc->name); + if (err < 0) + return err; + + if (kfunc->kfunc_flags & KF_FASTCALL) { + err = btf__add_kfunc_decl_tag(btf, BTF_FASTCALL_TAG, btf_fn_id, kfunc->name); + if (err < 0) + return err; + } + return 0; +} + static int32_t btf_encoder__add_func(struct btf_encoder *encoder, struct btf_encoder_func_state *state) { @@ -1188,6 +1218,7 @@ static int32_t btf_encoder__add_func(struct btf_encoder *encoder, const char *value; char tmp_value[KSYM_NAME_LEN]; uint16_t idx; + int err; btf_fnproto_id = btf_encoder__add_func_proto(encoder, NULL, state); name = func->alias ?: func->name; @@ -1199,6 +1230,16 @@ static int32_t btf_encoder__add_func(struct btf_encoder *encoder, name, btf_fnproto_id < 0 ? "proto" : "func"); return -1; } + + if (func->kfunc && encoder->tag_kfuncs && !encoder->skip_encoding_decl_tag) { + err = btf__tag_kfunc(encoder->btf, func, btf_fn_id); + if (err < 0) { + fprintf(stderr, "%s: failed to tag kfunc '%s': %d\n", + __func__, func->name, err); + return err; + } + } + if (state->nr_annots == 0) return 0; @@ -1771,116 +1812,10 @@ static char *get_func_name(const char *sym) return func; } -static int btf_func_cmp(const void *_a, const void *_b) -{ - const struct btf_func *a = _a; - const struct btf_func *b = _b; - - return strcmp(a->name, b->name); -} - -/* - * Collects all functions described in BTF. - * Returns non-zero on error. - */ -static int btf_encoder__collect_btf_funcs(struct btf_encoder *encoder, struct gobuffer *funcs) -{ - struct btf *btf = encoder->btf; - int nr_types, type_id; - int err = -1; - - /* First collect all the func entries into an array */ - nr_types = btf__type_cnt(btf); - for (type_id = 1; type_id < nr_types; type_id++) { - const struct btf_type *type; - struct btf_func func = {}; - const char *name; - - type = btf__type_by_id(btf, type_id); - if (!type) { - fprintf(stderr, "%s: malformed BTF, can't resolve type for ID %d\n", - __func__, type_id); - err = -EINVAL; - goto out; - } - - if (!btf_is_func(type)) - continue; - - name = btf__name_by_offset(btf, type->name_off); - if (!name) { - fprintf(stderr, "%s: malformed BTF, can't resolve name for ID %d\n", - __func__, type_id); - err = -EINVAL; - goto out; - } - - func.name = name; - func.type_id = type_id; - err = gobuffer__add(funcs, &func, sizeof(func)); - if (err < 0) - goto out; - } - - /* Now that we've collected funcs, sort them by name */ - gobuffer__sort(funcs, sizeof(struct btf_func), btf_func_cmp); - - err = 0; -out: - return err; -} - -static int btf__add_kfunc_decl_tag(struct btf *btf, const char *tag, __u32 id, const char *kfunc) -{ - int err = btf__add_decl_tag(btf, tag, id, -1); - - if (err < 0) { - fprintf(stderr, "%s: failed to insert kfunc decl tag for '%s': %d\n", - __func__, kfunc, err); - return err; - } - return 0; -} - -static int btf_encoder__tag_kfunc(struct btf_encoder *encoder, struct gobuffer *funcs, const char *kfunc, __u32 flags) -{ - struct btf_func key = { .name = kfunc }; - struct btf *btf = encoder->btf; - struct btf_func *target; - const void *base; - unsigned int cnt; - int err; - - base = gobuffer__entries(funcs); - cnt = gobuffer__nr_entries(funcs); - target = bsearch(&key, base, cnt, sizeof(key), btf_func_cmp); - if (!target) { - fprintf(stderr, "%s: failed to find kfunc '%s' in BTF\n", __func__, kfunc); - return -1; - } - - /* Note we are unconditionally adding the btf_decl_tag even - * though vmlinux may already contain btf_decl_tags for kfuncs. - * We are ok to do this b/c we will later btf__dedup() to remove - * any duplicates. - */ - err = btf__add_kfunc_decl_tag(btf, BTF_KFUNC_TYPE_TAG, target->type_id, kfunc); - if (err < 0) - return err; - if (flags & KF_FASTCALL) { - err = btf__add_kfunc_decl_tag(btf, BTF_FASTCALL_TAG, target->type_id, kfunc); - if (err < 0) - return err; - } - - return 0; -} - -static int btf_encoder__tag_kfuncs(struct btf_encoder *encoder) +static int btf_encoder__collect_kfuncs(struct btf_encoder *encoder) { const char *filename = encoder->source_filename; struct gobuffer btf_kfunc_ranges = {}; - struct gobuffer btf_funcs = {}; Elf_Data *symbols = NULL; Elf_Data *idlist = NULL; Elf_Scn *symscn = NULL; @@ -1977,12 +1912,6 @@ static int btf_encoder__tag_kfuncs(struct btf_encoder *encoder) } nr_syms = shdr.sh_size / shdr.sh_entsize; - err = btf_encoder__collect_btf_funcs(encoder, &btf_funcs); - if (err) { - fprintf(stderr, "%s: failed to collect BTF funcs\n", __func__); - goto out; - } - /* First collect all kfunc set ranges. * * Note we choose not to sort these ranges and accept a linear @@ -2015,12 +1944,12 @@ static int btf_encoder__tag_kfuncs(struct btf_encoder *encoder) for (i = 0; i < nr_syms; i++) { const struct btf_kfunc_set_range *ranges; const struct btf_id_and_flag *pair; + struct elf_function *elf_fn; unsigned int ranges_cnt; char *func, *name; ptrdiff_t off; GElf_Sym sym; bool found; - int err; int j; if (!gelf_getsym(symbols, i, &sym)) { @@ -2061,18 +1990,16 @@ static int btf_encoder__tag_kfuncs(struct btf_encoder *encoder) continue; } - err = btf_encoder__tag_kfunc(encoder, &btf_funcs, func, pair->flags); - if (err) { - fprintf(stderr, "%s: failed to tag kfunc '%s'\n", __func__, func); - free(func); - goto out; + elf_fn = btf_encoder__find_function(encoder, func, 0); + if (elf_fn) { + elf_fn->kfunc = true; + elf_fn->kfunc_flags = pair->flags; } free(func); } err = 0; out: - __gobuffer__delete(&btf_funcs); __gobuffer__delete(&btf_kfunc_ranges); if (elf) elf_end(elf); @@ -2083,7 +2010,6 @@ out: int btf_encoder__encode(struct btf_encoder *encoder, struct conf_load *conf) { - bool should_tag_kfuncs; int err; size_t shndx; @@ -2099,15 +2025,6 @@ int btf_encoder__encode(struct btf_encoder *encoder, struct conf_load *conf) if (btf__type_cnt(encoder->btf) == 1) return 0; - /* Note vmlinux may already contain btf_decl_tag's for kfuncs. So - * take care to call this before btf_dedup(). - */ - should_tag_kfuncs = encoder->tag_kfuncs && !encoder->skip_encoding_decl_tag; - if (should_tag_kfuncs && btf_encoder__tag_kfuncs(encoder)) { - fprintf(stderr, "%s: failed to tag kfuncs!\n", __func__); - return -1; - } - if (btf__dedup(encoder->btf, NULL)) { fprintf(stderr, "%s: btf__dedup failed!\n", __func__); return -1; @@ -2496,6 +2413,11 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filenam if (!found_percpu && encoder->verbose) printf("%s: '%s' doesn't have '%s' section\n", __func__, cu->filename, PERCPU_SECTION); + if (encoder->tag_kfuncs) { + if (btf_encoder__collect_kfuncs(encoder)) + goto out_delete; + } + if (encoder->verbose) printf("File %s:\n", cu->filename); } From patchwork Wed Feb 12 20:15:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ihor Solodrai X-Patchwork-Id: 13972407 Received: from out-171.mta0.migadu.com (out-171.mta0.migadu.com [91.218.175.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B1BD200BA1 for ; Wed, 12 Feb 2025 20:16:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739391366; cv=none; b=EqQwsYPmjj/YJ0Rs5qWI+OWzDXww584+OwtU/XvFje04tG83TWVEDMBn6JDWLiaQqhiqmH09EJY4Kc30SE05QhjN8vGTOCjjy2pOdUjpS5A0lZSIbApVkNZ//3ZpoVcCx0c7dorxwOmfVQ9uc6mCW7ohEdwNiYkC5j5+MD9037k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739391366; c=relaxed/simple; bh=xlY2y5Qx5a75fHiGAMzlTtcYDOVH3GtlN8K3Qk6aI1k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RX6VhCasv8bVWiL3GWAHC+Za+aJJUwjki++7AZWXxfJKP6rExOb1QIRQqAmHUZ85ZoxH78iI+vkzbnaEXx1/Qnx304OkG5d6JGSRqahmaD57NEgpBGRnVRMozUD1CLvIfCMTva2eP3+xaLqZNBPWNQ+a0NK1z54/8elDN52R37g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=N29lT8W5; arc=none smtp.client-ip=91.218.175.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="N29lT8W5" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1739391362; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=eRsC8wyE1a8ix2TPDGkJjSeG1u5Q+zJtkNGoD+7khFY=; b=N29lT8W5T3DKdDBX7Q58elgKkY4JSbrh4is1MJz0ChRTuNNtroxs4Bix3MCV926hTe6Pyt k4We8kLtlZ4sdFyZMuNCm2QxNaM37W4SwAtb7z8RIDBtaAoKMniHWgHwIXUJJPGD+qSrMw K/3Lpk8miGWEwOYi/GfG6XqtC6e2K6I= From: Ihor Solodrai To: dwarves@vger.kernel.org, bpf@vger.kernel.org Cc: acme@kernel.org, alan.maguire@oracle.com, ast@kernel.org, andrii@kernel.org, eddyz87@gmail.com, mykolal@fb.com, kernel-team@meta.com Subject: [PATCH v2 dwarves 2/4] btf_encoder: emit type tags for bpf_arena pointers Date: Wed, 12 Feb 2025 12:15:50 -0800 Message-ID: <20250212201552.1431219-3-ihor.solodrai@linux.dev> In-Reply-To: <20250212201552.1431219-1-ihor.solodrai@linux.dev> References: <20250212201552.1431219-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT When adding a kfunc prototype to BTF, check for the flags indicating bpf_arena pointers and emit a type tag encoding __attribute__((address_space(1))) for them. This also requires updating BTF type ids in the btf_encoder_func_state, which is done as a side effect in the tagging functions. This feature depends on recent update in libbpf, supporting arbitrarty attribute encoding [1]. [1] https://lore.kernel.org/bpf/20250130201239.1429648-1-ihor.solodrai@linux.dev/ Signed-off-by: Ihor Solodrai Reviewed-by: Alan Maguire --- btf_encoder.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/btf_encoder.c b/btf_encoder.c index 965e8f0..3cec106 100644 --- a/btf_encoder.c +++ b/btf_encoder.c @@ -40,7 +40,13 @@ #define BTF_SET8_KFUNCS (1 << 0) #define BTF_KFUNC_TYPE_TAG "bpf_kfunc" #define BTF_FASTCALL_TAG "bpf_fastcall" -#define KF_FASTCALL (1 << 12) +#define BPF_ARENA_ATTR "address_space(1)" + +/* kfunc flags, see include/linux/btf.h in the kernel source */ +#define KF_FASTCALL (1 << 12) +#define KF_ARENA_RET (1 << 13) +#define KF_ARENA_ARG1 (1 << 14) +#define KF_ARENA_ARG2 (1 << 15) struct btf_id_and_flag { uint32_t id; @@ -731,6 +737,78 @@ static int32_t btf_encoder__tag_type(struct btf_encoder *encoder, uint32_t tag_t return encoder->type_id_off + tag_type; } +#if LIBBPF_MAJOR_VERSION >= 1 && LIBBPF_MINOR_VERSION >= 6 +static int btf__tag_bpf_arena_ptr(struct btf *btf, int ptr_id) +{ + const struct btf_type *ptr; + int tagged_type_id; + + ptr = btf__type_by_id(btf, ptr_id); + if (!btf_is_ptr(ptr)) + return -EINVAL; + + tagged_type_id = btf__add_type_attr(btf, BPF_ARENA_ATTR, ptr->type); + if (tagged_type_id < 0) + return tagged_type_id; + + return btf__add_ptr(btf, tagged_type_id); +} + +static int btf__tag_bpf_arena_arg(struct btf *btf, struct btf_encoder_func_state *state, int idx) +{ + int id; + + if (state->nr_parms <= idx) + return -EINVAL; + + id = btf__tag_bpf_arena_ptr(btf, state->parms[idx].type_id); + if (id < 0) { + btf__log_err(btf, BTF_KIND_TYPE_TAG, BPF_ARENA_ATTR, true, id, + "Error adding BPF_ARENA_ATTR for an argument of kfunc '%s'", state->elf->name); + return id; + } + state->parms[idx].type_id = id; + + return id; +} + +static int btf__add_bpf_arena_type_tags(struct btf *btf, struct btf_encoder_func_state *state) +{ + uint32_t flags = state->elf->kfunc_flags; + int ret_type_id; + int err; + + if (KF_ARENA_RET & flags) { + ret_type_id = btf__tag_bpf_arena_ptr(btf, state->ret_type_id); + if (ret_type_id < 0) { + btf__log_err(btf, BTF_KIND_TYPE_TAG, BPF_ARENA_ATTR, true, ret_type_id, + "Error adding BPF_ARENA_ATTR for return type of kfunc '%s'", state->elf->name); + return ret_type_id; + } + state->ret_type_id = ret_type_id; + } + + if (KF_ARENA_ARG1 & flags) { + err = btf__tag_bpf_arena_arg(btf, state, 0); + if (err < 0) + return err; + } + + if (KF_ARENA_ARG2 & flags) { + err = btf__tag_bpf_arena_arg(btf, state, 1); + if (err < 0) + return err; + } + + return 0; +} +#endif // LIBBPF_MAJOR_VERSION >= 1 && LIBBPF_MINOR_VERSION >= 6 + +static inline bool is_kfunc_state(struct btf_encoder_func_state *state) +{ + return state && state->elf && state->elf->kfunc; +} + static int32_t btf_encoder__add_func_proto(struct btf_encoder *encoder, struct ftype *ftype, struct btf_encoder_func_state *state) { @@ -744,6 +822,12 @@ static int32_t btf_encoder__add_func_proto(struct btf_encoder *encoder, struct f assert(ftype != NULL || state != NULL); +#if LIBBPF_MAJOR_VERSION >= 1 && LIBBPF_MINOR_VERSION >= 6 + if (is_kfunc_state(state) && encoder->tag_kfuncs) + if (btf__add_bpf_arena_type_tags(encoder->btf, state) < 0) + return -1; +#endif + /* add btf_type for func_proto */ if (ftype) { btf = encoder->btf; From patchwork Wed Feb 12 20:15:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ihor Solodrai X-Patchwork-Id: 13972408 Received: from out-182.mta0.migadu.com (out-182.mta0.migadu.com [91.218.175.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1E29D201103 for ; Wed, 12 Feb 2025 20:16:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739391370; cv=none; b=gS06CemgvYuwGqCMwrpX89vwyHBbpF2g8HkZklgzB+wVKtQJ6jy8AzT+Icn3pgWi8RI1xzQZho+SLm8hvIgN/y+9nSv9kjLTYOlHOn7fwOmDg1wHie6LT+2JAQsBlVWdeNVM/lYds0rWizZIPUWB/0k/EgYZSC4Kq/s8vAKdtTg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739391370; c=relaxed/simple; bh=DGQmndWFLKnTkonu2cIlV42/moEe+hJ6Kc8YM45CjTE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SZ4rcPThJnQiEJP8an/B3pKGxiIoceSss9wKL+e+lZjzQOuLgKCDrGCkoHklSi/AKsx3pe5txoNE70ynOJiq6veWYORwZxICK9XIrrjiLG4pQowbUHG86DKbfHJ2jVr8ZGK2IS5yibDqSCptAOzKsB4+ndMVxkm2yeEJ8TeRiuA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=oC75Q3RK; arc=none smtp.client-ip=91.218.175.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="oC75Q3RK" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1739391364; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=83y37IhF2PHQMOSXci5MhDQDNg2gnbZ7oyz+TnSEgyg=; b=oC75Q3RKrMqRVvwzc+GUvU2An8caydEVMH0V4/bChDwzu/eVWs0/6/3Np4nIz0H91VFLCc JxuEk/VRDgSSwF/ybi+QcnTfTV6O/bg6TnwdeM3gYuoNy/xaVQ+DJnuXpEbyDfn/JMswRl dcniinn9fS7ARl0E4xbxYXun7SB2NX0= From: Ihor Solodrai To: dwarves@vger.kernel.org, bpf@vger.kernel.org Cc: acme@kernel.org, alan.maguire@oracle.com, ast@kernel.org, andrii@kernel.org, eddyz87@gmail.com, mykolal@fb.com, kernel-team@meta.com Subject: [PATCH v2 dwarves 3/4] pahole: introduce --btf_feature=attributes Date: Wed, 12 Feb 2025 12:15:51 -0800 Message-ID: <20250212201552.1431219-4-ihor.solodrai@linux.dev> In-Reply-To: <20250212201552.1431219-1-ihor.solodrai@linux.dev> References: <20250212201552.1431219-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT Add a feature flag "attributes" (default: false) controlling whether pahole is allowed to generate BTF attributes: type tags and decl tags with kind_flag = 1. This is necessary for backward compatibility, as BPF verifier does not recognize tags with kind_flag = 1 prior to (at least) 6.14-rc1 [1]. [1] https://lore.kernel.org/bpf/20250130201239.1429648-1-ihor.solodrai@linux.dev/ Signed-off-by: Ihor Solodrai Reviewed-by: Alan Maguire Acked-by: Eduard Zingerman --- btf_encoder.c | 6 ++++-- dwarves.h | 1 + pahole.c | 11 +++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/btf_encoder.c b/btf_encoder.c index 3cec106..fc99ad2 100644 --- a/btf_encoder.c +++ b/btf_encoder.c @@ -136,7 +136,8 @@ struct btf_encoder { gen_floats, skip_encoding_decl_tag, tag_kfuncs, - gen_distilled_base; + gen_distilled_base, + encode_attributes; uint32_t array_index_id; struct elf_secinfo *secinfo; size_t seccnt; @@ -823,7 +824,7 @@ static int32_t btf_encoder__add_func_proto(struct btf_encoder *encoder, struct f assert(ftype != NULL || state != NULL); #if LIBBPF_MAJOR_VERSION >= 1 && LIBBPF_MINOR_VERSION >= 6 - if (is_kfunc_state(state) && encoder->tag_kfuncs) + if (is_kfunc_state(state) && encoder->tag_kfuncs && encoder->encode_attributes) if (btf__add_bpf_arena_type_tags(encoder->btf, state) < 0) return -1; #endif @@ -2417,6 +2418,7 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filenam encoder->skip_encoding_decl_tag = conf_load->skip_encoding_btf_decl_tag; encoder->tag_kfuncs = conf_load->btf_decl_tag_kfuncs; encoder->gen_distilled_base = conf_load->btf_gen_distilled_base; + encoder->encode_attributes = conf_load->btf_attributes; encoder->verbose = verbose; encoder->has_index_type = false; encoder->need_index_type = false; diff --git a/dwarves.h b/dwarves.h index 8234e1a..99ed783 100644 --- a/dwarves.h +++ b/dwarves.h @@ -89,6 +89,7 @@ struct conf_load { bool reproducible_build; bool btf_decl_tag_kfuncs; bool btf_gen_distilled_base; + bool btf_attributes; uint8_t hashtable_bits; uint8_t max_hashtable_bits; uint16_t kabi_prefix_len; diff --git a/pahole.c b/pahole.c index af3e1cf..0bda249 100644 --- a/pahole.c +++ b/pahole.c @@ -1152,6 +1152,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version; #define ARG_padding_ge 347 #define ARG_padding 348 #define ARGP_with_embedded_flexible_array 349 +#define ARGP_btf_attributes 350 /* --btf_features=feature1[,feature2,..] allows us to specify * a list of requested BTF features or "default" to enable all default @@ -1210,6 +1211,9 @@ struct btf_feature { BTF_NON_DEFAULT_FEATURE(distilled_base, btf_gen_distilled_base, false), #endif BTF_NON_DEFAULT_FEATURE(global_var, encode_btf_global_vars, false), +#if LIBBPF_MAJOR_VERSION >= 1 && LIBBPF_MINOR_VERSION >= 6 + BTF_NON_DEFAULT_FEATURE(attributes, btf_attributes, false), +#endif }; #define BTF_MAX_FEATURE_STR 1024 @@ -1785,6 +1789,11 @@ static const struct argp_option pahole__options[] = { .key = ARGP_running_kernel_vmlinux, .doc = "Search for, possibly getting from a debuginfo server, a vmlinux matching the running kernel build-id (from /sys/kernel/notes)" }, + { + .name = "btf_attributes", + .key = ARGP_btf_attributes, + .doc = "Allow generation of attributes in BTF. Attributes are the type tags and decl tags with the kind_flag set to 1.", + }, { .name = NULL, } @@ -1979,6 +1988,8 @@ static error_t pahole__options_parser(int key, char *arg, show_supported_btf_features(stdout); exit(0); case ARGP_btf_features_strict: parse_btf_features(arg, true); break; + case ARGP_btf_attributes: + conf_load.btf_attributes = true; break; default: return ARGP_ERR_UNKNOWN; } From patchwork Wed Feb 12 20:15:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ihor Solodrai X-Patchwork-Id: 13972409 Received: from out-175.mta0.migadu.com (out-175.mta0.migadu.com [91.218.175.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9887E200B99 for ; Wed, 12 Feb 2025 20:16:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739391372; cv=none; b=piAo0+sCOIu3fmzBjyFS50UR8bWemELFSe1TdUaOaOFhYrMcFDmfXH3Tw3PS2ha0YECE+uzhg9CSw2u0DY1D+C5+ZemaEkUilIhcOdyTa/b4g2QI+MmIlZYGuQslaCU2xBqaME+CBaMVPxWRna2vysjjclXrJ+AIv+qCbk1t4Ms= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739391372; c=relaxed/simple; bh=GFyble7KuoWR/jBfqDDUBdFOzcNGu3Z0y3DubKzEwnU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bh0HTREfR5jrUiLMgtmrzMcpIP+VQS48dTPV1hfieczGlW/l3fAiroJGywr/r1IuYcApuBuLpaBVq9yzF2RNfmwy0GuKb+Wl/AtzwgpbRf4/G3CyBnMK6d5UP8QC1DwxXU4BS+nsRvc2IaPp9diic1vUxNhsHiUnPQdXvtjlIEI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=ZnABwTop; arc=none smtp.client-ip=91.218.175.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="ZnABwTop" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1739391366; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AwQAEFegtRF3r37vnzwyzjrcZBx48QWnNDQGd6H58hc=; b=ZnABwTopJ7G2oAuQaic4rTlahMf3meU+08I6qGVFozFoCdUxD/4osfYVKxo0PFbp2tzX0l 1zkW0hLHKbzh5xDITtBRv7uclhTkn91ccfJCrpskt8JRU2SUSQP8M7DQ38iGJiFA7W4M8x DC3oGmuTVIhGZ78Ne7BENXWNbpnxO7U= From: Ihor Solodrai To: dwarves@vger.kernel.org, bpf@vger.kernel.org Cc: acme@kernel.org, alan.maguire@oracle.com, ast@kernel.org, andrii@kernel.org, eddyz87@gmail.com, mykolal@fb.com, kernel-team@meta.com Subject: [PATCH v2 dwarves 4/4] man-pages: describe attributes and remove reproducible_build Date: Wed, 12 Feb 2025 12:15:52 -0800 Message-ID: <20250212201552.1431219-5-ihor.solodrai@linux.dev> In-Reply-To: <20250212201552.1431219-1-ihor.solodrai@linux.dev> References: <20250212201552.1431219-1-ihor.solodrai@linux.dev> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Migadu-Flow: FLOW_OUT Add a description of the new --btf_feature=attributes. Also remove reproducible_build description, as it is now a moot feature flag. Signed-off-by: Ihor Solodrai --- man-pages/pahole.1 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/man-pages/pahole.1 b/man-pages/pahole.1 index 39e7b46..3125de3 100644 --- a/man-pages/pahole.1 +++ b/man-pages/pahole.1 @@ -327,9 +327,10 @@ Encode BTF using the specified feature list, or specify 'default' for all standa Supported non-standard features (not enabled for 'default') .nf - reproducible_build Ensure generated BTF is consistent every time; - without this parallel BTF encoding can result in - inconsistent BTF ids. + attributes Allow generation of decl_tags and type_tags with + kind_flag = 1. These tags can be used to encode + arbitrary compiler attributes in BTF, but are + backward incompatible. decl_tag_kfuncs Inject a BTF_KIND_DECL_TAG for each discovered kfunc. distilled_base For split BTF, generate a distilled version of the associated base BTF to support later relocation