]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
bpf: Add arraymap support for bpf_for_each_map_elem() helper
authorYonghong Song <yhs@fb.com>
Fri, 26 Feb 2021 20:49:28 +0000 (12:49 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 26 Feb 2021 21:23:52 +0000 (13:23 -0800)
This patch added support for arraymap and percpu arraymap.

Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20210226204928.3885192-1-yhs@fb.com
kernel/bpf/arraymap.c

index 1f8453343bf2df5586d68f683e16dead1a786c2b..463d25e1e67e7bdda9a5583fd5d49c18d1831330 100644 (file)
@@ -625,6 +625,42 @@ static const struct bpf_iter_seq_info iter_seq_info = {
        .seq_priv_size          = sizeof(struct bpf_iter_seq_array_map_info),
 };
 
+static int bpf_for_each_array_elem(struct bpf_map *map, void *callback_fn,
+                                  void *callback_ctx, u64 flags)
+{
+       u32 i, key, num_elems = 0;
+       struct bpf_array *array;
+       bool is_percpu;
+       u64 ret = 0;
+       void *val;
+
+       if (flags != 0)
+               return -EINVAL;
+
+       is_percpu = map->map_type == BPF_MAP_TYPE_PERCPU_ARRAY;
+       array = container_of(map, struct bpf_array, map);
+       if (is_percpu)
+               migrate_disable();
+       for (i = 0; i < map->max_entries; i++) {
+               if (is_percpu)
+                       val = this_cpu_ptr(array->pptrs[i]);
+               else
+                       val = array->value + array->elem_size * i;
+               num_elems++;
+               key = i;
+               ret = BPF_CAST_CALL(callback_fn)((u64)(long)map,
+                                       (u64)(long)&key, (u64)(long)val,
+                                       (u64)(long)callback_ctx, 0);
+               /* return value: 0 - continue, 1 - stop and return */
+               if (ret)
+                       break;
+       }
+
+       if (is_percpu)
+               migrate_enable();
+       return num_elems;
+}
+
 static int array_map_btf_id;
 const struct bpf_map_ops array_map_ops = {
        .map_meta_equal = array_map_meta_equal,
@@ -643,6 +679,8 @@ const struct bpf_map_ops array_map_ops = {
        .map_check_btf = array_map_check_btf,
        .map_lookup_batch = generic_map_lookup_batch,
        .map_update_batch = generic_map_update_batch,
+       .map_set_for_each_callback_args = map_set_for_each_callback_args,
+       .map_for_each_callback = bpf_for_each_array_elem,
        .map_btf_name = "bpf_array",
        .map_btf_id = &array_map_btf_id,
        .iter_seq_info = &iter_seq_info,
@@ -660,6 +698,8 @@ const struct bpf_map_ops percpu_array_map_ops = {
        .map_delete_elem = array_map_delete_elem,
        .map_seq_show_elem = percpu_array_map_seq_show_elem,
        .map_check_btf = array_map_check_btf,
+       .map_set_for_each_callback_args = map_set_for_each_callback_args,
+       .map_for_each_callback = bpf_for_each_array_elem,
        .map_btf_name = "bpf_array",
        .map_btf_id = &percpu_array_map_btf_id,
        .iter_seq_info = &iter_seq_info,