OSDN Git Service

libbpf: Support init of inner maps in light skeleton.
authorAlexei Starovoitov <ast@kernel.org>
Wed, 1 Dec 2021 18:10:33 +0000 (10:10 -0800)
committerAndrii Nakryiko <andrii@kernel.org>
Thu, 2 Dec 2021 19:18:35 +0000 (11:18 -0800)
Add ability to initialize inner maps in light skeleton.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20211201181040.23337-11-alexei.starovoitov@gmail.com
tools/lib/bpf/bpf_gen_internal.h
tools/lib/bpf/gen_loader.c
tools/lib/bpf/libbpf.c

index 9d57fa8..9dd5f76 100644 (file)
@@ -67,5 +67,6 @@ void bpf_gen__record_attach_target(struct bpf_gen *gen, const char *name, enum b
 void bpf_gen__record_extern(struct bpf_gen *gen, const char *name, bool is_weak,
                            bool is_typeless, int kind, int insn_idx);
 void bpf_gen__record_relo_core(struct bpf_gen *gen, const struct bpf_core_relo *core_relo);
+void bpf_gen__populate_outer_map(struct bpf_gen *gen, int outer_map_idx, int key, int inner_map_idx);
 
 #endif
index 87d385e..ed0e949 100644 (file)
@@ -1053,6 +1053,33 @@ void bpf_gen__map_update_elem(struct bpf_gen *gen, int map_idx, void *pvalue,
        emit_check_err(gen);
 }
 
+void bpf_gen__populate_outer_map(struct bpf_gen *gen, int outer_map_idx, int slot,
+                                int inner_map_idx)
+{
+       int attr_size = offsetofend(union bpf_attr, flags);
+       int map_update_attr, key;
+       union bpf_attr attr;
+
+       memset(&attr, 0, attr_size);
+       pr_debug("gen: populate_outer_map: outer %d key %d inner %d\n",
+                outer_map_idx, slot, inner_map_idx);
+
+       key = add_data(gen, &slot, sizeof(slot));
+
+       map_update_attr = add_data(gen, &attr, attr_size);
+       move_blob2blob(gen, attr_field(map_update_attr, map_fd), 4,
+                      blob_fd_array_off(gen, outer_map_idx));
+       emit_rel_store(gen, attr_field(map_update_attr, key), key);
+       emit_rel_store(gen, attr_field(map_update_attr, value),
+                      blob_fd_array_off(gen, inner_map_idx));
+
+       /* emit MAP_UPDATE_ELEM command */
+       emit_sys_bpf(gen, BPF_MAP_UPDATE_ELEM, map_update_attr, attr_size);
+       debug_ret(gen, "populate_outer_map outer %d key %d inner %d",
+                 outer_map_idx, slot, inner_map_idx);
+       emit_check_err(gen);
+}
+
 void bpf_gen__map_freeze(struct bpf_gen *gen, int map_idx)
 {
        int attr_size = offsetofend(union bpf_attr, map_fd);
index 831c12e..1341ce5 100644 (file)
@@ -4971,9 +4971,9 @@ static int init_map_in_map_slots(struct bpf_object *obj, struct bpf_map *map)
                fd = bpf_map__fd(targ_map);
 
                if (obj->gen_loader) {
-                       pr_warn("// TODO map_update_elem: idx %td key %d value==map_idx %td\n",
-                               map - obj->maps, i, targ_map - obj->maps);
-                       return -ENOTSUP;
+                       bpf_gen__populate_outer_map(obj->gen_loader,
+                                                   map - obj->maps, i,
+                                                   targ_map - obj->maps);
                } else {
                        err = bpf_map_update_elem(map->fd, &i, &fd, 0);
                }