Skip to content

Commit 8db0526

Browse files
eddyz87anakryiko
authored andcommitted
libbpf: Honor autocreate flag for struct_ops maps
Skip load steps for struct_ops maps not marked for automatic creation. This should allow to load bpf object in situations like below: SEC("struct_ops/foo") int BPF_PROG(foo) { ... } SEC("struct_ops/bar") int BPF_PROG(bar) { ... } struct test_ops___v1 { int (*foo)(void); }; struct test_ops___v2 { int (*foo)(void); int (*does_not_exist)(void); }; SEC(".struct_ops.link") struct test_ops___v1 map_for_old = { .test_1 = (void *)foo }; SEC(".struct_ops.link") struct test_ops___v2 map_for_new = { .test_1 = (void *)foo, .does_not_exist = (void *)bar }; Suppose program is loaded on old kernel that does not have definition for 'does_not_exist' struct_ops member. After this commit it would be possible to load such object file after the following tweaks: bpf_program__set_autoload(skel->progs.bar, false); bpf_map__set_autocreate(skel->maps.map_for_new, false); Signed-off-by: Eduard Zingerman <[email protected]> Signed-off-by: Andrii Nakryiko <[email protected]> Acked-by: David Vernet <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent d9ab2f7 commit 8db0526

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

tools/lib/bpf/libbpf.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,6 +1212,9 @@ static int bpf_object__init_kern_struct_ops_maps(struct bpf_object *obj)
12121212
if (!bpf_map__is_struct_ops(map))
12131213
continue;
12141214

1215+
if (!map->autocreate)
1216+
continue;
1217+
12151218
err = bpf_map__init_kern_struct_ops(map);
12161219
if (err)
12171220
return err;
@@ -8133,11 +8136,20 @@ static void bpf_map_prepare_vdata(const struct bpf_map *map)
81338136

81348137
static int bpf_object_prepare_struct_ops(struct bpf_object *obj)
81358138
{
8139+
struct bpf_map *map;
81368140
int i;
81378141

8138-
for (i = 0; i < obj->nr_maps; i++)
8139-
if (bpf_map__is_struct_ops(&obj->maps[i]))
8140-
bpf_map_prepare_vdata(&obj->maps[i]);
8142+
for (i = 0; i < obj->nr_maps; i++) {
8143+
map = &obj->maps[i];
8144+
8145+
if (!bpf_map__is_struct_ops(map))
8146+
continue;
8147+
8148+
if (!map->autocreate)
8149+
continue;
8150+
8151+
bpf_map_prepare_vdata(map);
8152+
}
81418153

81428154
return 0;
81438155
}

0 commit comments

Comments
 (0)