[PATCH v3 bpf-next 0/6] bpf: Extend BTF UAPI vlen, kinds to use unused bits

Alan Maguire
2026-04-17T14:30:54Z

Currently BTF types can have a maximum of 65535 vlen-specified
objects. While this limit has not yet been surpassed for existing
cases (struct/union fields, enum values, function arguments and
datasec), upcoming BTF location information - specifically inline
sites - will hit that limit. Utilize unused BTF info bits in
struct btf_type to increase limit to 24-bits (over 16 million).
This is more than an order of magnitude greater than inline
site counts for the kernel (~400,000) so should be enough for
the near future at least.

Similarly, struct btf_type uses 5 bits for BTF kind values;
currently we use 20 kinds, but BTF location information will
take another 3, and conceivably providing better support for Rust
types in BTF (now that modules can be built using Rust) could
push us close to the max of 31. Use 2 unused bits to provide
a max possible kind of 127.

Patch 1 handles UAPI and kernel-related changes.

Patch 2 updates libbpf to have btf_vlen() return a __u32 instead
of __u16 and updates consumers in libbpf accordingly. Also adds
bounds checking for max vlen.

Patch 3 cleans up __u16 vlen usage in bpftool.

Patch 4 fixes up a test that relies on BTF info overflowing
maximum kind value; fix up the expected error to be an
invalid kind rather than (now impossible) invalid btf_info.

Patch 5 fixes up __u16 vlen usage in selftests/bpf.

Patch 6 syncs BTF documentation with UAPI changes.

Changes since v2 [1]:

- dropped backwards-compatibility macros (Alexei, patch 1)
- added additional vlen bounds check in btf__add_field()
(sashiko, bpf bot, patch 2)
- dropped sanitization check in libbpf as older kernels will
reject BTF with extended vlen/kinds using BTF info mask
(Alexei)
- fix more vlen assumptions in prog_test/ctx_rewrite.c
(sashiko, patch 5)

Changes since v1 [2]:

- added redundant macros to UAPI in case enum switch for BTF_MAX*
values causes problems (sashiko, patch 1)
- updated feature test to use BTF loading rather than vmlinux BTF
lookup, in line with other BTF feature tests (sashiko, patch 3)
- fixed up a few more kernel, libbpf, bpftool instances of __u16 usage
(bpf bot, sashiko, patches 1, 2, 4)
- fixed up sanitize selftest cleanup (Mykyta, patch 5)
- used unlikely-to-be-used kind (sashiko, patch 6)
- fixed a few lingering selftests uses of __u16 for kind (patch 7)
- update btf.rst with new vlen, kind sizes (patch 8)

[1] https://lore.kernel.org/bpf/20260416143904.1220662-1-alan.maguire@oracle.com/
[2] https://lore.kernel.org/bpf/20260414195019.684531-1-alan.maguire@oracle.com/

Alan Maguire (6):
bpf: Extend BTF UAPI vlen, kinds to use unused bits
libbpf: Adjust btf_vlen() to return a __u32
bpftool: Support 24-bit vlen
selftests/bpf: Fix up btf/invalid test for extended kind
selftests/bpf: Fix up __u16 vlen assumptions
Documentation/bpf: Update btf doc with updated vlen, kind sizes

Documentation/bpf/btf.rst | 6 +--
include/linux/btf.h | 4 +-
include/uapi/linux/btf.h | 26 +++++-----
kernel/bpf/btf.c | 27 ++++------
tools/bpf/bpftool/btf.c | 17 +++----
tools/bpf/bpftool/btf_dumper.c | 4 +-
tools/bpf/bpftool/gen.c | 16 +++---
tools/include/uapi/linux/btf.h | 26 +++++-----
tools/lib/bpf/btf.c | 50 ++++++++++++-------
tools/lib/bpf/btf.h | 2 +-
tools/lib/bpf/btf_dump.c | 24 ++++-----
tools/lib/bpf/relo_core.c | 16 +++---
tools/testing/selftests/bpf/prog_tests/btf.c | 8 +--
.../bpf/prog_tests/btf_dedup_split.c | 3 +-
.../selftests/bpf/prog_tests/ctx_rewrite.c | 3 +-
tools/testing/selftests/bpf/test_progs.c | 2 +-
16 files changed, 119 insertions(+), 115 deletions(-)

--
2.39.3