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