Re: [PATCH] docs: Document pahole v1.26 requirement for KF_IMPLICIT_ARGS kfuncs

zhidao su
2026-03-24T18:46:02Z

On Tue, 24 Mar 2026 08:12:12 -0700, Alexei Starovoitov wrote:
> I don't think that's true.
> At least when implicit args were designed the goal was to avoid
> pahole dependencies.
> Please share exact steps to reproduce.

Here are the exact reproduction steps and code path analysis.

Reproduction (Ubuntu 24.04, pahole v1.25):

$ git clone https://github.com/sched-ext/sched_ext.git
$ cd sched_ext && make -j$(nproc) LOCALVERSION=-test
$ make -C tools/testing/selftests/sched_ext
$ vng --run arch/x86/boot/bzImage --cpus 4 --memory 4G -- \
tools/testing/selftests/sched_ext/build/runner 2>&1 | grep "func_proto"

Result: 23/30 tests fail with:
libbpf: extern (func ksym) 'scx_bpf_create_dsq': func_proto [382]
incompatible with vmlinux [53813]

Root cause:

The KF_IMPLICIT_ARGS mechanism requires pahole v1.26 for the DECL_TAG
generation step that enables resolve_btfids to do its btf2btf work:

1. scripts/Makefile.btf gates decl_tag_kfuncs on pahole >= 1.26:

pahole-flags-$(call test-ge, $(pahole-ver), 126) = ... decl_tag_kfuncs

2. Without decl_tag_kfuncs, pahole does not emit DECL_TAG BTF entries
for __bpf_kfunc-annotated functions.

3. resolve_btfids/main.c::collect_kfuncs() (line 1002) early-returns
when nr_decl_tags == 0:

if (!link->nr_decl_tags)
return 0;

4. With no bpf_kfunc DECL_TAGs, btf2btf() never calls
process_kfunc_with_implicit_args() to create _impl variants and
strip 'aux' from the original proto.

5. Result: vmlinux retains the 3-param proto (with 'aux') for all
KF_IMPLICIT_ARGS kfuncs.

BTF evidence from our pahole v1.25-compiled vmlinux:

$ bpftool btf dump file vmlinux | grep -A5 '[53813]'
[53813] FUNC_PROTO '(anon)' ret_type_id=... vlen=3
'dsq_id' type_id=...
'node' type_id=...
'aux' type_id=... <-- implicit arg still present, 3-param
(no scx_bpf_create_dsq_impl exists)

With pahole v1.26, resolve_btfids creates scx_bpf_create_dsq_impl
(3-param, for verifier's find_kfunc_impl_proto) and rewrites
scx_bpf_create_dsq to 2-param (for libbpf ksym matching).

You're right that the design goal was to avoid pahole dependencies -
the implementation could be fixed in resolve_btfids to handle the
no-DECL_TAG case. But until such a fix lands, the dependency exists
in practice. Jonathan Corbet suggested raising the minimum version in
the requirements table to 1.26, which seems the cleanest fix.

Signed-off-by: zhidao su <suzhidao@xiaomi.com>