mirror of
https://github.com/torvalds/linux.git
synced 2025-11-03 18:20:25 +02:00
libbpf: Implement bpf_usdt_arg_size BPF function
Information about USDT argument size is implicitly stored in __bpf_usdt_arg_spec, but currently it's not accessbile to BPF programs that use USDT. Implement bpf_sdt_arg_size() that returns the size of an USDT argument in bytes. v1->v2: * do not add __bpf_usdt_arg_spec() helper v1: https://lore.kernel.org/bpf/20250220215904.3362709-1-ihor.solodrai@linux.dev/ Suggested-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Reviewed-by: Jiri Olsa <jolsa@kernel.org> Link: https://lore.kernel.org/bpf/20250224235756.2612606-1-ihor.solodrai@linux.dev
This commit is contained in:
parent
4580f4e0eb
commit
b62dff1440
1 changed files with 32 additions and 0 deletions
|
|
@ -108,6 +108,38 @@ int bpf_usdt_arg_cnt(struct pt_regs *ctx)
|
||||||
return spec->arg_cnt;
|
return spec->arg_cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns the size in bytes of the #*arg_num* (zero-indexed) USDT argument.
|
||||||
|
* Returns negative error if argument is not found or arg_num is invalid.
|
||||||
|
*/
|
||||||
|
static __always_inline
|
||||||
|
int bpf_usdt_arg_size(struct pt_regs *ctx, __u64 arg_num)
|
||||||
|
{
|
||||||
|
struct __bpf_usdt_arg_spec *arg_spec;
|
||||||
|
struct __bpf_usdt_spec *spec;
|
||||||
|
int spec_id;
|
||||||
|
|
||||||
|
spec_id = __bpf_usdt_spec_id(ctx);
|
||||||
|
if (spec_id < 0)
|
||||||
|
return -ESRCH;
|
||||||
|
|
||||||
|
spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id);
|
||||||
|
if (!spec)
|
||||||
|
return -ESRCH;
|
||||||
|
|
||||||
|
if (arg_num >= BPF_USDT_MAX_ARG_CNT)
|
||||||
|
return -ENOENT;
|
||||||
|
barrier_var(arg_num);
|
||||||
|
if (arg_num >= spec->arg_cnt)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
arg_spec = &spec->args[arg_num];
|
||||||
|
|
||||||
|
/* arg_spec->arg_bitshift = 64 - arg_sz * 8
|
||||||
|
* so: arg_sz = (64 - arg_spec->arg_bitshift) / 8
|
||||||
|
*/
|
||||||
|
return (unsigned int)(64 - arg_spec->arg_bitshift) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
/* Fetch USDT argument #*arg_num* (zero-indexed) and put its value into *res.
|
/* Fetch USDT argument #*arg_num* (zero-indexed) and put its value into *res.
|
||||||
* Returns 0 on success; negative error, otherwise.
|
* Returns 0 on success; negative error, otherwise.
|
||||||
* On error *res is guaranteed to be set to zero.
|
* On error *res is guaranteed to be set to zero.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue