Skip to content

Commit 7373f97

Browse files
olsajirianakryiko
authored andcommitted
selftests/bpf: Add stacktrace ips test for kprobe/kretprobe
Adding test that attaches kprobe/kretprobe and verifies the ORC stacktrace matches expected functions. The test is only for ORC unwinder to keep it simple. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20260126211837.472802-5-jolsa@kernel.org
1 parent 0207f94 commit 7373f97

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

tools/testing/selftests/bpf/prog_tests/stacktrace_ips.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,52 @@ static void test_stacktrace_ips_raw_tp(void)
137137
stacktrace_ips__destroy(skel);
138138
}
139139

140+
static void test_stacktrace_ips_kprobe(bool retprobe)
141+
{
142+
LIBBPF_OPTS(bpf_kprobe_opts, opts,
143+
.retprobe = retprobe
144+
);
145+
LIBBPF_OPTS(bpf_test_run_opts, topts);
146+
struct stacktrace_ips *skel;
147+
148+
skel = stacktrace_ips__open_and_load();
149+
if (!ASSERT_OK_PTR(skel, "stacktrace_ips__open_and_load"))
150+
return;
151+
152+
if (!skel->kconfig->CONFIG_UNWINDER_ORC) {
153+
test__skip();
154+
goto cleanup;
155+
}
156+
157+
skel->links.kprobe_test = bpf_program__attach_kprobe_opts(
158+
skel->progs.kprobe_test,
159+
"bpf_testmod_stacktrace_test", &opts);
160+
if (!ASSERT_OK_PTR(skel->links.kprobe_test, "bpf_program__attach_kprobe_opts"))
161+
goto cleanup;
162+
163+
trigger_module_test_read(1);
164+
165+
load_kallsyms();
166+
167+
if (retprobe) {
168+
check_stacktrace_ips(bpf_map__fd(skel->maps.stackmap), skel->bss->stack_key, 4,
169+
ksym_get_addr("bpf_testmod_stacktrace_test_3"),
170+
ksym_get_addr("bpf_testmod_stacktrace_test_2"),
171+
ksym_get_addr("bpf_testmod_stacktrace_test_1"),
172+
ksym_get_addr("bpf_testmod_test_read"));
173+
} else {
174+
check_stacktrace_ips(bpf_map__fd(skel->maps.stackmap), skel->bss->stack_key, 5,
175+
ksym_get_addr("bpf_testmod_stacktrace_test"),
176+
ksym_get_addr("bpf_testmod_stacktrace_test_3"),
177+
ksym_get_addr("bpf_testmod_stacktrace_test_2"),
178+
ksym_get_addr("bpf_testmod_stacktrace_test_1"),
179+
ksym_get_addr("bpf_testmod_test_read"));
180+
}
181+
182+
cleanup:
183+
stacktrace_ips__destroy(skel);
184+
}
185+
140186
static void __test_stacktrace_ips(void)
141187
{
142188
if (test__start_subtest("kprobe_multi"))
@@ -145,6 +191,10 @@ static void __test_stacktrace_ips(void)
145191
test_stacktrace_ips_kprobe_multi(true);
146192
if (test__start_subtest("raw_tp"))
147193
test_stacktrace_ips_raw_tp();
194+
if (test__start_subtest("kprobe"))
195+
test_stacktrace_ips_kprobe(false);
196+
if (test__start_subtest("kretprobe"))
197+
test_stacktrace_ips_kprobe(true);
148198
}
149199
#else
150200
static void __test_stacktrace_ips(void)

tools/testing/selftests/bpf/progs/stacktrace_ips.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ int unused(void)
3131

3232
__u32 stack_key;
3333

34+
SEC("kprobe")
35+
int kprobe_test(struct pt_regs *ctx)
36+
{
37+
stack_key = bpf_get_stackid(ctx, &stackmap, 0);
38+
return 0;
39+
}
40+
3441
SEC("kprobe.multi")
3542
int kprobe_multi_test(struct pt_regs *ctx)
3643
{

0 commit comments

Comments
 (0)