1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ 3 4 #include <vmlinux.h> 5 #include <bpf/bpf_tracing.h> 6 #include <bpf/bpf_helpers.h> 7 8 #include "bpf_misc.h" 9 #include "cgrp_kfunc_common.h" 10 #include "cpumask_common.h" 11 #include "task_kfunc_common.h" 12 13 char _license[] SEC("license") = "GPL"; 14 15 /*************** 16 * Task kfuncs * 17 ***************/ 18 task_kfunc_load_test(void)19static void task_kfunc_load_test(void) 20 { 21 struct task_struct *current, *ref_1, *ref_2; 22 23 current = bpf_get_current_task_btf(); 24 ref_1 = bpf_task_from_pid(current->pid); 25 if (!ref_1) 26 return; 27 28 ref_2 = bpf_task_acquire(ref_1); 29 if (ref_2) 30 bpf_task_release(ref_2); 31 bpf_task_release(ref_1); 32 } 33 34 SEC("raw_tp") 35 __failure __msg("calling kernel function") BPF_PROG(task_kfunc_raw_tp)36int BPF_PROG(task_kfunc_raw_tp) 37 { 38 task_kfunc_load_test(); 39 return 0; 40 } 41 42 SEC("syscall") 43 __success BPF_PROG(task_kfunc_syscall)44int BPF_PROG(task_kfunc_syscall) 45 { 46 task_kfunc_load_test(); 47 return 0; 48 } 49 50 SEC("tracepoint") 51 __success BPF_PROG(task_kfunc_tracepoint)52int BPF_PROG(task_kfunc_tracepoint) 53 { 54 task_kfunc_load_test(); 55 return 0; 56 } 57 58 SEC("perf_event") 59 __success BPF_PROG(task_kfunc_perf_event)60int BPF_PROG(task_kfunc_perf_event) 61 { 62 task_kfunc_load_test(); 63 return 0; 64 } 65 66 /***************** 67 * cgroup kfuncs * 68 *****************/ 69 cgrp_kfunc_load_test(void)70static void cgrp_kfunc_load_test(void) 71 { 72 struct cgroup *cgrp, *ref; 73 74 cgrp = bpf_cgroup_from_id(0); 75 if (!cgrp) 76 return; 77 78 ref = bpf_cgroup_acquire(cgrp); 79 if (!ref) { 80 bpf_cgroup_release(cgrp); 81 return; 82 } 83 84 bpf_cgroup_release(ref); 85 bpf_cgroup_release(cgrp); 86 } 87 88 SEC("raw_tp") 89 __failure __msg("calling kernel function") BPF_PROG(cgrp_kfunc_raw_tp)90int BPF_PROG(cgrp_kfunc_raw_tp) 91 { 92 cgrp_kfunc_load_test(); 93 return 0; 94 } 95 96 SEC("syscall") 97 __success BPF_PROG(cgrp_kfunc_syscall)98int BPF_PROG(cgrp_kfunc_syscall) 99 { 100 cgrp_kfunc_load_test(); 101 return 0; 102 } 103 104 SEC("tracepoint") 105 __success BPF_PROG(cgrp_kfunc_tracepoint)106int BPF_PROG(cgrp_kfunc_tracepoint) 107 { 108 cgrp_kfunc_load_test(); 109 return 0; 110 } 111 112 SEC("perf_event") 113 __success BPF_PROG(cgrp_kfunc_perf_event)114int BPF_PROG(cgrp_kfunc_perf_event) 115 { 116 cgrp_kfunc_load_test(); 117 return 0; 118 } 119 120 /****************** 121 * cpumask kfuncs * 122 ******************/ 123 cpumask_kfunc_load_test(void)124static void cpumask_kfunc_load_test(void) 125 { 126 struct bpf_cpumask *alloc, *ref; 127 128 alloc = bpf_cpumask_create(); 129 if (!alloc) 130 return; 131 132 ref = bpf_cpumask_acquire(alloc); 133 bpf_cpumask_set_cpu(0, alloc); 134 bpf_cpumask_test_cpu(0, (const struct cpumask *)ref); 135 136 bpf_cpumask_release(ref); 137 bpf_cpumask_release(alloc); 138 } 139 140 SEC("raw_tp") 141 __failure __msg("calling kernel function") BPF_PROG(cpumask_kfunc_raw_tp)142int BPF_PROG(cpumask_kfunc_raw_tp) 143 { 144 cpumask_kfunc_load_test(); 145 return 0; 146 } 147 148 SEC("syscall") 149 __success BPF_PROG(cpumask_kfunc_syscall)150int BPF_PROG(cpumask_kfunc_syscall) 151 { 152 cpumask_kfunc_load_test(); 153 return 0; 154 } 155 156 SEC("tracepoint") 157 __success BPF_PROG(cpumask_kfunc_tracepoint)158int BPF_PROG(cpumask_kfunc_tracepoint) 159 { 160 cpumask_kfunc_load_test(); 161 return 0; 162 } 163 164 SEC("perf_event") 165 __success BPF_PROG(cpumask_kfunc_perf_event)166int BPF_PROG(cpumask_kfunc_perf_event) 167 { 168 cpumask_kfunc_load_test(); 169 return 0; 170 } 171