]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
libbpf: Init btf_{key,value}_type_id on internal map open
authorDelyan Kratunov <delyank@fb.com>
Wed, 16 Mar 2022 23:37:30 +0000 (23:37 +0000)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 18 Mar 2022 06:11:15 +0000 (23:11 -0700)
For internal and user maps, look up the key and value btf
types on open() and not load(), so that `bpf_map_btf_value_type_id`
is usable in `bpftool gen`.

Signed-off-by: Delyan Kratunov <delyank@fb.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/78dbe4e457b4a05e098fc6c8f50014b680c86e4e.1647473511.git.delyank@fb.com
tools/lib/bpf/libbpf.c

index 3b7eb6dcc2f47585cf130792d6022e1e7246a085..9de42d1556eee7ad25bdae0663164e0e6e38812d 100644 (file)
@@ -1517,6 +1517,9 @@ static char *internal_map_name(struct bpf_object *obj, const char *real_name)
        return strdup(map_name);
 }
 
+static int
+bpf_map_find_btf_info(struct bpf_object *obj, struct bpf_map *map);
+
 static int
 bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type,
                              const char *real_name, int sec_idx, void *data, size_t data_sz)
@@ -1564,6 +1567,9 @@ bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type,
                return err;
        }
 
+       /* failures are fine because of maps like .rodata.str1.1 */
+       (void) bpf_map_find_btf_info(obj, map);
+
        if (data)
                memcpy(map->mmaped, data, data_sz);
 
@@ -2046,6 +2052,9 @@ static int bpf_object__init_user_maps(struct bpf_object *obj, bool strict)
                        }
                        memcpy(&map->def, def, sizeof(struct bpf_map_def));
                }
+
+               /* btf info may not exist but fill it in if it does exist */
+               (void) bpf_map_find_btf_info(obj, map);
        }
        return 0;
 }
@@ -2534,6 +2543,10 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj,
                fill_map_from_def(map->inner_map, &inner_def);
        }
 
+       err = bpf_map_find_btf_info(obj, map);
+       if (err)
+               return err;
+
        return 0;
 }
 
@@ -4873,7 +4886,7 @@ static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map, b
        if (bpf_map__is_struct_ops(map))
                create_attr.btf_vmlinux_value_type_id = map->btf_vmlinux_value_type_id;
 
-       if (obj->btf && btf__fd(obj->btf) >= 0 && !bpf_map_find_btf_info(obj, map)) {
+       if (obj->btf && btf__fd(obj->btf) >= 0) {
                create_attr.btf_fd = btf__fd(obj->btf);
                create_attr.btf_key_type_id = map->btf_key_type_id;
                create_attr.btf_value_type_id = map->btf_value_type_id;