Introduce prio field in opts structures (bpf_tracepoint_opts, bpf_link_create_opts, bpf_perf_event_opts) to pass a priority value for the bpf_prog when a new bpf link is created. This value will be further used in perf_event_set_bpf_prog to specify in which order to execute bpf_progs attached to the same tracepoint. Signed-off-by: Dmitrii Dolgov <9erthalion6@xxxxxxxxx> --- kernel/bpf/syscall.c | 3 ++- tools/lib/bpf/bpf.c | 1 + tools/lib/bpf/bpf.h | 1 + tools/lib/bpf/libbpf.c | 4 +++- tools/lib/bpf/libbpf.h | 6 ++++-- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 72fb3d2c30a4..629852b35b21 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -3009,7 +3009,8 @@ static int bpf_perf_link_attach(const union bpf_attr *attr, struct bpf_prog *pro } event = perf_file->private_data; - err = perf_event_set_bpf_prog(event, prog, attr->link_create.perf_event.bpf_cookie, 0); + err = perf_event_set_bpf_prog(event, prog, attr->link_create.perf_event.bpf_cookie, + attr->link_create.perf_event.prio); if (err) { bpf_link_cleanup(&link_primer); goto out_put_file; diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index cf27251adb92..029c9809bf9b 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -851,6 +851,7 @@ int bpf_link_create(int prog_fd, int target_fd, break; case BPF_PERF_EVENT: attr.link_create.perf_event.bpf_cookie = OPTS_GET(opts, perf_event.bpf_cookie, 0); + attr.link_create.perf_event.prio = OPTS_GET(opts, perf_event.prio, 0); if (!OPTS_ZEROED(opts, perf_event)) return libbpf_err(-EINVAL); break; diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h index f4b4afb6d4ba..9a8ec9081ba7 100644 --- a/tools/lib/bpf/bpf.h +++ b/tools/lib/bpf/bpf.h @@ -412,6 +412,7 @@ struct bpf_link_create_opts { union { struct { __u64 bpf_cookie; + __u32 prio; } perf_event; struct { __u32 flags; diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 809fe209cdcc..e09c00b53772 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -9912,7 +9912,8 @@ struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *p if (kernel_supports(prog->obj, FEAT_PERF_LINK)) { DECLARE_LIBBPF_OPTS(bpf_link_create_opts, link_opts, - .perf_event.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0)); + .perf_event.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0), + .perf_event.prio = OPTS_GET(opts, prio, 0)); link_fd = bpf_link_create(prog_fd, pfd, BPF_PERF_EVENT, &link_opts); if (link_fd < 0) { @@ -10663,6 +10664,7 @@ struct bpf_link *bpf_program__attach_tracepoint_opts(const struct bpf_program *p return libbpf_err_ptr(-EINVAL); pe_opts.bpf_cookie = OPTS_GET(opts, bpf_cookie, 0); + pe_opts.prio = OPTS_GET(opts, prio, 0); pfd = perf_event_open_tracepoint(tp_category, tp_name); if (pfd < 0) { diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 05dde85e19a6..30f1808a4b49 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -394,8 +394,9 @@ struct bpf_perf_event_opts { size_t sz; /* custom user-provided value fetchable through bpf_get_attach_cookie() */ __u64 bpf_cookie; + __u32 prio; }; -#define bpf_perf_event_opts__last_field bpf_cookie +#define bpf_perf_event_opts__last_field prio LIBBPF_API struct bpf_link * bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd); @@ -508,8 +509,9 @@ struct bpf_tracepoint_opts { size_t sz; /* custom user-provided value fetchable through bpf_get_attach_cookie() */ __u64 bpf_cookie; + __u32 prio; }; -#define bpf_tracepoint_opts__last_field bpf_cookie +#define bpf_tracepoint_opts__last_field prio LIBBPF_API struct bpf_link * bpf_program__attach_tracepoint(const struct bpf_program *prog, -- 2.32.0