Automatically select which struct_ops programs to load depending on which struct_ops maps are selected for automatic creation. E.g. for the BPF code below: SEC("struct_ops/test_1") int BPF_PROG(foo) { ... } SEC("struct_ops/test_2") int BPF_PROG(bar) { ... } SEC(".struct_ops.link") struct test_ops___v1 A = { .foo = (void *)foo }; SEC(".struct_ops.link") struct test_ops___v2 B = { .foo = (void *)foo, .bar = (void *)bar, }; And the following libbpf API calls: bpf_map__set_autocreate(skel->maps.A, true); bpf_map__set_autocreate(skel->maps.B, false); The autoload would be enabled for program 'foo' and disabled for program 'bar'. To achieve this: - for struct_ops programs referenced from struct_ops maps set autoload property at open() to false; - when creating struct_ops maps set autoload property of referenced programs to true. (Note: struct_ops programs not referenced from any map would have their autoload property set to true by default. If attach_btf_id and expected_attach_type properties would not be specified for such programs manually, the load phase would fail). Signed-off-by: Eduard Zingerman <eddyz87@xxxxxxxxx> --- tools/lib/bpf/libbpf.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 25c452c20d7d..60d78badfc71 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -1151,6 +1151,7 @@ static int bpf_map__init_kern_struct_ops(struct bpf_map *map) * attach_btf_id and member_idx */ if (!prog->attach_btf_id) { + prog->autoload = true; prog->attach_btf_id = kern_type_id; prog->expected_attach_type = kern_member_idx; } @@ -3187,6 +3188,11 @@ static bool obj_needs_vmlinux_btf(const struct bpf_object *obj) } bpf_object__for_each_program(prog, obj) { + /* Note: struct_ops programs referenced from struct_ops maps + * would have their autoload reset to false after open(), + * but that is fine as corresponding map would trigger + * "needs_vmlinux_btf" anyways. + */ if (!prog->autoload) continue; if (prog_needs_vmlinux_btf(prog)) @@ -9452,6 +9458,12 @@ static int bpf_object__collect_st_ops_relos(struct bpf_object *obj, return -EINVAL; } + /* struct_ops programs autoload is computed depending + * on autocreate property of corresponding maps, + * see bpf_map__init_kern_struct_ops(). + */ + prog->autoload = false; + st_ops->progs[member_idx] = prog; /* st_ops->data will be exposed to users, being returned by -- 2.43.0