From: Varun R Mallya <varunrmallya@gmail.com>
To: bpf@vger.kernel.org, jolsa@kernel.org, leon.hwang@linux.dev,
andrii@kernel.org, alan.maguire@oracle.com
Cc: ast@kernel.org, eddyz87@gmail.com, martin.lau@linux.dev,
daniel@iogearbox.net, linux-kernel@vger.kernel.org,
memxor@gmail.com, song@kernel.org, menglong8.dong@gmail.com,
varunrmallya@gmail.com
Subject: [RFC PATCH bpf-next v3 2/3] libbpf: Add FEAT_KPROBE_MULTI_LINK feature probe.
Date: Fri, 3 Apr 2026 18:14:11 +0530 [thread overview]
Message-ID: <20260403124412.37449-3-varunrmallya@gmail.com> (raw)
In-Reply-To: <20260403124412.37449-1-varunrmallya@gmail.com>
Add FEAT_KPROBE_MULTI_LINK, similar to UPROBE_MULTI_LINK
by loading and creating a link for a small BPF program with
BPF_TRACE_KPROBE_MULTI as the expected attach type, and
then checking the success of the operation.
Signed-off-by: Varun R Mallya <varunrmallya@gmail.com>
---
tools/lib/bpf/features.c | 38 +++++++++++++++++++++++++++++++++
tools/lib/bpf/libbpf_internal.h | 2 ++
2 files changed, 40 insertions(+)
diff --git a/tools/lib/bpf/features.c b/tools/lib/bpf/features.c
index 4f19a0d79b0c..01ded8a1e3c4 100644
--- a/tools/lib/bpf/features.c
+++ b/tools/lib/bpf/features.c
@@ -424,6 +424,41 @@ static int probe_uprobe_multi_link(int token_fd)
return link_fd < 0 && err == -EINVAL;
}
+static int probe_kprobe_multi_link(int token_fd)
+{
+ LIBBPF_OPTS(bpf_prog_load_opts, load_opts,
+ .expected_attach_type = BPF_TRACE_KPROBE_MULTI,
+ .token_fd = token_fd,
+ .prog_flags = token_fd ? BPF_F_TOKEN_FD : 0,
+ );
+ LIBBPF_OPTS(bpf_link_create_opts, link_opts);
+ struct bpf_insn insns[] = {
+ BPF_MOV64_IMM(BPF_REG_0, 0),
+ BPF_EXIT_INSN(),
+ };
+ int prog_fd, link_fd, err;
+ const char *sym = "bpf_map_lookup_elem"; /* stable, always present */
+
+ prog_fd = bpf_prog_load(BPF_PROG_TYPE_KPROBE, NULL, "GPL",
+ insns, ARRAY_SIZE(insns), &load_opts);
+ if (prog_fd < 0)
+ return -errno;
+
+ /* attaching to a valid symbol should succeed */
+ link_opts.kprobe_multi.syms = &sym;
+ /* MAX_KPROBE_MULTI_CNT is defined as (1U << 20) in kernel/trace/bpf_trace.c,
+ * so we create one more than the allowed limit to make it fail with E2BIG.
+ */
+ link_opts.kprobe_multi.cnt = (1U << 20) + 1;
+ link_fd = bpf_link_create(prog_fd, -1, BPF_TRACE_KPROBE_MULTI, &link_opts);
+ err = -errno;
+ if (link_fd >= 0)
+ close(link_fd);
+ close(prog_fd);
+ /* Fails with E2BIG on kernels where kprobe_multi is supported */
+ return link_fd <= 0 && err == -E2BIG;
+}
+
static int probe_kern_bpf_cookie(int token_fd)
{
struct bpf_insn insns[] = {
@@ -699,6 +734,9 @@ static struct kern_feature_desc {
[FEAT_BTF_LAYOUT] = {
"kernel supports BTF layout", probe_kern_btf_layout,
},
+ [FEAT_KPROBE_MULTI_LINK] = {
+ "BPF multi-kprobe link support", probe_kprobe_multi_link,
+ },
};
bool feat_supported(struct kern_feature_cache *cache, enum kern_feature_id feat_id)
diff --git a/tools/lib/bpf/libbpf_internal.h b/tools/lib/bpf/libbpf_internal.h
index cabdaef79098..b3cb216aadae 100644
--- a/tools/lib/bpf/libbpf_internal.h
+++ b/tools/lib/bpf/libbpf_internal.h
@@ -398,6 +398,8 @@ enum kern_feature_id {
FEAT_UPROBE_SYSCALL,
/* Kernel supports BTF layout information */
FEAT_BTF_LAYOUT,
+ /* BPF multi-kprobe link support */
+ FEAT_KPROBE_MULTI_LINK,
__FEAT_CNT,
};
--
2.53.0
next prev parent reply other threads:[~2026-04-03 12:44 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-03 12:44 [RFC PATCH bpf-next v3 0/3] Upgrading uprobe and kprobe to their `multi` counterparts Varun R Mallya
2026-04-03 12:44 ` [RFC PATCH bpf-next v3 1/3] libbpf: Auto-upgrade uprobes to multi-uprobes when supported Varun R Mallya
2026-04-03 13:35 ` bot+bpf-ci
2026-04-03 12:44 ` Varun R Mallya [this message]
2026-04-03 13:22 ` [RFC PATCH bpf-next v3 2/3] libbpf: Add FEAT_KPROBE_MULTI_LINK feature probe bot+bpf-ci
2026-04-10 7:33 ` Varun R Mallya
2026-04-03 12:44 ` [RFC PATCH bpf-next v3 3/3] libbpf: Auto-upgrade kprobes to multi-kprobes when supported Varun R Mallya
2026-04-03 13:35 ` bot+bpf-ci
2026-04-10 7:36 ` Varun R Mallya
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=20260403124412.37449-3-varunrmallya@gmail.com \
--to=varunrmallya@gmail.com \
--cc=alan.maguire@oracle.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=jolsa@kernel.org \
--cc=leon.hwang@linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--cc=menglong8.dong@gmail.com \
--cc=song@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.