Adding support to specify return prog file descriptor in struct bpf_kprobe_multi_opts. When the return_prog bool is set true the return_prog_fd is used as bpf program to be executed for the return probe. Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> --- tools/lib/bpf/bpf.c | 1 + tools/lib/bpf/bpf.h | 1 + tools/lib/bpf/libbpf.c | 5 +++++ tools/lib/bpf/libbpf.h | 6 +++++- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index 97ec005c3c47..9f296957bd30 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -771,6 +771,7 @@ int bpf_link_create(int prog_fd, int target_fd, attr.link_create.kprobe_multi.syms = ptr_to_u64(OPTS_GET(opts, kprobe_multi.syms, 0)); attr.link_create.kprobe_multi.addrs = ptr_to_u64(OPTS_GET(opts, kprobe_multi.addrs, 0)); attr.link_create.kprobe_multi.cookies = ptr_to_u64(OPTS_GET(opts, kprobe_multi.cookies, 0)); + attr.link_create.kprobe_multi.return_prog_fd = OPTS_GET(opts, kprobe_multi.return_prog_fd, 0); if (!OPTS_ZEROED(opts, kprobe_multi)) return libbpf_err(-EINVAL); break; diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h index f866e98b2436..e04a14134a21 100644 --- a/tools/lib/bpf/bpf.h +++ b/tools/lib/bpf/bpf.h @@ -399,6 +399,7 @@ struct bpf_link_create_opts { const char **syms; const unsigned long *addrs; const __u64 *cookies; + __u32 return_prog_fd; } kprobe_multi; struct { __u32 flags; diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 01f407591a92..022a68b9fe83 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -11073,6 +11073,11 @@ bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, lopts.kprobe_multi.cnt = cnt; lopts.kprobe_multi.flags = retprobe ? BPF_F_KPROBE_MULTI_RETURN : 0; + if (OPTS_GET(opts, return_prog, false)) { + lopts.kprobe_multi.return_prog_fd = OPTS_GET(opts, return_prog_fd, 0); + lopts.kprobe_multi.flags |= BPF_F_KPROBE_MULTI_RETURN_PROG; + } + link = calloc(1, sizeof(*link)); if (!link) { err = -ENOMEM; diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 5723cbbfcc41..d77b953009d6 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -539,10 +539,14 @@ struct bpf_kprobe_multi_opts { size_t cnt; /* create return kprobes */ bool retprobe; + /* attach return program (specified by return_prog_fd file descriptor) */ + bool return_prog; + /* return program fd */ + int return_prog_fd; size_t :0; }; -#define bpf_kprobe_multi_opts__last_field retprobe +#define bpf_kprobe_multi_opts__last_field return_prog_fd LIBBPF_API struct bpf_link * bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, -- 2.43.0