]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
libbpf: Struct_ops in SEC("?.struct_ops") / SEC("?.struct_ops.link")
authorEduard Zingerman <eddyz87@gmail.com>
Wed, 6 Mar 2024 10:45:25 +0000 (12:45 +0200)
committerAndrii Nakryiko <andrii@kernel.org>
Wed, 6 Mar 2024 23:18:16 +0000 (15:18 -0800)
Allow using two new section names for struct_ops maps:
- SEC("?.struct_ops")
- SEC("?.struct_ops.link")

To specify maps that have bpf_map->autocreate == false after open.

Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20240306104529.6453-12-eddyz87@gmail.com
tools/lib/bpf/libbpf.c

index cff72de42bf4b265b2421605b96aad4bb528b1c8..ec0f508b853d2bfb2c61f330d83b6249720adf08 100644 (file)
@@ -1322,6 +1322,15 @@ static int init_struct_ops_maps(struct bpf_object *obj, const char *sec_name,
                        return -ENOMEM;
                map->btf_value_type_id = type_id;
 
+               /* Follow same convention as for programs autoload:
+                * SEC("?.struct_ops") means map is not created by default.
+                */
+               if (sec_name[0] == '?') {
+                       map->autocreate = false;
+                       /* from now on forget there was ? in section name */
+                       sec_name++;
+               }
+
                map->def.type = BPF_MAP_TYPE_STRUCT_OPS;
                map->def.key_size = sizeof(int);
                map->def.value_size = type->size;
@@ -3685,7 +3694,9 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
                                sec_desc->shdr = sh;
                                sec_desc->data = data;
                        } else if (strcmp(name, STRUCT_OPS_SEC) == 0 ||
-                                  strcmp(name, STRUCT_OPS_LINK_SEC) == 0) {
+                                  strcmp(name, STRUCT_OPS_LINK_SEC) == 0 ||
+                                  strcmp(name, "?" STRUCT_OPS_SEC) == 0 ||
+                                  strcmp(name, "?" STRUCT_OPS_LINK_SEC) == 0) {
                                sec_desc->sec_type = SEC_ST_OPS;
                                sec_desc->shdr = sh;
                                sec_desc->data = data;
@@ -3705,6 +3716,8 @@ static int bpf_object__elf_collect(struct bpf_object *obj)
                        if (!section_have_execinstr(obj, targ_sec_idx) &&
                            strcmp(name, ".rel" STRUCT_OPS_SEC) &&
                            strcmp(name, ".rel" STRUCT_OPS_LINK_SEC) &&
+                           strcmp(name, ".rel?" STRUCT_OPS_SEC) &&
+                           strcmp(name, ".rel?" STRUCT_OPS_LINK_SEC) &&
                            strcmp(name, ".rel" MAPS_ELF_SEC)) {
                                pr_info("elf: skipping relo section(%d) %s for section(%d) %s\n",
                                        idx, name, targ_sec_idx,