xref: /linux/tools/testing/selftests/bpf/progs/verifier_kfunc_prog_types.c (revision 3a39d672e7f48b8d6b91a09afa4b55352773b4b5)
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)19 static 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)36 int 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)44 int 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)52 int 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)60 int 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)70 static 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)90 int 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)98 int 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)106 int 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)114 int 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)124 static 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)142 int 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)150 int 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)158 int 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)166 int BPF_PROG(cpumask_kfunc_perf_event)
167 {
168 	cpumask_kfunc_load_test();
169 	return 0;
170 }
171