OSDN Git Service

bpf: Add zero_map_value to zero map value with special fields
authorKumar Kartikeya Dwivedi <memxor@gmail.com>
Sun, 4 Sep 2022 20:41:16 +0000 (22:41 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 7 Sep 2022 18:46:34 +0000 (11:46 -0700)
We need this helper to skip over special fields (bpf_spin_lock,
bpf_timer, kptrs) while zeroing a map value. Use the same logic as
copy_map_value but memset instead of memcpy.

Currently, the code zeroing map value memory does not have to deal with
special fields, hence this is a prerequisite for introducing such
support.

Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20220904204145.3089-4-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/linux/bpf.h

index 6a73e94..48ae050 100644 (file)
@@ -329,6 +329,25 @@ static inline void copy_map_value_long(struct bpf_map *map, void *dst, void *src
        __copy_map_value(map, dst, src, true);
 }
 
+static inline void zero_map_value(struct bpf_map *map, void *dst)
+{
+       u32 curr_off = 0;
+       int i;
+
+       if (likely(!map->off_arr)) {
+               memset(dst, 0, map->value_size);
+               return;
+       }
+
+       for (i = 0; i < map->off_arr->cnt; i++) {
+               u32 next_off = map->off_arr->field_off[i];
+
+               memset(dst + curr_off, 0, next_off - curr_off);
+               curr_off += map->off_arr->field_sz[i];
+       }
+       memset(dst + curr_off, 0, map->value_size - curr_off);
+}
+
 void copy_map_value_locked(struct bpf_map *map, void *dst, void *src,
                           bool lock_src);
 void bpf_timer_cancel_and_free(void *timer);