1e5e7a8f2SAlexei Starovoitov // SPDX-License-Identifier: GPL-2.0
2e5e7a8f2SAlexei Starovoitov // Copyright (c) 2019 Facebook
3e5e7a8f2SAlexei Starovoitov #include <test_progs.h>
libbpf_debug_print(enum libbpf_print_level level,const char * format,va_list args)4e5e7a8f2SAlexei Starovoitov static int libbpf_debug_print(enum libbpf_print_level level,
5e5e7a8f2SAlexei Starovoitov 			      const char *format, va_list args)
6e5e7a8f2SAlexei Starovoitov {
70ff97e56SAndrii Nakryiko 	if (level != LIBBPF_DEBUG) {
866bd2ec1SStanislav Fomichev 		vprintf(format, args);
90ff97e56SAndrii Nakryiko 		return 0;
100ff97e56SAndrii Nakryiko 	}
11e5e7a8f2SAlexei Starovoitov 
12e5e7a8f2SAlexei Starovoitov 	if (!strstr(format, "verifier log"))
13e5e7a8f2SAlexei Starovoitov 		return 0;
1466bd2ec1SStanislav Fomichev 	vprintf("%s", args);
150ff97e56SAndrii Nakryiko 	return 0;
16e5e7a8f2SAlexei Starovoitov }
17e5e7a8f2SAlexei Starovoitov 
18a8fdaad5SAndrii Nakryiko extern int extra_prog_load_log_flags;
19a8fdaad5SAndrii Nakryiko 
check_load(const char * file,enum bpf_prog_type type)207c944106SAlexei Starovoitov static int check_load(const char *file, enum bpf_prog_type type)
21e5e7a8f2SAlexei Starovoitov {
2207b61991SLorenz Bauer 	struct bpf_object *obj = NULL;
23186d1a86SAndrii Nakryiko 	struct bpf_program *prog;
24186d1a86SAndrii Nakryiko 	int err;
25e5e7a8f2SAlexei Starovoitov 
26186d1a86SAndrii Nakryiko 	obj = bpf_object__open_file(file, NULL);
27186d1a86SAndrii Nakryiko 	err = libbpf_get_error(obj);
28186d1a86SAndrii Nakryiko 	if (err)
29186d1a86SAndrii Nakryiko 		return err;
30186d1a86SAndrii Nakryiko 
31186d1a86SAndrii Nakryiko 	prog = bpf_object__next_program(obj, NULL);
32186d1a86SAndrii Nakryiko 	if (!prog) {
33186d1a86SAndrii Nakryiko 		err = -ENOENT;
34186d1a86SAndrii Nakryiko 		goto err_out;
35186d1a86SAndrii Nakryiko 	}
36186d1a86SAndrii Nakryiko 
37186d1a86SAndrii Nakryiko 	bpf_program__set_type(prog, type);
38186d1a86SAndrii Nakryiko 	bpf_program__set_flags(prog, BPF_F_TEST_RND_HI32);
39186d1a86SAndrii Nakryiko 	bpf_program__set_log_level(prog, 4 | extra_prog_load_log_flags);
40186d1a86SAndrii Nakryiko 
41186d1a86SAndrii Nakryiko 	err = bpf_object__load(obj);
42186d1a86SAndrii Nakryiko 
43186d1a86SAndrii Nakryiko err_out:
44e5e7a8f2SAlexei Starovoitov 	bpf_object__close(obj);
45e5e7a8f2SAlexei Starovoitov 	return err;
46e5e7a8f2SAlexei Starovoitov }
47e5e7a8f2SAlexei Starovoitov 
4851436ed7SAndrii Nakryiko struct scale_test_def {
4951436ed7SAndrii Nakryiko 	const char *file;
5051436ed7SAndrii Nakryiko 	enum bpf_prog_type attach_type;
5151436ed7SAndrii Nakryiko 	bool fails;
5251436ed7SAndrii Nakryiko };
5351436ed7SAndrii Nakryiko 
scale_test(const char * file,enum bpf_prog_type attach_type,bool should_fail)543762a39cSAndrii Nakryiko static void scale_test(const char *file,
553762a39cSAndrii Nakryiko 		       enum bpf_prog_type attach_type,
563762a39cSAndrii Nakryiko 		       bool should_fail)
57e5e7a8f2SAlexei Starovoitov {
58329e38f7SAndrii Nakryiko 	libbpf_print_fn_t old_print_fn = NULL;
593762a39cSAndrii Nakryiko 	int err;
60e5e7a8f2SAlexei Starovoitov 
610ff97e56SAndrii Nakryiko 	if (env.verifier_stats) {
620ff97e56SAndrii Nakryiko 		test__force_log();
63329e38f7SAndrii Nakryiko 		old_print_fn = libbpf_set_print(libbpf_debug_print);
640ff97e56SAndrii Nakryiko 	}
65e5e7a8f2SAlexei Starovoitov 
663762a39cSAndrii Nakryiko 	err = check_load(file, attach_type);
673762a39cSAndrii Nakryiko 	if (should_fail)
683762a39cSAndrii Nakryiko 		ASSERT_ERR(err, "expect_error");
693762a39cSAndrii Nakryiko 	else
703762a39cSAndrii Nakryiko 		ASSERT_OK(err, "expect_success");
71b061017fSAlexei Starovoitov 
720ff97e56SAndrii Nakryiko 	if (env.verifier_stats)
73329e38f7SAndrii Nakryiko 		libbpf_set_print(old_print_fn);
74e5e7a8f2SAlexei Starovoitov }
753762a39cSAndrii Nakryiko 
test_verif_scale1()763762a39cSAndrii Nakryiko void test_verif_scale1()
773762a39cSAndrii Nakryiko {
78afef88e6SDaniel Müller 	scale_test("test_verif_scale1.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
793762a39cSAndrii Nakryiko }
803762a39cSAndrii Nakryiko 
test_verif_scale2()813762a39cSAndrii Nakryiko void test_verif_scale2()
823762a39cSAndrii Nakryiko {
83afef88e6SDaniel Müller 	scale_test("test_verif_scale2.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
843762a39cSAndrii Nakryiko }
853762a39cSAndrii Nakryiko 
test_verif_scale3()863762a39cSAndrii Nakryiko void test_verif_scale3()
873762a39cSAndrii Nakryiko {
88afef88e6SDaniel Müller 	scale_test("test_verif_scale3.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
893762a39cSAndrii Nakryiko }
903762a39cSAndrii Nakryiko 
test_verif_scale_pyperf_global()913762a39cSAndrii Nakryiko void test_verif_scale_pyperf_global()
923762a39cSAndrii Nakryiko {
93afef88e6SDaniel Müller 	scale_test("pyperf_global.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
943762a39cSAndrii Nakryiko }
953762a39cSAndrii Nakryiko 
test_verif_scale_pyperf_subprogs()963762a39cSAndrii Nakryiko void test_verif_scale_pyperf_subprogs()
973762a39cSAndrii Nakryiko {
98afef88e6SDaniel Müller 	scale_test("pyperf_subprogs.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
993762a39cSAndrii Nakryiko }
1003762a39cSAndrii Nakryiko 
test_verif_scale_pyperf50()1013762a39cSAndrii Nakryiko void test_verif_scale_pyperf50()
1023762a39cSAndrii Nakryiko {
1033762a39cSAndrii Nakryiko 	/* full unroll by llvm */
104afef88e6SDaniel Müller 	scale_test("pyperf50.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
1053762a39cSAndrii Nakryiko }
1063762a39cSAndrii Nakryiko 
test_verif_scale_pyperf100()1073762a39cSAndrii Nakryiko void test_verif_scale_pyperf100()
1083762a39cSAndrii Nakryiko {
1093762a39cSAndrii Nakryiko 	/* full unroll by llvm */
110afef88e6SDaniel Müller 	scale_test("pyperf100.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
1113762a39cSAndrii Nakryiko }
1123762a39cSAndrii Nakryiko 
test_verif_scale_pyperf180()1133762a39cSAndrii Nakryiko void test_verif_scale_pyperf180()
1143762a39cSAndrii Nakryiko {
1153762a39cSAndrii Nakryiko 	/* full unroll by llvm */
116afef88e6SDaniel Müller 	scale_test("pyperf180.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
1173762a39cSAndrii Nakryiko }
1183762a39cSAndrii Nakryiko 
test_verif_scale_pyperf600()1193762a39cSAndrii Nakryiko void test_verif_scale_pyperf600()
1203762a39cSAndrii Nakryiko {
1213762a39cSAndrii Nakryiko 	/* partial unroll. llvm will unroll loop ~150 times.
1223762a39cSAndrii Nakryiko 	 * C loop count -> 600.
1233762a39cSAndrii Nakryiko 	 * Asm loop count -> 4.
1243762a39cSAndrii Nakryiko 	 * 16k insns in loop body.
1253762a39cSAndrii Nakryiko 	 * Total of 5 such loops. Total program size ~82k insns.
1263762a39cSAndrii Nakryiko 	 */
127afef88e6SDaniel Müller 	scale_test("pyperf600.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
1283762a39cSAndrii Nakryiko }
1293762a39cSAndrii Nakryiko 
test_verif_scale_pyperf600_bpf_loop(void)130f6e659b7SJoanne Koong void test_verif_scale_pyperf600_bpf_loop(void)
131f6e659b7SJoanne Koong {
132f6e659b7SJoanne Koong 	/* use the bpf_loop helper*/
133afef88e6SDaniel Müller 	scale_test("pyperf600_bpf_loop.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
134f6e659b7SJoanne Koong }
135f6e659b7SJoanne Koong 
test_verif_scale_pyperf600_nounroll()1363762a39cSAndrii Nakryiko void test_verif_scale_pyperf600_nounroll()
1373762a39cSAndrii Nakryiko {
1383762a39cSAndrii Nakryiko 	/* no unroll at all.
1393762a39cSAndrii Nakryiko 	 * C loop count -> 600.
1403762a39cSAndrii Nakryiko 	 * ASM loop count -> 600.
1413762a39cSAndrii Nakryiko 	 * ~110 insns in loop body.
1423762a39cSAndrii Nakryiko 	 * Total of 5 such loops. Total program size ~1500 insns.
1433762a39cSAndrii Nakryiko 	 */
144afef88e6SDaniel Müller 	scale_test("pyperf600_nounroll.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
1453762a39cSAndrii Nakryiko }
1463762a39cSAndrii Nakryiko 
test_verif_scale_pyperf600_iter()147*8c2b5e90SAndrii Nakryiko void test_verif_scale_pyperf600_iter()
148*8c2b5e90SAndrii Nakryiko {
149*8c2b5e90SAndrii Nakryiko 	/* open-coded BPF iterator version */
150*8c2b5e90SAndrii Nakryiko 	scale_test("pyperf600_iter.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
151*8c2b5e90SAndrii Nakryiko }
152*8c2b5e90SAndrii Nakryiko 
test_verif_scale_loop1()1533762a39cSAndrii Nakryiko void test_verif_scale_loop1()
1543762a39cSAndrii Nakryiko {
155afef88e6SDaniel Müller 	scale_test("loop1.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
1563762a39cSAndrii Nakryiko }
1573762a39cSAndrii Nakryiko 
test_verif_scale_loop2()1583762a39cSAndrii Nakryiko void test_verif_scale_loop2()
1593762a39cSAndrii Nakryiko {
160afef88e6SDaniel Müller 	scale_test("loop2.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
1613762a39cSAndrii Nakryiko }
1623762a39cSAndrii Nakryiko 
test_verif_scale_loop3_fail()1633762a39cSAndrii Nakryiko void test_verif_scale_loop3_fail()
1643762a39cSAndrii Nakryiko {
165afef88e6SDaniel Müller 	scale_test("loop3.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, true /* fails */);
1663762a39cSAndrii Nakryiko }
1673762a39cSAndrii Nakryiko 
test_verif_scale_loop4()1683762a39cSAndrii Nakryiko void test_verif_scale_loop4()
1693762a39cSAndrii Nakryiko {
170afef88e6SDaniel Müller 	scale_test("loop4.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
1713762a39cSAndrii Nakryiko }
1723762a39cSAndrii Nakryiko 
test_verif_scale_loop5()1733762a39cSAndrii Nakryiko void test_verif_scale_loop5()
1743762a39cSAndrii Nakryiko {
175afef88e6SDaniel Müller 	scale_test("loop5.bpf.o", BPF_PROG_TYPE_SCHED_CLS, false);
1763762a39cSAndrii Nakryiko }
1773762a39cSAndrii Nakryiko 
test_verif_scale_loop6()1783762a39cSAndrii Nakryiko void test_verif_scale_loop6()
1793762a39cSAndrii Nakryiko {
180afef88e6SDaniel Müller 	scale_test("loop6.bpf.o", BPF_PROG_TYPE_KPROBE, false);
1813762a39cSAndrii Nakryiko }
1823762a39cSAndrii Nakryiko 
test_verif_scale_strobemeta()1833762a39cSAndrii Nakryiko void test_verif_scale_strobemeta()
1843762a39cSAndrii Nakryiko {
1853762a39cSAndrii Nakryiko 	/* partial unroll. 19k insn in a loop.
1863762a39cSAndrii Nakryiko 	 * Total program size 20.8k insn.
1873762a39cSAndrii Nakryiko 	 * ~350k processed_insns
1883762a39cSAndrii Nakryiko 	 */
189afef88e6SDaniel Müller 	scale_test("strobemeta.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
1903762a39cSAndrii Nakryiko }
1913762a39cSAndrii Nakryiko 
test_verif_scale_strobemeta_bpf_loop(void)192f6e659b7SJoanne Koong void test_verif_scale_strobemeta_bpf_loop(void)
193f6e659b7SJoanne Koong {
194f6e659b7SJoanne Koong 	/* use the bpf_loop helper*/
195afef88e6SDaniel Müller 	scale_test("strobemeta_bpf_loop.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
196f6e659b7SJoanne Koong }
197f6e659b7SJoanne Koong 
test_verif_scale_strobemeta_nounroll1()1983762a39cSAndrii Nakryiko void test_verif_scale_strobemeta_nounroll1()
1993762a39cSAndrii Nakryiko {
2003762a39cSAndrii Nakryiko 	/* no unroll, tiny loops */
201afef88e6SDaniel Müller 	scale_test("strobemeta_nounroll1.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
2023762a39cSAndrii Nakryiko }
2033762a39cSAndrii Nakryiko 
test_verif_scale_strobemeta_nounroll2()2043762a39cSAndrii Nakryiko void test_verif_scale_strobemeta_nounroll2()
2053762a39cSAndrii Nakryiko {
2063762a39cSAndrii Nakryiko 	/* no unroll, tiny loops */
207afef88e6SDaniel Müller 	scale_test("strobemeta_nounroll2.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
2083762a39cSAndrii Nakryiko }
2093762a39cSAndrii Nakryiko 
test_verif_scale_strobemeta_subprogs()2103762a39cSAndrii Nakryiko void test_verif_scale_strobemeta_subprogs()
2113762a39cSAndrii Nakryiko {
2123762a39cSAndrii Nakryiko 	/* non-inlined subprogs */
213afef88e6SDaniel Müller 	scale_test("strobemeta_subprogs.bpf.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
2143762a39cSAndrii Nakryiko }
2153762a39cSAndrii Nakryiko 
test_verif_scale_sysctl_loop1()2163762a39cSAndrii Nakryiko void test_verif_scale_sysctl_loop1()
2173762a39cSAndrii Nakryiko {
218afef88e6SDaniel Müller 	scale_test("test_sysctl_loop1.bpf.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false);
2193762a39cSAndrii Nakryiko }
2203762a39cSAndrii Nakryiko 
test_verif_scale_sysctl_loop2()2213762a39cSAndrii Nakryiko void test_verif_scale_sysctl_loop2()
2223762a39cSAndrii Nakryiko {
223afef88e6SDaniel Müller 	scale_test("test_sysctl_loop2.bpf.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false);
2243762a39cSAndrii Nakryiko }
2253762a39cSAndrii Nakryiko 
test_verif_scale_xdp_loop()2263762a39cSAndrii Nakryiko void test_verif_scale_xdp_loop()
2273762a39cSAndrii Nakryiko {
228afef88e6SDaniel Müller 	scale_test("test_xdp_loop.bpf.o", BPF_PROG_TYPE_XDP, false);
2293762a39cSAndrii Nakryiko }
2303762a39cSAndrii Nakryiko 
test_verif_scale_seg6_loop()2313762a39cSAndrii Nakryiko void test_verif_scale_seg6_loop()
2323762a39cSAndrii Nakryiko {
233afef88e6SDaniel Müller 	scale_test("test_seg6_loop.bpf.o", BPF_PROG_TYPE_LWT_SEG6LOCAL, false);
2343762a39cSAndrii Nakryiko }
2350869e507SAlexei Starovoitov 
test_verif_twfw()2360869e507SAlexei Starovoitov void test_verif_twfw()
2370869e507SAlexei Starovoitov {
238afef88e6SDaniel Müller 	scale_test("twfw.bpf.o", BPF_PROG_TYPE_CGROUP_SKB, false);
2390869e507SAlexei Starovoitov }
240