From: Jiri Olsa <jolsa@kernel.org>
To: Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>
Cc: bpf@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
Martin KaFai Lau <kafai@fb.com>,
Eduard Zingerman <eddyz87@gmail.com>,
Song Liu <songliubraving@fb.com>, Yonghong Song <yhs@fb.com>,
Menglong Dong <menglong8.dong@gmail.com>,
Steven Rostedt <rostedt@kernel.org>
Subject: [PATCHv7 bpf-next 14/29] bpf: Add support for tracing_multi link cookies
Date: Wed, 3 Jun 2026 13:05:38 +0200 [thread overview]
Message-ID: <20260603110554.29590-15-jolsa@kernel.org> (raw)
In-Reply-To: <20260603110554.29590-1-jolsa@kernel.org>
Add support to specify cookies for tracing_multi link.
Cookies are provided in array where each value is paired with provided
BTF ID value with the same array index.
Such cookie can be retrieved by bpf program with bpf_get_attach_cookie
helper call.
We need to sort cookies array together with ids array in check_dup_ids,
to keep the id->cookie relation.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
include/linux/bpf.h | 1 +
include/uapi/linux/bpf.h | 1 +
kernel/bpf/trampoline.c | 1 +
kernel/trace/bpf_trace.c | 37 ++++++++++++++++++++++++++++++----
tools/include/uapi/linux/bpf.h | 1 +
5 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index ae0a4b255a35..2da0de17275a 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -1952,6 +1952,7 @@ struct bpf_tracing_multi_data {
struct bpf_tracing_multi_link {
struct bpf_link link;
struct bpf_tracing_multi_data data;
+ u64 *cookies;
int nodes_cnt;
struct bpf_tracing_multi_node nodes[] __counted_by(nodes_cnt);
};
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 951a0122baaf..39407a77133b 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -1874,6 +1874,7 @@ union bpf_attr {
} cgroup;
struct {
__aligned_u64 ids;
+ __aligned_u64 cookies;
__u32 cnt;
} tracing_multi;
};
diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c
index 957e5d7f9554..a3537fda50cf 100644
--- a/kernel/bpf/trampoline.c
+++ b/kernel/bpf/trampoline.c
@@ -1613,6 +1613,7 @@ int bpf_trampoline_multi_attach(struct bpf_prog *prog, u32 *ids,
mnode->trampoline = tr;
mnode->node.link = &link->link;
+ mnode->node.cookie = link->cookies ? link->cookies[i] : 0;
cond_resched();
}
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 9e3cb547651e..e33492739ed1 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -3659,6 +3659,7 @@ static void bpf_tracing_multi_link_dealloc(struct bpf_link *link)
struct bpf_tracing_multi_link *tr_link =
container_of(link, struct bpf_tracing_multi_link, link);
+ kvfree(tr_link->cookies);
kvfree(tr_link);
}
@@ -3678,13 +3679,24 @@ static int ids_cmp_r(const void *pa, const void *pb, const void *priv __maybe_un
static void ids_swap_r(void *a, void *b, int size __maybe_unused,
const void *priv __maybe_unused)
{
- u32 *id_a = a, *id_b = b;
+ u64 *cookie_a, *cookie_b, *cookies;
+ u32 *id_a = a, *id_b = b, *ids;
+ void **data = (void **) priv;
+ ids = data[0];
+ cookies = data[1];
+
+ if (cookies) {
+ cookie_a = cookies + (id_a - ids);
+ cookie_b = cookies + (id_b - ids);
+ swap(*cookie_a, *cookie_b);
+ }
swap(*id_a, *id_b);
}
-static int check_dup_ids(u32 *ids, u32 cnt)
+static int check_dup_ids(u32 *ids, u64 *cookies, u32 cnt)
{
+ void *data[2] = { ids, cookies };
int err = 0;
/*
@@ -3692,7 +3704,7 @@ static int check_dup_ids(u32 *ids, u32 cnt)
* and check it for duplicates. The ids and cookies arrays
* are left sorted.
*/
- sort_r_nonatomic(ids, cnt, sizeof(ids[0]), ids_cmp_r, ids_swap_r, NULL);
+ sort_r_nonatomic(ids, cnt, sizeof(ids[0]), ids_cmp_r, ids_swap_r, data);
for (int i = 1; i < cnt; i++) {
if (ids[i] == ids[i - 1]) {
@@ -3708,6 +3720,8 @@ int bpf_tracing_multi_attach(struct bpf_prog *prog, const union bpf_attr *attr)
struct bpf_tracing_multi_link *link = NULL;
struct bpf_link_primer link_primer;
u32 cnt, *ids = NULL;
+ u64 __user *ucookies;
+ u64 *cookies = NULL;
u32 __user *uids;
int err;
@@ -3730,7 +3744,20 @@ int bpf_tracing_multi_attach(struct bpf_prog *prog, const union bpf_attr *attr)
goto error;
}
- err = check_dup_ids(ids, cnt);
+ ucookies = u64_to_user_ptr(attr->link_create.tracing_multi.cookies);
+ if (ucookies) {
+ cookies = kvmalloc_objs(*cookies, cnt);
+ if (!cookies) {
+ err = -ENOMEM;
+ goto error;
+ }
+ if (copy_from_user(cookies, ucookies, cnt * sizeof(*cookies))) {
+ err = -EFAULT;
+ goto error;
+ }
+ }
+
+ err = check_dup_ids(ids, cookies, cnt);
if (err)
goto error;
@@ -3748,6 +3775,7 @@ int bpf_tracing_multi_attach(struct bpf_prog *prog, const union bpf_attr *attr)
goto error;
link->nodes_cnt = cnt;
+ link->cookies = cookies;
err = bpf_trampoline_multi_attach(prog, ids, link);
kvfree(ids);
@@ -3758,6 +3786,7 @@ int bpf_tracing_multi_attach(struct bpf_prog *prog, const union bpf_attr *attr)
return bpf_link_settle(&link_primer);
error:
+ kvfree(cookies);
kvfree(ids);
kvfree(link);
return err;
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index 951a0122baaf..39407a77133b 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -1874,6 +1874,7 @@ union bpf_attr {
} cgroup;
struct {
__aligned_u64 ids;
+ __aligned_u64 cookies;
__u32 cnt;
} tracing_multi;
};
--
2.54.0
next prev parent reply other threads:[~2026-06-03 11:08 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-03 11:05 [PATCHv7 bpf-next 00/29] bpf: tracing_multi link Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 01/29] ftrace: Add ftrace_hash_count function Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 02/29] ftrace: Add ftrace_hash_remove function Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 03/29] ftrace: Add add_ftrace_hash_entry function Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 04/29] bpf: Use mutex lock pool for bpf trampolines Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 05/29] bpf: Add struct bpf_trampoline_ops object Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 06/29] bpf: Move trampoline image setup into bpf_trampoline_ops callbacks Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 07/29] bpf: Add bpf_trampoline_add/remove_prog functions Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 08/29] bpf: Add struct bpf_tramp_node object Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 09/29] bpf: Factor fsession link to use struct bpf_tramp_node Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 10/29] bpf: Add multi tracing attach types Jiri Olsa
2026-06-03 11:52 ` bot+bpf-ci
2026-06-03 11:05 ` [PATCHv7 bpf-next 11/29] bpf: Move sleepable verification code to btf_id_allow_sleepable Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 12/29] bpf: Add bpf_trampoline_multi_attach/detach functions Jiri Olsa
2026-06-03 11:52 ` bot+bpf-ci
2026-06-03 11:05 ` [PATCHv7 bpf-next 13/29] bpf: Add support for tracing multi link Jiri Olsa
2026-06-03 11:52 ` bot+bpf-ci
2026-06-03 11:05 ` Jiri Olsa [this message]
2026-06-03 11:05 ` [PATCHv7 bpf-next 15/29] bpf: Add support for tracing_multi link session Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 16/29] bpf: Add support for tracing_multi link fdinfo Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 17/29] libbpf: Add bpf_object_cleanup_btf function Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 18/29] libbpf: Add bpf_link_create support for tracing_multi link Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 19/29] libbpf: Add btf_type_is_traceable_func function Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 20/29] libbpf: Add support to create tracing multi link Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 21/29] selftests/bpf: Add tracing multi skel/pattern/ids attach tests Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 22/29] selftests/bpf: Add tracing multi skel/pattern/ids module " Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 23/29] selftests/bpf: Add tracing multi intersect tests Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 24/29] selftests/bpf: Add tracing multi cookies test Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 25/29] selftests/bpf: Add tracing multi session test Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 26/29] selftests/bpf: Add tracing multi attach fails test Jiri Olsa
2026-06-03 11:05 ` [PATCHv7 bpf-next 27/29] selftests/bpf: Add tracing multi verifier " Jiri Olsa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260603110554.29590-15-jolsa@kernel.org \
--to=jolsa@kernel.org \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=kafai@fb.com \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=menglong8.dong@gmail.com \
--cc=rostedt@kernel.org \
--cc=songliubraving@fb.com \
--cc=yhs@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox