]>
Commit | Line | Data |
---|---|---|
e5e7a8f2 AS |
1 | // SPDX-License-Identifier: GPL-2.0 |
2 | // Copyright (c) 2019 Facebook | |
3 | #include <test_progs.h> | |
4 | static int libbpf_debug_print(enum libbpf_print_level level, | |
5 | const char *format, va_list args) | |
6 | { | |
0ff97e56 | 7 | if (level != LIBBPF_DEBUG) { |
66bd2ec1 | 8 | vprintf(format, args); |
0ff97e56 AN |
9 | return 0; |
10 | } | |
e5e7a8f2 AS |
11 | |
12 | if (!strstr(format, "verifier log")) | |
13 | return 0; | |
66bd2ec1 | 14 | vprintf("%s", args); |
0ff97e56 | 15 | return 0; |
e5e7a8f2 AS |
16 | } |
17 | ||
a8fdaad5 AN |
18 | extern int extra_prog_load_log_flags; |
19 | ||
7c944106 | 20 | static int check_load(const char *file, enum bpf_prog_type type) |
e5e7a8f2 | 21 | { |
07b61991 | 22 | struct bpf_object *obj = NULL; |
186d1a86 AN |
23 | struct bpf_program *prog; |
24 | int err; | |
25 | ||
26 | obj = bpf_object__open_file(file, NULL); | |
27 | err = libbpf_get_error(obj); | |
28 | if (err) | |
29 | return err; | |
30 | ||
31 | prog = bpf_object__next_program(obj, NULL); | |
32 | if (!prog) { | |
33 | err = -ENOENT; | |
34 | goto err_out; | |
35 | } | |
36 | ||
37 | bpf_program__set_type(prog, type); | |
38 | bpf_program__set_flags(prog, BPF_F_TEST_RND_HI32); | |
39 | bpf_program__set_log_level(prog, 4 | extra_prog_load_log_flags); | |
40 | ||
41 | err = bpf_object__load(obj); | |
42 | ||
43 | err_out: | |
e5e7a8f2 | 44 | bpf_object__close(obj); |
e5e7a8f2 AS |
45 | return err; |
46 | } | |
47 | ||
51436ed7 AN |
48 | struct scale_test_def { |
49 | const char *file; | |
50 | enum bpf_prog_type attach_type; | |
51 | bool fails; | |
52 | }; | |
53 | ||
3762a39c AN |
54 | static void scale_test(const char *file, |
55 | enum bpf_prog_type attach_type, | |
56 | bool should_fail) | |
57 | { | |
329e38f7 | 58 | libbpf_print_fn_t old_print_fn = NULL; |
3762a39c | 59 | int err; |
e5e7a8f2 | 60 | |
0ff97e56 AN |
61 | if (env.verifier_stats) { |
62 | test__force_log(); | |
329e38f7 | 63 | old_print_fn = libbpf_set_print(libbpf_debug_print); |
0ff97e56 | 64 | } |
e5e7a8f2 | 65 | |
3762a39c AN |
66 | err = check_load(file, attach_type); |
67 | if (should_fail) | |
68 | ASSERT_ERR(err, "expect_error"); | |
69 | else | |
70 | ASSERT_OK(err, "expect_success"); | |
b061017f | 71 | |
0ff97e56 | 72 | if (env.verifier_stats) |
329e38f7 | 73 | libbpf_set_print(old_print_fn); |
e5e7a8f2 | 74 | } |
3762a39c AN |
75 | |
76 | void test_verif_scale1() | |
77 | { | |
afef88e6 | 78 | scale_test("test_verif_scale1.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false); |
3762a39c AN |
79 | } |
80 | ||
81 | void test_verif_scale2() | |
82 | { | |
afef88e6 | 83 | scale_test("test_verif_scale2.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false); |
3762a39c AN |
84 | } |
85 | ||
86 | void test_verif_scale3() | |
87 | { | |
afef88e6 | 88 | scale_test("test_verif_scale3.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false); |
3762a39c AN |
89 | } |
90 | ||
91 | void test_verif_scale_pyperf_global() | |
92 | { | |
afef88e6 | 93 | scale_test("pyperf_global.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
94 | } |
95 | ||
96 | void test_verif_scale_pyperf_subprogs() | |
97 | { | |
afef88e6 | 98 | scale_test("pyperf_subprogs.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
99 | } |
100 | ||
101 | void test_verif_scale_pyperf50() | |
102 | { | |
103 | /* full unroll by llvm */ | |
afef88e6 | 104 | scale_test("pyperf50.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
105 | } |
106 | ||
107 | void test_verif_scale_pyperf100() | |
108 | { | |
109 | /* full unroll by llvm */ | |
afef88e6 | 110 | scale_test("pyperf100.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
111 | } |
112 | ||
113 | void test_verif_scale_pyperf180() | |
114 | { | |
115 | /* full unroll by llvm */ | |
afef88e6 | 116 | scale_test("pyperf180.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
117 | } |
118 | ||
119 | void test_verif_scale_pyperf600() | |
120 | { | |
121 | /* partial unroll. llvm will unroll loop ~150 times. | |
122 | * C loop count -> 600. | |
123 | * Asm loop count -> 4. | |
124 | * 16k insns in loop body. | |
125 | * Total of 5 such loops. Total program size ~82k insns. | |
126 | */ | |
afef88e6 | 127 | scale_test("pyperf600.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
128 | } |
129 | ||
f6e659b7 JK |
130 | void test_verif_scale_pyperf600_bpf_loop(void) |
131 | { | |
132 | /* use the bpf_loop helper*/ | |
afef88e6 | 133 | scale_test("pyperf600_bpf_loop.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
f6e659b7 JK |
134 | } |
135 | ||
3762a39c AN |
136 | void test_verif_scale_pyperf600_nounroll() |
137 | { | |
138 | /* no unroll at all. | |
139 | * C loop count -> 600. | |
140 | * ASM loop count -> 600. | |
141 | * ~110 insns in loop body. | |
142 | * Total of 5 such loops. Total program size ~1500 insns. | |
143 | */ | |
afef88e6 | 144 | scale_test("pyperf600_nounroll.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
145 | } |
146 | ||
147 | void test_verif_scale_loop1() | |
148 | { | |
afef88e6 | 149 | scale_test("loop1.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
150 | } |
151 | ||
152 | void test_verif_scale_loop2() | |
153 | { | |
afef88e6 | 154 | scale_test("loop2.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
155 | } |
156 | ||
157 | void test_verif_scale_loop3_fail() | |
158 | { | |
afef88e6 | 159 | scale_test("loop3.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, true /* fails */); |
3762a39c AN |
160 | } |
161 | ||
162 | void test_verif_scale_loop4() | |
163 | { | |
afef88e6 | 164 | scale_test("loop4.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false); |
3762a39c AN |
165 | } |
166 | ||
167 | void test_verif_scale_loop5() | |
168 | { | |
afef88e6 | 169 | scale_test("loop5.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false); |
3762a39c AN |
170 | } |
171 | ||
172 | void test_verif_scale_loop6() | |
173 | { | |
afef88e6 | 174 | scale_test("loop6.bpf.o", BPF_PROG_TYPE_KPROBE, false); |
3762a39c AN |
175 | } |
176 | ||
177 | void test_verif_scale_strobemeta() | |
178 | { | |
179 | /* partial unroll. 19k insn in a loop. | |
180 | * Total program size 20.8k insn. | |
181 | * ~350k processed_insns | |
182 | */ | |
afef88e6 | 183 | scale_test("strobemeta.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
184 | } |
185 | ||
f6e659b7 JK |
186 | void test_verif_scale_strobemeta_bpf_loop(void) |
187 | { | |
188 | /* use the bpf_loop helper*/ | |
afef88e6 | 189 | scale_test("strobemeta_bpf_loop.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
f6e659b7 JK |
190 | } |
191 | ||
3762a39c AN |
192 | void test_verif_scale_strobemeta_nounroll1() |
193 | { | |
194 | /* no unroll, tiny loops */ | |
afef88e6 | 195 | scale_test("strobemeta_nounroll1.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
196 | } |
197 | ||
198 | void test_verif_scale_strobemeta_nounroll2() | |
199 | { | |
200 | /* no unroll, tiny loops */ | |
afef88e6 | 201 | scale_test("strobemeta_nounroll2.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
202 | } |
203 | ||
204 | void test_verif_scale_strobemeta_subprogs() | |
205 | { | |
206 | /* non-inlined subprogs */ | |
afef88e6 | 207 | scale_test("strobemeta_subprogs.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); |
3762a39c AN |
208 | } |
209 | ||
210 | void test_verif_scale_sysctl_loop1() | |
211 | { | |
afef88e6 | 212 | scale_test("test_sysctl_loop1.bpf.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false); |
3762a39c AN |
213 | } |
214 | ||
215 | void test_verif_scale_sysctl_loop2() | |
216 | { | |
afef88e6 | 217 | scale_test("test_sysctl_loop2.bpf.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false); |
3762a39c AN |
218 | } |
219 | ||
220 | void test_verif_scale_xdp_loop() | |
221 | { | |
afef88e6 | 222 | scale_test("test_xdp_loop.bpf.o", BPF_PROG_TYPE_XDP, false); |
3762a39c AN |
223 | } |
224 | ||
225 | void test_verif_scale_seg6_loop() | |
226 | { | |
afef88e6 | 227 | scale_test("test_seg6_loop.bpf.o", BPF_PROG_TYPE_LWT_SEG6LOCAL, false); |
3762a39c | 228 | } |
0869e507 AS |
229 | |
230 | void test_verif_twfw() | |
231 | { | |
afef88e6 | 232 | scale_test("twfw.bpf.o", BPF_PROG_TYPE_CGROUP_SKB, false); |
0869e507 | 233 | } |