@@ -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;
@@ -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;
@@ -412,6 +412,7 @@ struct bpf_link_create_opts {
union {
struct {
__u64 bpf_cookie;
+ __u32 prio;
} perf_event;
struct {
__u32 flags;
@@ -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) {
@@ -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,
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@gmail.com> --- 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(-)