Re: [PATCH dwarves] btf_encoder: Ensure the first same-name function has a non-zero address

Alan Maguire <[email protected]> Fri, 31 Jul 2026 11:10:50 +0100
Newsgroups org.kernel.vger.dwarves,org.kernel.vger.bpf
Message-ID <[email protected]>
On 28/07/2026 03:37, Yonghong Song wrote:
> 
> When true_signature is enabled, the same function can appear as two kinds
> of saved states: an inlined (abstract) instance that carries the original
> source signature with no address, and an out-of-line instance that carries
> the reconstructed true signature. saved_functions_combine() compares every
> same-name state in a group against the first (anchor) one and, when their
> prototypes differ, marks the function as having an inconsistent prototype.
> 
> Without this patch, the first same-name function may be an inlined instance
> whose prototype is the original source signature and thus differs from the
> true signature. The two prototypes are then flagged as inconsistent and,
> because --btf_features=+true_signature also enables the default
> consistent_func feature (skip_encoding_btf_inconsistent_proto), which drops
> functions flagged with an inconsistent prototype, the whole function is
> dropped from BTF. This primarily affects clang: its signature-changed
> functions keep their original name (no "." suffix), so state->sym is never
> set and they bypass btf_encoder__add_true_signature(), falling through to
> this canonical-state path.
> 
> With this patch, same-name functions are sorted so that, if any instance
> has a non-zero address, such an instance becomes the first (anchor). That
> addressed out-of-line instance is the one whose signature represents the
> true signature, so the consistency check compares real instances against
> each other and the function is retained in BTF with its true signature.
> 
> It is hard to create a test case where one function is inlined in one
> place and not inlined in another place. So I built the latest bpf-next
> kernel with
>   make LLVM=1 -j
> and then did
>   with master branch:
>     pahole -JV --btf_features=+true_signature vmlinux >& log.pahole.old
>   with this patch on top of master branch:
>     pahole -JV --btf_features=+true_signature vmlinux >& log.pahole.new
> and then get warning messages:
>   grep "skipping BTF encoding of function" log.pahole.old > log.old
>   grep "skipping BTF encoding of function" log.pahole.new > log.new
> and compare log.old and log.new
>   diff log.old log.new > log.diff
> 
> The following are some results:
>   --- log.old     2026-07-27 19:06:20.223881463 -0700
>   +++ log.new     2026-07-27 19:06:28.874109831 -0700
>   @@ -15,45 +15,28 @@
>    ZSTD_getCParams_internal : skipping BTF encoding of function due to unexpected register usage for parameter
>    ZSTD_getParams : skipping BTF encoding of function due to unexpected register usage for parameter
>    __ata_sff_port_intr : skipping BTF encoding of function due to unexpected register usage for parameter
>   -__build_flow_key : skipping BTF encoding of function due to param count mismatch; 9 params != 8 params
>   -__build_flow_key : skipping BTF encoding of function due to inconsistet prototype
>    __collect_tables : skipping BTF encoding of function due to ambiguous address
>    __fl_lookup : skipping BTF encoding of function due to return type mismatch
>    __fl_lookup : skipping BTF encoding of function due to ambiguous address
>    __in6_dev_get : skipping BTF encoding of function due to ambiguous address
>    __in_dev_get_rcu : skipping BTF encoding of function due to ambiguous address
>   -__instance_destroy : skipping BTF encoding of function due to param type mismatch for param#1 inst != inst
>   -__instance_destroy : skipping BTF encoding of function due to inconsistet prototype
>    __ioremap_caller : skipping BTF encoding of function due to unexpected register usage for parameter
>   -__ipmr_get_table : skipping BTF encoding of function due to param count mismatch; 2 params != 1 params
>   -__ipmr_get_table : skipping BTF encoding of function due to inconsistet prototype
>    __ipv6_neigh_lookup_noref : skipping BTF encoding of function due to ambiguous address
>    __key_get : skipping BTF encoding of function due to ambiguous address
>   -__kmem_cache_create : skipping BTF encoding of function due to param count mismatch; 5 params != 2 params
>   -__kmem_cache_create : skipping BTF encoding of function due to inconsistet prototype
>   -__kunmap_atomic : skipping BTF encoding of function due to param count mismatch; 1 params != 0 params
>   -__kunmap_atomic : skipping BTF encoding of function due to inconsistet prototype
>    __map_range : skipping BTF encoding of function due to ambiguous address
>    __map_range_leaf : skipping BTF encoding of function due to ambiguous address
>   -__map_single_page3 : skipping BTF encoding of function due to param count mismatch; 3 params != 4 params
>   -__map_single_page3 : skipping BTF encoding of function due to inconsistet prototype
>    __migrate_disable : skipping BTF encoding of function due to ambiguous address
>    __migrate_enable : skipping BTF encoding of function due to ambiguous address
>    __mod_tree_insert : skipping BTF encoding of function due to unexpected register usage for parameter
>    __mptcp_pm_send_ack : skipping BTF encoding of function due to unexpected register usage for parameter
>   +__neigh_lookup : skipping BTF encoding of function due to param count mismatch; 3 params != 2 params
>    __neigh_lookup : skipping BTF encoding of function due to ambiguous address
>   -__netdev_walk_all_lower_dev : skipping BTF encoding of function due to param count mismatch; 1 params != 3 params
>   -__netdev_walk_all_lower_dev : skipping BTF encoding of function due to inconsistet prototype
>    __pci_bus_set_current_state : skipping BTF encoding of function due to unexpected register usage for parameter
>    __pskb_trim : skipping BTF encoding of function due to ambiguous address
>    __release_region : skipping BTF encoding of function due to unexpected register usage for parameter
>    __remove_hrtimer : skipping BTF encoding of function due to unexpected register usage for parameter
>    __sk_dst_get : skipping BTF encoding of function due to ambiguous address
>    __skb_complete_tx_timestamp : skipping BTF encoding of function due to unexpected register usage for parameter
>   -__skb_gro_checksum_validate_complete : skipping BTF encoding of function due to param count mismatch; 2 params != 1 params
>   -__skb_gro_checksum_validate_complete : skipping BTF encoding of function due to inconsistet prototype
>   -__skb_gro_checksum_validate_needed : skipping BTF encoding of function due to param count mismatch; 3 params != 1 params
>   -__skb_gro_checksum_validate_needed : skipping BTF encoding of function due to inconsistet prototype
>    __task_rq_unlock : skipping BTF encoding of function due to unexpected register usage for parameter
>    __tracing_open : skipping BTF encoding of function due to unexpected register usage for parameter
>    __tty_buffer_request_room : skipping BTF encoding of function due to unexpected register usage for parameter
>   @@ -63,44 +46,28 @@
>   ...
> 
> With true signature enabled, this patch allows more BTF functions.
> 
> Signed-off-by: Yonghong Song <[email protected]>

Applied, thanks.

Alan