The task of calculating bpf_dynptr_kern's available size, and the current (offset) data pointer is common for BPF functions working with ARG_PTR_TO_DYNPTR parameters. Introduce 'bpf_dynptr_get_data' which returns the current data (with properer offset), and the number of usable bytes it has. This will void callers from directly calculating bpf_dynptr_kern's data, offset and size. Signed-off-by: Shmulik Ladkani <shmulik.ladkani@xxxxxxxxx> --- v5: - fix bpf_dynptr_get_data's incorrect usage of bpf_dynptr_kern's size spotted by Joanne Koong <joannelkoong@xxxxxxxxx> --- include/linux/bpf.h | 1 + kernel/bpf/helpers.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 99fc7a64564f..d84d37bda87f 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -2577,6 +2577,7 @@ void bpf_dynptr_init(struct bpf_dynptr_kern *ptr, void *data, enum bpf_dynptr_type type, u32 offset, u32 size); void bpf_dynptr_set_null(struct bpf_dynptr_kern *ptr); int bpf_dynptr_check_size(u32 size); +void *bpf_dynptr_get_data(struct bpf_dynptr_kern *ptr, u32 *avail_bytes); #ifdef CONFIG_BPF_LSM void bpf_cgroup_atype_get(u32 attach_btf_id, int cgroup_atype); diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index fc08035f14ed..96ff93941cae 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -1427,6 +1427,14 @@ void bpf_dynptr_init(struct bpf_dynptr_kern *ptr, void *data, bpf_dynptr_set_type(ptr, type); } +void *bpf_dynptr_get_data(struct bpf_dynptr_kern *ptr, u32 *avail_bytes) +{ + if (!ptr->data) + return NULL; + *avail_bytes = bpf_dynptr_get_size(ptr); + return ptr->data + ptr->offset; +} + void bpf_dynptr_set_null(struct bpf_dynptr_kern *ptr) { memset(ptr, 0, sizeof(*ptr)); -- 2.37.2