Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 // Copyright (c) 2019 Facebook
0003 #include <test_progs.h>
0004 static int libbpf_debug_print(enum libbpf_print_level level,
0005                   const char *format, va_list args)
0006 {
0007     if (level != LIBBPF_DEBUG) {
0008         vprintf(format, args);
0009         return 0;
0010     }
0011 
0012     if (!strstr(format, "verifier log"))
0013         return 0;
0014     vprintf("%s", args);
0015     return 0;
0016 }
0017 
0018 extern int extra_prog_load_log_flags;
0019 
0020 static int check_load(const char *file, enum bpf_prog_type type)
0021 {
0022     struct bpf_object *obj = NULL;
0023     struct bpf_program *prog;
0024     int err;
0025 
0026     obj = bpf_object__open_file(file, NULL);
0027     err = libbpf_get_error(obj);
0028     if (err)
0029         return err;
0030 
0031     prog = bpf_object__next_program(obj, NULL);
0032     if (!prog) {
0033         err = -ENOENT;
0034         goto err_out;
0035     }
0036 
0037     bpf_program__set_type(prog, type);
0038     bpf_program__set_flags(prog, BPF_F_TEST_RND_HI32);
0039     bpf_program__set_log_level(prog, 4 | extra_prog_load_log_flags);
0040 
0041     err = bpf_object__load(obj);
0042 
0043 err_out:
0044     bpf_object__close(obj);
0045     return err;
0046 }
0047 
0048 struct scale_test_def {
0049     const char *file;
0050     enum bpf_prog_type attach_type;
0051     bool fails;
0052 };
0053 
0054 static void scale_test(const char *file,
0055                enum bpf_prog_type attach_type,
0056                bool should_fail)
0057 {
0058     libbpf_print_fn_t old_print_fn = NULL;
0059     int err;
0060 
0061     if (env.verifier_stats) {
0062         test__force_log();
0063         old_print_fn = libbpf_set_print(libbpf_debug_print);
0064     }
0065 
0066     err = check_load(file, attach_type);
0067     if (should_fail)
0068         ASSERT_ERR(err, "expect_error");
0069     else
0070         ASSERT_OK(err, "expect_success");
0071 
0072     if (env.verifier_stats)
0073         libbpf_set_print(old_print_fn);
0074 }
0075 
0076 void test_verif_scale1()
0077 {
0078     scale_test("test_verif_scale1.o", BPF_PROG_TYPE_SCHED_CLS, false);
0079 }
0080 
0081 void test_verif_scale2()
0082 {
0083     scale_test("test_verif_scale2.o", BPF_PROG_TYPE_SCHED_CLS, false);
0084 }
0085 
0086 void test_verif_scale3()
0087 {
0088     scale_test("test_verif_scale3.o", BPF_PROG_TYPE_SCHED_CLS, false);
0089 }
0090 
0091 void test_verif_scale_pyperf_global()
0092 {
0093     scale_test("pyperf_global.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0094 }
0095 
0096 void test_verif_scale_pyperf_subprogs()
0097 {
0098     scale_test("pyperf_subprogs.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0099 }
0100 
0101 void test_verif_scale_pyperf50()
0102 {
0103     /* full unroll by llvm */
0104     scale_test("pyperf50.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0105 }
0106 
0107 void test_verif_scale_pyperf100()
0108 {
0109     /* full unroll by llvm */
0110     scale_test("pyperf100.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0111 }
0112 
0113 void test_verif_scale_pyperf180()
0114 {
0115     /* full unroll by llvm */
0116     scale_test("pyperf180.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0117 }
0118 
0119 void test_verif_scale_pyperf600()
0120 {
0121     /* partial unroll. llvm will unroll loop ~150 times.
0122      * C loop count -> 600.
0123      * Asm loop count -> 4.
0124      * 16k insns in loop body.
0125      * Total of 5 such loops. Total program size ~82k insns.
0126      */
0127     scale_test("pyperf600.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0128 }
0129 
0130 void test_verif_scale_pyperf600_bpf_loop(void)
0131 {
0132     /* use the bpf_loop helper*/
0133     scale_test("pyperf600_bpf_loop.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0134 }
0135 
0136 void test_verif_scale_pyperf600_nounroll()
0137 {
0138     /* no unroll at all.
0139      * C loop count -> 600.
0140      * ASM loop count -> 600.
0141      * ~110 insns in loop body.
0142      * Total of 5 such loops. Total program size ~1500 insns.
0143      */
0144     scale_test("pyperf600_nounroll.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0145 }
0146 
0147 void test_verif_scale_loop1()
0148 {
0149     scale_test("loop1.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0150 }
0151 
0152 void test_verif_scale_loop2()
0153 {
0154     scale_test("loop2.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0155 }
0156 
0157 void test_verif_scale_loop3_fail()
0158 {
0159     scale_test("loop3.o", BPF_PROG_TYPE_RAW_TRACEPOINT, true /* fails */);
0160 }
0161 
0162 void test_verif_scale_loop4()
0163 {
0164     scale_test("loop4.o", BPF_PROG_TYPE_SCHED_CLS, false);
0165 }
0166 
0167 void test_verif_scale_loop5()
0168 {
0169     scale_test("loop5.o", BPF_PROG_TYPE_SCHED_CLS, false);
0170 }
0171 
0172 void test_verif_scale_loop6()
0173 {
0174     scale_test("loop6.o", BPF_PROG_TYPE_KPROBE, false);
0175 }
0176 
0177 void test_verif_scale_strobemeta()
0178 {
0179     /* partial unroll. 19k insn in a loop.
0180      * Total program size 20.8k insn.
0181      * ~350k processed_insns
0182      */
0183     scale_test("strobemeta.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0184 }
0185 
0186 void test_verif_scale_strobemeta_bpf_loop(void)
0187 {
0188     /* use the bpf_loop helper*/
0189     scale_test("strobemeta_bpf_loop.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0190 }
0191 
0192 void test_verif_scale_strobemeta_nounroll1()
0193 {
0194     /* no unroll, tiny loops */
0195     scale_test("strobemeta_nounroll1.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0196 }
0197 
0198 void test_verif_scale_strobemeta_nounroll2()
0199 {
0200     /* no unroll, tiny loops */
0201     scale_test("strobemeta_nounroll2.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0202 }
0203 
0204 void test_verif_scale_strobemeta_subprogs()
0205 {
0206     /* non-inlined subprogs */
0207     scale_test("strobemeta_subprogs.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false);
0208 }
0209 
0210 void test_verif_scale_sysctl_loop1()
0211 {
0212     scale_test("test_sysctl_loop1.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false);
0213 }
0214 
0215 void test_verif_scale_sysctl_loop2()
0216 {
0217     scale_test("test_sysctl_loop2.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false);
0218 }
0219 
0220 void test_verif_scale_xdp_loop()
0221 {
0222     scale_test("test_xdp_loop.o", BPF_PROG_TYPE_XDP, false);
0223 }
0224 
0225 void test_verif_scale_seg6_loop()
0226 {
0227     scale_test("test_seg6_loop.o", BPF_PROG_TYPE_LWT_SEG6LOCAL, false);
0228 }
0229 
0230 void test_verif_twfw()
0231 {
0232     scale_test("twfw.o", BPF_PROG_TYPE_CGROUP_SKB, false);
0233 }