Skip to content

Commit 5bfdd32

Browse files
olsajiriAlexei Starovoitov
authored andcommitted
libbpf: Add support for u[ret]probe.multi[.s] program sections
Adding support for several uprobe_multi program sections to allow auto attach of multi_uprobe programs. Acked-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Jiri Olsa <jolsa@kernel.org> Link: https://lore.kernel.org/r/20230809083440.3209381-16-jolsa@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
1 parent 3140cf1 commit 5bfdd32

1 file changed

Lines changed: 36 additions & 0 deletions

File tree

tools/lib/bpf/libbpf.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8701,6 +8701,7 @@ static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_lin
87018701
static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link);
87028702
static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link);
87038703
static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8704+
static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link);
87048705
static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link);
87058706
static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link);
87068707

@@ -8716,6 +8717,10 @@ static const struct bpf_sec_def section_defs[] = {
87168717
SEC_DEF("uretprobe.s+", KPROBE, 0, SEC_SLEEPABLE, attach_uprobe),
87178718
SEC_DEF("kprobe.multi+", KPROBE, BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi),
87188719
SEC_DEF("kretprobe.multi+", KPROBE, BPF_TRACE_KPROBE_MULTI, SEC_NONE, attach_kprobe_multi),
8720+
SEC_DEF("uprobe.multi+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_NONE, attach_uprobe_multi),
8721+
SEC_DEF("uretprobe.multi+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_NONE, attach_uprobe_multi),
8722+
SEC_DEF("uprobe.multi.s+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_SLEEPABLE, attach_uprobe_multi),
8723+
SEC_DEF("uretprobe.multi.s+", KPROBE, BPF_TRACE_UPROBE_MULTI, SEC_SLEEPABLE, attach_uprobe_multi),
87198724
SEC_DEF("ksyscall+", KPROBE, 0, SEC_NONE, attach_ksyscall),
87208725
SEC_DEF("kretsyscall+", KPROBE, 0, SEC_NONE, attach_ksyscall),
87218726
SEC_DEF("usdt+", KPROBE, 0, SEC_NONE, attach_usdt),
@@ -10922,6 +10927,37 @@ static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, stru
1092210927
return libbpf_get_error(*link);
1092310928
}
1092410929

10930+
static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link)
10931+
{
10932+
char *probe_type = NULL, *binary_path = NULL, *func_name = NULL;
10933+
LIBBPF_OPTS(bpf_uprobe_multi_opts, opts);
10934+
int n, ret = -EINVAL;
10935+
10936+
*link = NULL;
10937+
10938+
n = sscanf(prog->sec_name, "%m[^/]/%m[^:]:%ms",
10939+
&probe_type, &binary_path, &func_name);
10940+
switch (n) {
10941+
case 1:
10942+
/* handle SEC("u[ret]probe") - format is valid, but auto-attach is impossible. */
10943+
ret = 0;
10944+
break;
10945+
case 3:
10946+
opts.retprobe = strcmp(probe_type, "uretprobe.multi") == 0;
10947+
*link = bpf_program__attach_uprobe_multi(prog, -1, binary_path, func_name, &opts);
10948+
ret = libbpf_get_error(*link);
10949+
break;
10950+
default:
10951+
pr_warn("prog '%s': invalid format of section definition '%s'\n", prog->name,
10952+
prog->sec_name);
10953+
break;
10954+
}
10955+
free(probe_type);
10956+
free(binary_path);
10957+
free(func_name);
10958+
return ret;
10959+
}
10960+
1092510961
static void gen_uprobe_legacy_event_name(char *buf, size_t buf_sz,
1092610962
const char *binary_path, uint64_t offset)
1092710963
{

0 commit comments

Comments
 (0)