Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

libbpf: Support init of inner maps in light skeleton.

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

authored by

Alexei Starovoitov and committed by
Andrii Nakryiko
be05c944 d0e92887

+31 -3
+1
tools/lib/bpf/bpf_gen_internal.h
··· 67 67 void bpf_gen__record_extern(struct bpf_gen *gen, const char *name, bool is_weak, 68 68 bool is_typeless, int kind, int insn_idx); 69 69 void bpf_gen__record_relo_core(struct bpf_gen *gen, const struct bpf_core_relo *core_relo); 70 + void bpf_gen__populate_outer_map(struct bpf_gen *gen, int outer_map_idx, int key, int inner_map_idx); 70 71 71 72 #endif
+27
tools/lib/bpf/gen_loader.c
··· 1053 1053 emit_check_err(gen); 1054 1054 } 1055 1055 1056 + void bpf_gen__populate_outer_map(struct bpf_gen *gen, int outer_map_idx, int slot, 1057 + int inner_map_idx) 1058 + { 1059 + int attr_size = offsetofend(union bpf_attr, flags); 1060 + int map_update_attr, key; 1061 + union bpf_attr attr; 1062 + 1063 + memset(&attr, 0, attr_size); 1064 + pr_debug("gen: populate_outer_map: outer %d key %d inner %d\n", 1065 + outer_map_idx, slot, inner_map_idx); 1066 + 1067 + key = add_data(gen, &slot, sizeof(slot)); 1068 + 1069 + map_update_attr = add_data(gen, &attr, attr_size); 1070 + move_blob2blob(gen, attr_field(map_update_attr, map_fd), 4, 1071 + blob_fd_array_off(gen, outer_map_idx)); 1072 + emit_rel_store(gen, attr_field(map_update_attr, key), key); 1073 + emit_rel_store(gen, attr_field(map_update_attr, value), 1074 + blob_fd_array_off(gen, inner_map_idx)); 1075 + 1076 + /* emit MAP_UPDATE_ELEM command */ 1077 + emit_sys_bpf(gen, BPF_MAP_UPDATE_ELEM, map_update_attr, attr_size); 1078 + debug_ret(gen, "populate_outer_map outer %d key %d inner %d", 1079 + outer_map_idx, slot, inner_map_idx); 1080 + emit_check_err(gen); 1081 + } 1082 + 1056 1083 void bpf_gen__map_freeze(struct bpf_gen *gen, int map_idx) 1057 1084 { 1058 1085 int attr_size = offsetofend(union bpf_attr, map_fd);
+3 -3
tools/lib/bpf/libbpf.c
··· 4971 4971 fd = bpf_map__fd(targ_map); 4972 4972 4973 4973 if (obj->gen_loader) { 4974 - pr_warn("// TODO map_update_elem: idx %td key %d value==map_idx %td\n", 4975 - map - obj->maps, i, targ_map - obj->maps); 4976 - return -ENOTSUP; 4974 + bpf_gen__populate_outer_map(obj->gen_loader, 4975 + map - obj->maps, i, 4976 + targ_map - obj->maps); 4977 4977 } else { 4978 4978 err = bpf_map_update_elem(map->fd, &i, &fd, 0); 4979 4979 }