[PATCH bpf-next v2 08/15] libbpf: sync progs autoload with maps autocreate for struct_ops maps

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux