mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
selftests/bpf: Adjust fexit_bpf2bpf ctx layout for llvm23 true signature
test_pkt_access_subprog2() is defined in C as int test_pkt_access_subprog2(int val, volatile struct __sk_buff *skb) but llvm optimizes away the unused 'int val' argument. Before llvm23 the BTF signature did not match the optimized assembly, so the verifier set attach_func_proto to NULL and fell back to MAX_BPF_FUNC_REG_ARGS (5) u64 arguments (see btf_ctx_access()). The fexit ctx struct therefore placed the return value after args[5]. With llvm23 the 'true' signature int test_pkt_access_subprog2(volatile struct __sk_buff *skb) is recorded in BTF, so nr_args becomes 1 and the return value moves to the slot right after args[1]. Select the matching args_subprog2 layout based on __clang_major__ so the test works with both old and new llvm. Signed-off-by: Yonghong Song <yonghong.song@linux.dev> Link: https://lore.kernel.org/r/20260609233412.2712178-1-yonghong.song@linux.dev Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
be1d838b88
commit
e775c522a4
|
|
@ -53,14 +53,23 @@ int BPF_PROG(test_subprog1, struct sk_buff *skb, int ret)
|
|||
* r0 = *(u32 *)(r1 + 0)
|
||||
* w0 <<= 1
|
||||
* exit
|
||||
* In such case the verifier falls back to conservative and
|
||||
* Before llvm23, in such case the verifier falls back to conservative and
|
||||
* tracing program can access arguments and return value as u64
|
||||
* instead of accurate types.
|
||||
* instead of accurate types. With llvm23, the true signature
|
||||
* int test_pkt_access_subprog2(volatile struct __sk_buff *skb)
|
||||
* is available in btf.
|
||||
*/
|
||||
#if __clang_major__ >= 23
|
||||
struct args_subprog2 {
|
||||
__u64 args[1];
|
||||
__u64 ret;
|
||||
};
|
||||
#else
|
||||
struct args_subprog2 {
|
||||
__u64 args[5];
|
||||
__u64 ret;
|
||||
};
|
||||
#endif
|
||||
__u64 test_result_subprog2 = 0;
|
||||
SEC("fexit/test_pkt_access_subprog2")
|
||||
int test_subprog2(struct args_subprog2 *ctx)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user