From: Hou Tao <houtao1@xxxxxxxxxx> For map with bpf_dynptr-typed key, lookup and update procedures will use bpf_dynptr_get_size() to get the length of key, and iteration procedure will use bpf_dynptr_set_size() to set the length of returned key. The implementation of bpf_dynptr_set_size() is taken from Joanne's patch "bpf: Add bpf_dynptr_trim and bpf_dynptr_advance". Also add a const qualifier to dynptr argument of bpf_dynptr_get_size(). Signed-off-by: Hou Tao <houtao1@xxxxxxxxxx> --- include/linux/bpf.h | 3 ++- kernel/bpf/helpers.c | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index edd43edb27d6..66a18dc67b46 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -2660,7 +2660,8 @@ 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); -u32 bpf_dynptr_get_size(struct bpf_dynptr_kern *ptr); +u32 bpf_dynptr_get_size(const struct bpf_dynptr_kern *ptr); +void bpf_dynptr_set_size(struct bpf_dynptr_kern *ptr, u32 new_size); #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 b069517a3da0..a9ca2de8f8cd 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -1408,11 +1408,18 @@ static void bpf_dynptr_set_type(struct bpf_dynptr_kern *ptr, enum bpf_dynptr_typ ptr->size |= type << DYNPTR_TYPE_SHIFT; } -u32 bpf_dynptr_get_size(struct bpf_dynptr_kern *ptr) +u32 bpf_dynptr_get_size(const struct bpf_dynptr_kern *ptr) { return ptr->size & DYNPTR_SIZE_MASK; } +void bpf_dynptr_set_size(struct bpf_dynptr_kern *ptr, u32 new_size) +{ + u32 metadata = ptr->size & ~DYNPTR_SIZE_MASK; + + ptr->size = new_size | metadata; +} + int bpf_dynptr_check_size(u32 size) { return size > DYNPTR_MAX_SIZE ? -E2BIG : 0; -- 2.29.2