On Wed, 6 Aug 2025 at 16:46, Mykyta Yatsenko <mykyta.yatsenko5@xxxxxxxxx> wrote: > > From: Mykyta Yatsenko <yatsenko@xxxxxxxx> > > Calculation of the BPF map key, given the pointer to a value is > duplicated in a couple of places in helpers already, in the next patch > another use case is introduced as well. > This patch extracts that functionality into a separate function. > > Signed-off-by: Mykyta Yatsenko <yatsenko@xxxxxxxx> > --- Acked-by: Kumar Kartikeya Dwivedi <memxor@xxxxxxxxx> > kernel/bpf/helpers.c | 31 ++++++++++++++----------------- > 1 file changed, 14 insertions(+), 17 deletions(-) > > diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c > index 322ffcaedc38..516286f67f0d 100644 > --- a/kernel/bpf/helpers.c > +++ b/kernel/bpf/helpers.c > @@ -1084,6 +1084,18 @@ const struct bpf_func_proto bpf_snprintf_proto = { > .arg5_type = ARG_CONST_SIZE_OR_ZERO, > }; > > +static void *map_key_from_value(struct bpf_map *map, void *value, u32 *arr_idx) > +{ > + if (map->map_type == BPF_MAP_TYPE_ARRAY) { > + struct bpf_array *array = > + container_of(map, struct bpf_array, map); nit: Can we keep it on the same line? > + > + *arr_idx = ((char *)value - array->value) / array->elem_size; > + return arr_idx; > + } > + return (void *)value - round_up(map->key_size, 8); > +} > + > struct bpf_async_cb { > struct bpf_map *map; > struct bpf_prog *prog; > @@ -1166,15 +1178,8 @@ static enum hrtimer_restart bpf_timer_cb(struct hrtimer *hrtimer) > * bpf_map_delete_elem() on the same timer. > */ > this_cpu_write(hrtimer_running, t); > - if (map->map_type == BPF_MAP_TYPE_ARRAY) { > - struct bpf_array *array = container_of(map, struct bpf_array, map); > > - /* compute the key */ > - idx = ((char *)value - array->value) / array->elem_size; > - key = &idx; > - } else { /* hash or lru */ > - key = value - round_up(map->key_size, 8); > - } > + key = map_key_from_value(map, value, &idx); > > callback_fn((u64)(long)map, (u64)(long)key, (u64)(long)value, 0, 0); > /* The verifier checked that return value is zero. */ > @@ -1200,15 +1205,7 @@ static void bpf_wq_work(struct work_struct *work) > if (!callback_fn) > return; > > - if (map->map_type == BPF_MAP_TYPE_ARRAY) { > - struct bpf_array *array = container_of(map, struct bpf_array, map); > - > - /* compute the key */ > - idx = ((char *)value - array->value) / array->elem_size; > - key = &idx; > - } else { /* hash or lru */ > - key = value - round_up(map->key_size, 8); > - } > + key = map_key_from_value(map, value, &idx); > > rcu_read_lock_trace(); > migrate_disable(); > -- > 2.50.1 > >