From: Ihor Solodrai <ihor.solodrai@linux.dev>
To: Alexei Starovoitov <ast@kernel.org>,
Andrii Nakryiko <andrii@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Eduard Zingerman <eddyz87@gmail.com>,
Kumar Kartikeya Dwivedi <memxor@gmail.com>,
Quentin Monnet <qmo@kernel.org>
Cc: bpf@vger.kernel.org, Alan Maguire <alan.maguire@oracle.com>,
Cupertino Miranda <cupertino.miranda@oracle.com>,
David Faust <david.faust@oracle.com>,
Ian Rogers <irogers@google.com>,
"Jose E . Marchesi" <jose.marchesi@oracle.com>,
Vineet Gupta <vineet.gupta@linux.dev>,
Yonghong Song <yonghong.song@linux.dev>
Subject: [PATCH bpf-next v1 3/8] bpftool: Apply __bpf_core_pai per record on BTF dump
Date: Thu, 15 Oct 2026 17:00:07 -0700 [thread overview]
Message-ID: <20261016000012.2232059-4-ihor.solodrai@linux.dev> (raw)
In-Reply-To: <20261016000012.2232059-1-ihor.solodrai@linux.dev>
bpftool wraps the C dump in a clang attribute pragma that applies
preserve_access_index to every struct and union, so field accesses
through vmlinux.h types get CO-RE relocations. GCC-BPF supports the
attribute but not the pragma, so it gets no CO-RE from the header.
Jose proposed replacing the Clang pragmas with per-record attributes
in May 2024 [1]. The declaration attribute support in btf_dump [2]
now provides the per-type control discussed in that thread.
Apply the attribute to each struct and union definition instead, as
kflagged decl tags on the detached BTF copy, rendered by btf_dump. The
tags use the __bpf_core_pai macro, which expands to
preserve_access_index where supported and to nothing under
BPF_NO_PRESERVE_ACCESS_INDEX.
The attribute covers the same records as the pragma, so Clang output
is unchanged.
[1]: https://lore.kernel.org/bpf/20240503111836.25275-1-jose.marchesi@oracle.com/
[2]: https://lore.kernel.org/bpf/20260929234608.48503-1-ihor.solodrai@linux.dev/
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
---
tools/bpf/bpftool/btf.c | 34 +++++++++++++++----
.../bpf/bpftool_btf_dump_sorted.expected | 16 ++++-----
.../bpf/bpftool_btf_dump_unsorted.expected | 16 ++++-----
3 files changed, 44 insertions(+), 22 deletions(-)
diff --git a/tools/bpf/bpftool/btf.c b/tools/bpf/bpftool/btf.c
index cc15989643cf..6182f2c41db0 100644
--- a/tools/bpf/bpftool/btf.c
+++ b/tools/bpf/bpftool/btf.c
@@ -1121,6 +1121,24 @@ static struct btf *btf_c_detached_copy(const struct btf *src)
return copy;
}
+static int btf_c_annotate_records(struct btf *btf)
+{
+ __u32 i, cnt = btf__type_cnt(btf);
+ int err;
+
+ for (i = 1; i < cnt; i++) {
+ const struct btf_type *t = btf__type_by_id(btf, i);
+
+ if (!btf_is_composite(t))
+ continue;
+ err = btf__add_decl_attr(btf, "__bpf_core_pai", i, -1);
+ if (err < 0)
+ return err;
+ }
+
+ return 0;
+}
+
static int dump_btf_c(const struct btf *btf,
__u32 *root_type_ids, int root_type_cnt, bool sort_dump)
{
@@ -1133,6 +1151,10 @@ static int dump_btf_c(const struct btf *btf,
if (!copy)
return -errno;
+ err = btf_c_annotate_records(copy);
+ if (err)
+ goto done_free;
+
d = btf_dump__new(copy, btf_dump_printf, NULL, NULL);
if (!d) {
err = -errno;
@@ -1142,8 +1164,12 @@ static int dump_btf_c(const struct btf *btf,
printf("#ifndef __VMLINUX_H__\n");
printf("#define __VMLINUX_H__\n");
printf("\n");
- printf("#ifndef BPF_NO_PRESERVE_ACCESS_INDEX\n");
- printf("#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record)\n");
+ printf("#ifndef __bpf_core_pai\n");
+ printf("#if !defined(BPF_NO_PRESERVE_ACCESS_INDEX) && __has_attribute(preserve_access_index)\n");
+ printf("#define __bpf_core_pai preserve_access_index\n");
+ printf("#else\n");
+ printf("#define __bpf_core_pai\n");
+ printf("#endif\n");
printf("#endif\n\n");
printf("#ifndef __ksym\n");
printf("#define __ksym __attribute__((section(\".ksyms\")))\n");
@@ -1187,10 +1213,6 @@ static int dump_btf_c(const struct btf *btf,
goto done;
}
- printf("#ifndef BPF_NO_PRESERVE_ACCESS_INDEX\n");
- printf("#pragma clang attribute pop\n");
- printf("#endif\n");
- printf("\n");
printf("#endif /* __VMLINUX_H__ */\n");
done:
diff --git a/tools/testing/selftests/bpf/bpftool_btf_dump_sorted.expected b/tools/testing/selftests/bpf/bpftool_btf_dump_sorted.expected
index 5470b2b43229..02c8fe8b4859 100644
--- a/tools/testing/selftests/bpf/bpftool_btf_dump_sorted.expected
+++ b/tools/testing/selftests/bpf/bpftool_btf_dump_sorted.expected
@@ -1,8 +1,12 @@
#ifndef __VMLINUX_H__
#define __VMLINUX_H__
-#ifndef BPF_NO_PRESERVE_ACCESS_INDEX
-#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record)
+#ifndef __bpf_core_pai
+#if !defined(BPF_NO_PRESERVE_ACCESS_INDEX) && __has_attribute(preserve_access_index)
+#define __bpf_core_pai preserve_access_index
+#else
+#define __bpf_core_pai
+#endif
#endif
#ifndef __ksym
@@ -30,19 +34,15 @@ struct holey {
long: 32;
long: 32;
int tail;
-};
+} __attribute__((__bpf_core_pai));
struct s {
int f;
-};
+} __attribute__((__bpf_core_pai));
/* BPF kfuncs */
#ifndef BPF_NO_KFUNC_PROTOTYPES
#endif
-#ifndef BPF_NO_PRESERVE_ACCESS_INDEX
-#pragma clang attribute pop
-#endif
-
#endif /* __VMLINUX_H__ */
diff --git a/tools/testing/selftests/bpf/bpftool_btf_dump_unsorted.expected b/tools/testing/selftests/bpf/bpftool_btf_dump_unsorted.expected
index 4310adc2ed51..9b6589d2bda3 100644
--- a/tools/testing/selftests/bpf/bpftool_btf_dump_unsorted.expected
+++ b/tools/testing/selftests/bpf/bpftool_btf_dump_unsorted.expected
@@ -1,8 +1,12 @@
#ifndef __VMLINUX_H__
#define __VMLINUX_H__
-#ifndef BPF_NO_PRESERVE_ACCESS_INDEX
-#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record)
+#ifndef __bpf_core_pai
+#if !defined(BPF_NO_PRESERVE_ACCESS_INDEX) && __has_attribute(preserve_access_index)
+#define __bpf_core_pai preserve_access_index
+#else
+#define __bpf_core_pai
+#endif
#endif
#ifndef __ksym
@@ -26,7 +30,7 @@ struct holey {
long: 32;
long: 32;
int tail;
-};
+} __attribute__((__bpf_core_pai));
enum {
E0 = 1,
@@ -34,15 +38,11 @@ enum {
struct s {
int f;
-};
+} __attribute__((__bpf_core_pai));
/* BPF kfuncs */
#ifndef BPF_NO_KFUNC_PROTOTYPES
#endif
-#ifndef BPF_NO_PRESERVE_ACCESS_INDEX
-#pragma clang attribute pop
-#endif
-
#endif /* __VMLINUX_H__ */
--
2.56.0
next prev parent reply other threads:[~2026-10-16 0:00 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-16 0:00 [PATCH bpf-next v1 0/8] bpftool: Per-record CO-RE attributes in the C dump Ihor Solodrai
2026-10-16 0:00 ` [PATCH bpf-next v1 1/8] bpftool: Dump C from a detached BTF copy Ihor Solodrai
2026-10-16 1:18 ` Alexei Starovoitov
2026-10-16 9:44 ` Alan Maguire
2026-10-16 9:25 ` Alan Maguire
2026-10-16 0:00 ` [PATCH bpf-next v1 2/8] selftests/bpf: Cover unknown BTF header-extension bytes in btf dump Ihor Solodrai
2026-10-16 0:00 ` Ihor Solodrai [this message]
2026-10-16 0:39 ` [PATCH bpf-next v1 3/8] bpftool: Apply __bpf_core_pai per record on BTF dump bot+bpf-ci
2026-10-16 1:17 ` Alexei Starovoitov
2026-10-16 0:00 ` [PATCH bpf-next v1 4/8] bpftool: Skip __bpf_core_pai on verifier-rewritten context types Ihor Solodrai
2026-10-16 0:00 ` [PATCH bpf-next v1 5/8] bpftool: Emit __bpf_core_pso " Ihor Solodrai
2026-10-16 1:27 ` Alexei Starovoitov
2026-10-16 5:49 ` Ihor Solodrai
2026-10-16 0:00 ` [PATCH bpf-next v1 6/8] selftests/bpf: Cover record attributes in bpftool BTF dumps Ihor Solodrai
2026-10-16 0:00 ` [PATCH bpf-next v1 7/8] selftests/bpf: Cover context and socket accesses through vmlinux.h Ihor Solodrai
2026-10-16 0:00 ` [PATCH bpf-next v1 8/8] bpftool: Document __bpf_core_pai and __bpf_core_pso Ihor Solodrai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261016000012.2232059-4-ihor.solodrai@linux.dev \
--to=ihor.solodrai@linux.dev \
--cc=alan.maguire@oracle.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=cupertino.miranda@oracle.com \
--cc=daniel@iogearbox.net \
--cc=david.faust@oracle.com \
--cc=eddyz87@gmail.com \
--cc=irogers@google.com \
--cc=jose.marchesi@oracle.com \
--cc=memxor@gmail.com \
--cc=qmo@kernel.org \
--cc=vineet.gupta@linux.dev \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.