xref: /linux/tools/testing/selftests/bpf/prog_tests/sleepable_tracepoints.c (revision b2128290c29902315e632ea59e0504d6bc9e9b42)
1*8a206557SMykyta Yatsenko // SPDX-License-Identifier: GPL-2.0
2*8a206557SMykyta Yatsenko /* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */
3*8a206557SMykyta Yatsenko 
4*8a206557SMykyta Yatsenko #include <test_progs.h>
5*8a206557SMykyta Yatsenko #include <unistd.h>
6*8a206557SMykyta Yatsenko #include "test_sleepable_tracepoints.skel.h"
7*8a206557SMykyta Yatsenko #include "test_sleepable_tracepoints_fail.skel.h"
8*8a206557SMykyta Yatsenko 
9*8a206557SMykyta Yatsenko static void run_test(struct test_sleepable_tracepoints *skel)
10*8a206557SMykyta Yatsenko {
11*8a206557SMykyta Yatsenko 	char buf[PATH_MAX] = "/";
12*8a206557SMykyta Yatsenko 
13*8a206557SMykyta Yatsenko 	skel->bss->target_pid = getpid();
14*8a206557SMykyta Yatsenko 	skel->bss->prog_triggered = 0;
15*8a206557SMykyta Yatsenko 	skel->bss->err = 0;
16*8a206557SMykyta Yatsenko 	skel->bss->copied_byte = 0;
17*8a206557SMykyta Yatsenko 
18*8a206557SMykyta Yatsenko 	syscall(__NR_getcwd, buf, sizeof(buf));
19*8a206557SMykyta Yatsenko 
20*8a206557SMykyta Yatsenko 	ASSERT_EQ(skel->bss->prog_triggered, 1, "prog_triggered");
21*8a206557SMykyta Yatsenko 	ASSERT_EQ(skel->bss->err, 0, "err");
22*8a206557SMykyta Yatsenko 	ASSERT_EQ(skel->bss->copied_byte, '/', "copied_byte");
23*8a206557SMykyta Yatsenko }
24*8a206557SMykyta Yatsenko 
25*8a206557SMykyta Yatsenko static void run_auto_attach_test(struct bpf_program *prog,
26*8a206557SMykyta Yatsenko 				 struct test_sleepable_tracepoints *skel)
27*8a206557SMykyta Yatsenko {
28*8a206557SMykyta Yatsenko 	struct bpf_link *link;
29*8a206557SMykyta Yatsenko 
30*8a206557SMykyta Yatsenko 	link = bpf_program__attach(prog);
31*8a206557SMykyta Yatsenko 	if (!ASSERT_OK_PTR(link, "prog_attach"))
32*8a206557SMykyta Yatsenko 		return;
33*8a206557SMykyta Yatsenko 
34*8a206557SMykyta Yatsenko 	run_test(skel);
35*8a206557SMykyta Yatsenko 	bpf_link__destroy(link);
36*8a206557SMykyta Yatsenko }
37*8a206557SMykyta Yatsenko 
38*8a206557SMykyta Yatsenko static void test_attach_only(struct bpf_program *prog)
39*8a206557SMykyta Yatsenko {
40*8a206557SMykyta Yatsenko 	struct bpf_link *link;
41*8a206557SMykyta Yatsenko 
42*8a206557SMykyta Yatsenko 	link = bpf_program__attach(prog);
43*8a206557SMykyta Yatsenko 	if (ASSERT_OK_PTR(link, "attach"))
44*8a206557SMykyta Yatsenko 		bpf_link__destroy(link);
45*8a206557SMykyta Yatsenko }
46*8a206557SMykyta Yatsenko 
47*8a206557SMykyta Yatsenko static void test_attach_reject(struct bpf_program *prog)
48*8a206557SMykyta Yatsenko {
49*8a206557SMykyta Yatsenko 	struct bpf_link *link;
50*8a206557SMykyta Yatsenko 
51*8a206557SMykyta Yatsenko 	link = bpf_program__attach(prog);
52*8a206557SMykyta Yatsenko 	if (!ASSERT_ERR_PTR(link, "attach_should_fail"))
53*8a206557SMykyta Yatsenko 		bpf_link__destroy(link);
54*8a206557SMykyta Yatsenko }
55*8a206557SMykyta Yatsenko 
56*8a206557SMykyta Yatsenko static void test_raw_tp_bare(struct test_sleepable_tracepoints *skel)
57*8a206557SMykyta Yatsenko {
58*8a206557SMykyta Yatsenko 	struct bpf_link *link;
59*8a206557SMykyta Yatsenko 
60*8a206557SMykyta Yatsenko 	link = bpf_program__attach_raw_tracepoint(skel->progs.handle_raw_tp_bare,
61*8a206557SMykyta Yatsenko 						  "sys_enter");
62*8a206557SMykyta Yatsenko 	if (ASSERT_OK_PTR(link, "attach"))
63*8a206557SMykyta Yatsenko 		bpf_link__destroy(link);
64*8a206557SMykyta Yatsenko }
65*8a206557SMykyta Yatsenko 
66*8a206557SMykyta Yatsenko static void test_tp_bare(struct test_sleepable_tracepoints *skel)
67*8a206557SMykyta Yatsenko {
68*8a206557SMykyta Yatsenko 	struct bpf_link *link;
69*8a206557SMykyta Yatsenko 
70*8a206557SMykyta Yatsenko 	link = bpf_program__attach_tracepoint(skel->progs.handle_tp_bare,
71*8a206557SMykyta Yatsenko 					      "syscalls", "sys_enter_getcwd");
72*8a206557SMykyta Yatsenko 	if (ASSERT_OK_PTR(link, "attach"))
73*8a206557SMykyta Yatsenko 		bpf_link__destroy(link);
74*8a206557SMykyta Yatsenko }
75*8a206557SMykyta Yatsenko 
76*8a206557SMykyta Yatsenko static void test_test_run(struct test_sleepable_tracepoints *skel)
77*8a206557SMykyta Yatsenko {
78*8a206557SMykyta Yatsenko 	__u64 args[2] = {0x1234ULL, 0x5678ULL};
79*8a206557SMykyta Yatsenko 	LIBBPF_OPTS(bpf_test_run_opts, topts,
80*8a206557SMykyta Yatsenko 		.ctx_in = args,
81*8a206557SMykyta Yatsenko 		.ctx_size_in = sizeof(args),
82*8a206557SMykyta Yatsenko 	);
83*8a206557SMykyta Yatsenko 	int fd, err;
84*8a206557SMykyta Yatsenko 
85*8a206557SMykyta Yatsenko 	fd = bpf_program__fd(skel->progs.handle_test_run);
86*8a206557SMykyta Yatsenko 	err = bpf_prog_test_run_opts(fd, &topts);
87*8a206557SMykyta Yatsenko 	ASSERT_OK(err, "test_run");
88*8a206557SMykyta Yatsenko 	ASSERT_EQ(topts.retval, args[0] + args[1], "test_run_retval");
89*8a206557SMykyta Yatsenko }
90*8a206557SMykyta Yatsenko 
91*8a206557SMykyta Yatsenko static void test_test_run_on_cpu_reject(struct test_sleepable_tracepoints *skel)
92*8a206557SMykyta Yatsenko {
93*8a206557SMykyta Yatsenko 	__u64 args[2] = {};
94*8a206557SMykyta Yatsenko 	LIBBPF_OPTS(bpf_test_run_opts, topts,
95*8a206557SMykyta Yatsenko 		.ctx_in = args,
96*8a206557SMykyta Yatsenko 		.ctx_size_in = sizeof(args),
97*8a206557SMykyta Yatsenko 		.flags = BPF_F_TEST_RUN_ON_CPU,
98*8a206557SMykyta Yatsenko 	);
99*8a206557SMykyta Yatsenko 	int fd, err;
100*8a206557SMykyta Yatsenko 
101*8a206557SMykyta Yatsenko 	fd = bpf_program__fd(skel->progs.handle_test_run);
102*8a206557SMykyta Yatsenko 	err = bpf_prog_test_run_opts(fd, &topts);
103*8a206557SMykyta Yatsenko 	ASSERT_ERR(err, "test_run_on_cpu_reject");
104*8a206557SMykyta Yatsenko }
105*8a206557SMykyta Yatsenko 
106*8a206557SMykyta Yatsenko void test_sleepable_tracepoints(void)
107*8a206557SMykyta Yatsenko {
108*8a206557SMykyta Yatsenko 	struct test_sleepable_tracepoints *skel;
109*8a206557SMykyta Yatsenko 
110*8a206557SMykyta Yatsenko 	skel = test_sleepable_tracepoints__open_and_load();
111*8a206557SMykyta Yatsenko 	if (!ASSERT_OK_PTR(skel, "open_and_load"))
112*8a206557SMykyta Yatsenko 		return;
113*8a206557SMykyta Yatsenko 
114*8a206557SMykyta Yatsenko 	if (test__start_subtest("tp_btf"))
115*8a206557SMykyta Yatsenko 		run_auto_attach_test(skel->progs.handle_sys_enter_tp_btf, skel);
116*8a206557SMykyta Yatsenko 	if (test__start_subtest("raw_tp"))
117*8a206557SMykyta Yatsenko 		run_auto_attach_test(skel->progs.handle_sys_enter_raw_tp, skel);
118*8a206557SMykyta Yatsenko 	if (test__start_subtest("tracepoint"))
119*8a206557SMykyta Yatsenko 		run_auto_attach_test(skel->progs.handle_sys_enter_tp, skel);
120*8a206557SMykyta Yatsenko 	if (test__start_subtest("sys_exit"))
121*8a206557SMykyta Yatsenko 		run_auto_attach_test(skel->progs.handle_sys_exit_tp, skel);
122*8a206557SMykyta Yatsenko 	if (test__start_subtest("tracepoint_alias"))
123*8a206557SMykyta Yatsenko 		test_attach_only(skel->progs.handle_sys_enter_tp_alias);
124*8a206557SMykyta Yatsenko 	if (test__start_subtest("raw_tracepoint_alias"))
125*8a206557SMykyta Yatsenko 		test_attach_only(skel->progs.handle_sys_enter_raw_tp_alias);
126*8a206557SMykyta Yatsenko 	if (test__start_subtest("raw_tp_bare"))
127*8a206557SMykyta Yatsenko 		test_raw_tp_bare(skel);
128*8a206557SMykyta Yatsenko 	if (test__start_subtest("tp_bare"))
129*8a206557SMykyta Yatsenko 		test_tp_bare(skel);
130*8a206557SMykyta Yatsenko 	if (test__start_subtest("test_run"))
131*8a206557SMykyta Yatsenko 		test_test_run(skel);
132*8a206557SMykyta Yatsenko 	if (test__start_subtest("test_run_on_cpu_reject"))
133*8a206557SMykyta Yatsenko 		test_test_run_on_cpu_reject(skel);
134*8a206557SMykyta Yatsenko 	if (test__start_subtest("raw_tp_non_faultable"))
135*8a206557SMykyta Yatsenko 		test_attach_reject(skel->progs.handle_raw_tp_non_faultable);
136*8a206557SMykyta Yatsenko 	if (test__start_subtest("tp_non_syscall"))
137*8a206557SMykyta Yatsenko 		test_attach_reject(skel->progs.handle_tp_non_syscall);
138*8a206557SMykyta Yatsenko 	if (test__start_subtest("tp_btf_non_faultable_reject"))
139*8a206557SMykyta Yatsenko 		RUN_TESTS(test_sleepable_tracepoints_fail);
140*8a206557SMykyta Yatsenko 
141*8a206557SMykyta Yatsenko 	test_sleepable_tracepoints__destroy(skel);
142*8a206557SMykyta Yatsenko }
143