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 5/8] bpftool: Emit __bpf_core_pso on verifier-rewritten context types
Date: Thu, 15 Oct 2026 17:00:09 -0700 [thread overview]
Message-ID: <20261016000012.2232059-6-ihor.solodrai@linux.dev> (raw)
In-Reply-To: <20261016000012.2232059-1-ihor.solodrai@linux.dev>
The verifier translates accesses to some UAPI context and socket types
into accesses to kernel structures. These accesses require an
unmodified base and an immediate field offset.
Leaving preserve_access_index off does not stop the compiler from
merging loads at different field offsets into one load through an
adjusted pointer. The verifier rejects the resulting program.
preserve_static_offset, available since Clang 18, preserves static
field offsets in load and store instruction immediates. Apply it to
the 13 types that need static offsets through __bpf_core_pso.
Eduard introduced PSO in Clang and proposed annotating BPF context
types in 2023 [1]. His v3 RFC [2] left pt_regs annotations in
architecture headers unresolved. However since commit de6c7d99f898
("bpf: Relax fixed offset check for PTR_TO_CTX"), program types without
convert_ctx_access() accept fixed offsets from modified context
pointers. pt_regs can now keep PAI, while PSO on bpf_perf_event_data
covers its regs member.
PSO creates no CO-RE relocations, so BPF_NO_PRESERVE_ACCESS_INDEX does
not disable it.
Clang 18 through 23 crash on __builtin_preserve_field_info over a PSO
record, including bpf_core_field_*() and the CO-RE bitfield helpers.
-D__bpf_core_pso= can disable PSO for affected programs.
[1]: https://lore.kernel.org/bpf/20231208000531.19179-1-eddyz87@gmail.com/
[2]: https://lore.kernel.org/bpf/20231220133411.22978-1-eddyz87@gmail.com/
Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
---
tools/bpf/bpftool/btf.c | 16 ++++++++++++++--
.../bpf/bpftool_btf_dump_sorted.expected | 8 ++++++++
.../bpf/bpftool_btf_dump_unsorted.expected | 8 ++++++++
3 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/tools/bpf/bpftool/btf.c b/tools/bpf/bpftool/btf.c
index 30f30314ec29..fff2ea0a5c7e 100644
--- a/tools/bpf/bpftool/btf.c
+++ b/tools/bpf/bpftool/btf.c
@@ -1203,12 +1203,17 @@ static int btf_c_annotate_records(struct btf *btf)
for (i = 1; i < cnt; i++) {
const struct btf_type *t = btf__type_by_id(btf, i);
+ const char *attr;
if (!btf_is_composite(t))
continue;
- if (test_bit(i, no_pai))
+ if (!test_bit(i, no_pai))
+ attr = "__bpf_core_pai";
+ else if (btf_c_needs_static_offset(btf, t))
+ attr = "__bpf_core_pso";
+ else
continue;
- err = btf__add_decl_attr(btf, "__bpf_core_pai", i, -1);
+ err = btf__add_decl_attr(btf, attr, i, -1);
if (err < 0)
goto out;
}
@@ -1251,6 +1256,13 @@ static int dump_btf_c(const struct btf *btf,
printf("#define __bpf_core_pai\n");
printf("#endif\n");
printf("#endif\n\n");
+ printf("#ifndef __bpf_core_pso\n");
+ printf("#if __has_attribute(preserve_static_offset)\n");
+ printf("#define __bpf_core_pso preserve_static_offset\n");
+ printf("#else\n");
+ printf("#define __bpf_core_pso\n");
+ printf("#endif\n");
+ printf("#endif\n\n");
printf("#ifndef __ksym\n");
printf("#define __ksym __attribute__((section(\".ksyms\")))\n");
printf("#endif\n\n");
diff --git a/tools/testing/selftests/bpf/bpftool_btf_dump_sorted.expected b/tools/testing/selftests/bpf/bpftool_btf_dump_sorted.expected
index 02c8fe8b4859..7da4df1da207 100644
--- a/tools/testing/selftests/bpf/bpftool_btf_dump_sorted.expected
+++ b/tools/testing/selftests/bpf/bpftool_btf_dump_sorted.expected
@@ -9,6 +9,14 @@
#endif
#endif
+#ifndef __bpf_core_pso
+#if __has_attribute(preserve_static_offset)
+#define __bpf_core_pso preserve_static_offset
+#else
+#define __bpf_core_pso
+#endif
+#endif
+
#ifndef __ksym
#define __ksym __attribute__((section(".ksyms")))
#endif
diff --git a/tools/testing/selftests/bpf/bpftool_btf_dump_unsorted.expected b/tools/testing/selftests/bpf/bpftool_btf_dump_unsorted.expected
index 9b6589d2bda3..f082da51d630 100644
--- a/tools/testing/selftests/bpf/bpftool_btf_dump_unsorted.expected
+++ b/tools/testing/selftests/bpf/bpftool_btf_dump_unsorted.expected
@@ -9,6 +9,14 @@
#endif
#endif
+#ifndef __bpf_core_pso
+#if __has_attribute(preserve_static_offset)
+#define __bpf_core_pso preserve_static_offset
+#else
+#define __bpf_core_pso
+#endif
+#endif
+
#ifndef __ksym
#define __ksym __attribute__((section(".ksyms")))
#endif
--
2.56.0
next prev parent reply other threads:[~2026-10-16 0:00 UTC|newest]
Thread overview: 17+ 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 ` [PATCH bpf-next v1 3/8] bpftool: Apply __bpf_core_pai per record on BTF dump Ihor Solodrai
2026-10-16 0:39 ` 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 ` Ihor Solodrai [this message]
2026-10-16 1:27 ` [PATCH bpf-next v1 5/8] bpftool: Emit __bpf_core_pso " Alexei Starovoitov
2026-10-16 5:49 ` Ihor Solodrai
2026-10-16 15:53 ` Alexei Starovoitov
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-6-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.