Thread (76 messages) flat view 76 messages, 6 authors, 2021-07-07

Re: [PATCH 15/19] libbpf: Add support to link multi func tracing program

From: Jiri Olsa <hidden>
Date: 2021-06-07 18:28:57
Also in: bpf

On Sun, Jun 06, 2021 at 10:49:16PM -0700, Yonghong Song wrote:

On 6/5/21 4:10 AM, Jiri Olsa wrote:
quoted
Adding support to link multi func tracing program
through link_create interface.

Adding special types for multi func programs:

   fentry.multi
   fexit.multi

so you can define multi func programs like:

   SEC("fentry.multi/bpf_fentry_test*")
   int BPF_PROG(test1, unsigned long ip, __u64 a, __u64 b, __u64 c, __u64 d, __u64 e, __u64 f)

that defines test1 to be attached to bpf_fentry_test* functions,
and able to attach ip and 6 arguments.

If functions are not specified the program needs to be attached
manually.

Adding new btf id related fields to bpf_link_create_opts and
bpf_link_create to use them.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
  tools/lib/bpf/bpf.c    | 11 ++++++-
  tools/lib/bpf/bpf.h    |  4 ++-
  tools/lib/bpf/libbpf.c | 72 ++++++++++++++++++++++++++++++++++++++++++
  3 files changed, 85 insertions(+), 2 deletions(-)
diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c
index 86dcac44f32f..da892737b522 100644
--- a/tools/lib/bpf/bpf.c
+++ b/tools/lib/bpf/bpf.c
@@ -674,7 +674,8 @@ int bpf_link_create(int prog_fd, int target_fd,
  		    enum bpf_attach_type attach_type,
  		    const struct bpf_link_create_opts *opts)
  {
-	__u32 target_btf_id, iter_info_len;
+	__u32 target_btf_id, iter_info_len, multi_btf_ids_cnt;
+	__s32 *multi_btf_ids;
  	union bpf_attr attr;
  	int fd;
[...]
quoted
@@ -9584,6 +9597,9 @@ static int libbpf_find_attach_btf_id(struct bpf_program *prog, int *btf_obj_fd,
  	if (!name)
  		return -EINVAL;
+	if (prog->prog_flags & BPF_F_MULTI_FUNC)
+		return 0;
+
  	for (i = 0; i < ARRAY_SIZE(section_defs); i++) {
  		if (!section_defs[i].is_attach_btf)
  			continue;
@@ -10537,6 +10553,62 @@ static struct bpf_link *bpf_program__attach_btf_id(struct bpf_program *prog)
  	return (struct bpf_link *)link;
  }
+static struct bpf_link *bpf_program__attach_multi(struct bpf_program *prog)
+{
+	char *pattern = prog->sec_name + prog->sec_def->len;
+	DECLARE_LIBBPF_OPTS(bpf_link_create_opts, opts);
+	enum bpf_attach_type attach_type;
+	int prog_fd, link_fd, cnt, err;
+	struct bpf_link *link = NULL;
+	__s32 *ids = NULL;
+
+	prog_fd = bpf_program__fd(prog);
+	if (prog_fd < 0) {
+		pr_warn("prog '%s': can't attach before loaded\n", prog->name);
+		return ERR_PTR(-EINVAL);
+	}
+
+	err = bpf_object__load_vmlinux_btf(prog->obj, true);
+	if (err)
+		return ERR_PTR(err);
+
+	cnt = btf__find_by_pattern_kind(prog->obj->btf_vmlinux, pattern,
+					BTF_KIND_FUNC, &ids);
+	if (cnt <= 0)
+		return ERR_PTR(-EINVAL);
In kernel, looks like we support cnt = 0, here we error out.
Should we also error out in the kernel if cnt == 0?
hum, I'm not what you mean.. what kernel code are you referring to?

thanks,
jirka
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help