]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bpf: extract map key pointer calculation
authorMykyta Yatsenko <yatsenko@meta.com>
Tue, 23 Sep 2025 11:24:01 +0000 (12:24 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 23 Sep 2025 14:34:38 +0000 (07:34 -0700)
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@meta.com>
Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20250923112404.668720-7-mykyta.yatsenko5@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/helpers.c

index 7f5e528df13b6c850c987e5c8821a2488cb42e62..c28f48a310e353cd85eb1e2df48099bd09f243a0 100644 (file)
@@ -1082,6 +1082,17 @@ 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);
+
+               *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;
@@ -1164,15 +1175,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. */
@@ -1198,15 +1202,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();