]> Git Repo - linux.git/blame - tools/testing/selftests/bpf/prog_tests/bpf_verif_scale.c
selftests/bpf: Store BPF object files with .bpf.o extension
[linux.git] / tools / testing / selftests / bpf / prog_tests / bpf_verif_scale.c
CommitLineData
e5e7a8f2
AS
1// SPDX-License-Identifier: GPL-2.0
2// Copyright (c) 2019 Facebook
3#include <test_progs.h>
4static 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
18extern int extra_prog_load_log_flags;
19
7c944106 20static 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
43err_out:
e5e7a8f2 44 bpf_object__close(obj);
e5e7a8f2
AS
45 return err;
46}
47
51436ed7
AN
48struct scale_test_def {
49 const char *file;
50 enum bpf_prog_type attach_type;
51 bool fails;
52};
53
3762a39c
AN
54static 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
76void test_verif_scale1()
77{
afef88e6 78 scale_test("test_verif_scale1.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
3762a39c
AN
79}
80
81void test_verif_scale2()
82{
afef88e6 83 scale_test("test_verif_scale2.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
3762a39c
AN
84}
85
86void test_verif_scale3()
87{
afef88e6 88 scale_test("test_verif_scale3.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
3762a39c
AN
89}
90
91void test_verif_scale_pyperf_global()
92{
afef88e6 93 scale_test("pyperf_global.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
3762a39c
AN
94}
95
96void test_verif_scale_pyperf_subprogs()
97{
afef88e6 98 scale_test("pyperf_subprogs.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
3762a39c
AN
99}
100
101void 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
107void 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
113void 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
119void 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
130void 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
136void 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
147void test_verif_scale_loop1()
148{
afef88e6 149 scale_test("loop1.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
3762a39c
AN
150}
151
152void test_verif_scale_loop2()
153{
afef88e6 154 scale_test("loop2.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
3762a39c
AN
155}
156
157void test_verif_scale_loop3_fail()
158{
afef88e6 159 scale_test("loop3.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, true /* fails */);
3762a39c
AN
160}
161
162void test_verif_scale_loop4()
163{
afef88e6 164 scale_test("loop4.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
3762a39c
AN
165}
166
167void test_verif_scale_loop5()
168{
afef88e6 169 scale_test("loop5.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
3762a39c
AN
170}
171
172void test_verif_scale_loop6()
173{
afef88e6 174 scale_test("loop6.bpf.o", BPF_PROG_TYPE_KPROBE, false);
3762a39c
AN
175}
176
177void 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
186void 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
192void 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
198void 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
204void 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
210void 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
215void 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
220void test_verif_scale_xdp_loop()
221{
afef88e6 222 scale_test("test_xdp_loop.bpf.o", BPF_PROG_TYPE_XDP, false);
3762a39c
AN
223}
224
225void 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
230void test_verif_twfw()
231{
afef88e6 232 scale_test("twfw.bpf.o", BPF_PROG_TYPE_CGROUP_SKB, false);
0869e507 233}
This page took 0.291715 seconds and 4 git commands to generate.