mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-12 01:20:14 +00:00
bpf: Allow union argument in trampoline based programs
Currently, functions with 'union' arguments cannot be traced with
fentry/fexit:
bpftrace -e 'fentry:release_pages { exit(); }' -v
The function release_pages arg0 type UNION is unsupported.
The type of the 'release_pages' arg0 is defined as:
typedef union {
struct page **pages;
struct folio **folios;
struct encoded_page **encoded_pages;
} release_pages_arg __attribute__ ((__transparent_union__));
This patch relaxes the restriction by allowing function arguments of type
'union' to be traced in verifier.
Reviewed-by: Amery Hung <ameryhung@gmail.com>
Signed-off-by: Leon Hwang <leon.hwang@linux.dev>
Link: https://lore.kernel.org/r/20250919044110.23729-2-leon.hwang@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
2383e45f1d
commit
ccb4f5d91e
@ -1128,7 +1128,7 @@ struct bpf_prog_offload {
|
||||
*/
|
||||
#define MAX_BPF_FUNC_REG_ARGS 5
|
||||
|
||||
/* The argument is a structure. */
|
||||
/* The argument is a structure or a union. */
|
||||
#define BTF_FMODEL_STRUCT_ARG BIT(0)
|
||||
|
||||
/* The argument is signed. */
|
||||
|
||||
@ -6751,7 +6751,7 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type,
|
||||
/* skip modifiers */
|
||||
while (btf_type_is_modifier(t))
|
||||
t = btf_type_by_id(btf, t->type);
|
||||
if (btf_type_is_small_int(t) || btf_is_any_enum(t) || __btf_type_is_struct(t))
|
||||
if (btf_type_is_small_int(t) || btf_is_any_enum(t) || btf_type_is_struct(t))
|
||||
/* accessing a scalar */
|
||||
return true;
|
||||
if (!btf_type_is_ptr(t)) {
|
||||
@ -7323,7 +7323,7 @@ static int __get_type_size(struct btf *btf, u32 btf_id,
|
||||
if (btf_type_is_ptr(t))
|
||||
/* kernel size of pointer. Not BPF's size of pointer*/
|
||||
return sizeof(void *);
|
||||
if (btf_type_is_int(t) || btf_is_any_enum(t) || __btf_type_is_struct(t))
|
||||
if (btf_type_is_int(t) || btf_is_any_enum(t) || btf_type_is_struct(t))
|
||||
return t->size;
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -7332,7 +7332,7 @@ static u8 __get_type_fmodel_flags(const struct btf_type *t)
|
||||
{
|
||||
u8 flags = 0;
|
||||
|
||||
if (__btf_type_is_struct(t))
|
||||
if (btf_type_is_struct(t))
|
||||
flags |= BTF_FMODEL_STRUCT_ARG;
|
||||
if (btf_type_is_signed_int(t))
|
||||
flags |= BTF_FMODEL_SIGNED_ARG;
|
||||
@ -7373,7 +7373,7 @@ int btf_distill_func_proto(struct bpf_verifier_log *log,
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = __get_type_size(btf, func->type, &t);
|
||||
if (ret < 0 || __btf_type_is_struct(t)) {
|
||||
if (ret < 0 || btf_type_is_struct(t)) {
|
||||
bpf_log(log,
|
||||
"The function %s return type %s is unsupported.\n",
|
||||
tname, btf_type_str(t));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user