Commit e5d532be authored by Jiri Olsa's avatar Jiri Olsa Committed by Andrii Nakryiko
Browse files

selftests/bpf: Add stacktrace ips test for fentry/fexit



Adding test that attaches fentry/fexitand verifies the
ORC stacktrace matches expected functions.

The test is only for ORC unwinder to keep it simple.

Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20260126211837.472802-6-jolsa@kernel.org
parent 7373f97e
Loading
Loading
Loading
Loading
+51 −0
Original line number Diff line number Diff line
@@ -183,6 +183,53 @@ static void test_stacktrace_ips_kprobe(bool retprobe)
	stacktrace_ips__destroy(skel);
}

static void test_stacktrace_ips_trampoline(bool retprobe)
{
	LIBBPF_OPTS(bpf_test_run_opts, topts);
	struct stacktrace_ips *skel;

	skel = stacktrace_ips__open_and_load();
	if (!ASSERT_OK_PTR(skel, "stacktrace_ips__open_and_load"))
		return;

	if (!skel->kconfig->CONFIG_UNWINDER_ORC) {
		test__skip();
		goto cleanup;
	}

	if (retprobe) {
		skel->links.fexit_test = bpf_program__attach_trace(skel->progs.fexit_test);
		if (!ASSERT_OK_PTR(skel->links.fexit_test, "bpf_program__attach_trace"))
			goto cleanup;
	} else {
		skel->links.fentry_test = bpf_program__attach_trace(skel->progs.fentry_test);
		if (!ASSERT_OK_PTR(skel->links.fentry_test, "bpf_program__attach_trace"))
			goto cleanup;
	}

	trigger_module_test_read(1);

	load_kallsyms();

	if (retprobe) {
		check_stacktrace_ips(bpf_map__fd(skel->maps.stackmap), skel->bss->stack_key, 4,
				     ksym_get_addr("bpf_testmod_stacktrace_test_3"),
				     ksym_get_addr("bpf_testmod_stacktrace_test_2"),
				     ksym_get_addr("bpf_testmod_stacktrace_test_1"),
				     ksym_get_addr("bpf_testmod_test_read"));
	} else {
		check_stacktrace_ips(bpf_map__fd(skel->maps.stackmap), skel->bss->stack_key, 5,
				     ksym_get_addr("bpf_testmod_stacktrace_test"),
				     ksym_get_addr("bpf_testmod_stacktrace_test_3"),
				     ksym_get_addr("bpf_testmod_stacktrace_test_2"),
				     ksym_get_addr("bpf_testmod_stacktrace_test_1"),
				     ksym_get_addr("bpf_testmod_test_read"));
	}

cleanup:
	stacktrace_ips__destroy(skel);
}

static void __test_stacktrace_ips(void)
{
	if (test__start_subtest("kprobe_multi"))
@@ -195,6 +242,10 @@ static void __test_stacktrace_ips(void)
		test_stacktrace_ips_kprobe(false);
	if (test__start_subtest("kretprobe"))
		test_stacktrace_ips_kprobe(true);
	if (test__start_subtest("fentry"))
		test_stacktrace_ips_trampoline(false);
	if (test__start_subtest("fexit"))
		test_stacktrace_ips_trampoline(true);
}
#else
static void __test_stacktrace_ips(void)
+20 −0
Original line number Diff line number Diff line
@@ -53,4 +53,24 @@ int rawtp_test(void *ctx)
	return 0;
}

SEC("fentry/bpf_testmod_stacktrace_test")
int fentry_test(struct pt_regs *ctx)
{
	/*
	 * Skip 2 bpf_program/trampoline stack entries:
	 * - bpf_prog_bd1f7a949f55fb03_fentry_test
	 * - bpf_trampoline_182536277701
	 */
	stack_key = bpf_get_stackid(ctx, &stackmap, 2);
	return 0;
}

SEC("fexit/bpf_testmod_stacktrace_test")
int fexit_test(struct pt_regs *ctx)
{
	/* Skip 2 bpf_program/trampoline stack entries, check fentry_test. */
	stack_key = bpf_get_stackid(ctx, &stackmap, 2);
	return 0;
}

char _license[] SEC("license") = "GPL";