selftests/bpf: Add test to ensure kprobe_multi is not sleepable

Add a selftest to ensure that kprobe_multi programs cannot be attached
using the BPF_F_SLEEPABLE flag. This test succeeds when the kernel
rejects attachment of kprobe_multi when the BPF_F_SLEEPABLE flag is set.

Suggested-by: Leon Hwang <leon.hwang@linux.dev>
Signed-off-by: Varun R Mallya <varunrmallya@gmail.com>
Link: https://lore.kernel.org/r/20260408190137.101418-3-varunrmallya@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
Varun R Mallya
2026-04-09 00:31:37 +05:30
committed by Alexei Starovoitov
parent 4f64d5b664
commit c7cab53f9d
2 changed files with 59 additions and 1 deletions

View File

@@ -10,6 +10,7 @@
#include "kprobe_multi_session_cookie.skel.h"
#include "kprobe_multi_verifier.skel.h"
#include "kprobe_write_ctx.skel.h"
#include "kprobe_multi_sleepable.skel.h"
#include "bpf/libbpf_internal.h"
#include "bpf/hashmap.h"
@@ -220,7 +221,9 @@ static void test_attach_api_syms(void)
static void test_attach_api_fails(void)
{
LIBBPF_OPTS(bpf_kprobe_multi_opts, opts);
LIBBPF_OPTS(bpf_test_run_opts, topts);
struct kprobe_multi *skel = NULL;
struct kprobe_multi_sleepable *sl_skel = NULL;
struct bpf_link *link = NULL;
unsigned long long addrs[2];
const char *syms[2] = {
@@ -228,7 +231,7 @@ static void test_attach_api_fails(void)
"bpf_fentry_test2",
};
__u64 cookies[2];
int saved_error;
int saved_error, err;
addrs[0] = ksym_get_addr("bpf_fentry_test1");
addrs[1] = ksym_get_addr("bpf_fentry_test2");
@@ -351,9 +354,39 @@ static void test_attach_api_fails(void)
if (!ASSERT_EQ(saved_error, -ENOENT, "fail_8_error"))
goto cleanup;
/* fail_9 - sleepable kprobe multi should not attach */
sl_skel = kprobe_multi_sleepable__open();
if (!ASSERT_OK_PTR(sl_skel, "sleep_skel_open"))
goto cleanup;
sl_skel->bss->user_ptr = sl_skel;
err = bpf_program__set_flags(sl_skel->progs.handle_kprobe_multi_sleepable,
BPF_F_SLEEPABLE);
if (!ASSERT_OK(err, "sleep_skel_set_flags"))
goto cleanup;
err = kprobe_multi_sleepable__load(sl_skel);
if (!ASSERT_OK(err, "sleep_skel_load"))
goto cleanup;
link = bpf_program__attach_kprobe_multi_opts(sl_skel->progs.handle_kprobe_multi_sleepable,
"bpf_fentry_test1", NULL);
saved_error = -errno;
if (!ASSERT_ERR_PTR(link, "fail_9"))
goto cleanup;
if (!ASSERT_EQ(saved_error, -EINVAL, "fail_9_error"))
goto cleanup;
err = bpf_prog_test_run_opts(bpf_program__fd(sl_skel->progs.fentry), &topts);
ASSERT_OK(err, "bpf_prog_test_run_opts");
cleanup:
bpf_link__destroy(link);
kprobe_multi__destroy(skel);
kprobe_multi_sleepable__destroy(sl_skel);
}
static void test_session_skel_api(void)