mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
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:
committed by
Alexei Starovoitov
parent
4f64d5b664
commit
c7cab53f9d
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user