root/tools/testing/selftests/bpf/prog_tests/bpf_verif_scale.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. libbpf_debug_print
  2. check_load
  3. test_bpf_verif_scale

   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 {
   7         if (level != LIBBPF_DEBUG) {
   8                 vprintf(format, args);
   9                 return 0;
  10         }
  11 
  12         if (!strstr(format, "verifier log"))
  13                 return 0;
  14         vprintf("%s", args);
  15         return 0;
  16 }
  17 
  18 static int check_load(const char *file, enum bpf_prog_type type)
  19 {
  20         struct bpf_prog_load_attr attr;
  21         struct bpf_object *obj = NULL;
  22         int err, prog_fd;
  23 
  24         memset(&attr, 0, sizeof(struct bpf_prog_load_attr));
  25         attr.file = file;
  26         attr.prog_type = type;
  27         attr.log_level = 4;
  28         attr.prog_flags = BPF_F_TEST_RND_HI32;
  29         err = bpf_prog_load_xattr(&attr, &obj, &prog_fd);
  30         bpf_object__close(obj);
  31         return err;
  32 }
  33 
  34 struct scale_test_def {
  35         const char *file;
  36         enum bpf_prog_type attach_type;
  37         bool fails;
  38 };
  39 
  40 void test_bpf_verif_scale(void)
  41 {
  42         struct scale_test_def tests[] = {
  43                 { "loop3.o", BPF_PROG_TYPE_RAW_TRACEPOINT, true /* fails */ },
  44 
  45                 { "test_verif_scale1.o", BPF_PROG_TYPE_SCHED_CLS },
  46                 { "test_verif_scale2.o", BPF_PROG_TYPE_SCHED_CLS },
  47                 { "test_verif_scale3.o", BPF_PROG_TYPE_SCHED_CLS },
  48 
  49                 /* full unroll by llvm */
  50                 { "pyperf50.o", BPF_PROG_TYPE_RAW_TRACEPOINT },
  51                 { "pyperf100.o", BPF_PROG_TYPE_RAW_TRACEPOINT },
  52                 { "pyperf180.o", BPF_PROG_TYPE_RAW_TRACEPOINT },
  53 
  54                 /* partial unroll. llvm will unroll loop ~150 times.
  55                  * C loop count -> 600.
  56                  * Asm loop count -> 4.
  57                  * 16k insns in loop body.
  58                  * Total of 5 such loops. Total program size ~82k insns.
  59                  */
  60                 { "pyperf600.o", BPF_PROG_TYPE_RAW_TRACEPOINT },
  61 
  62                 /* no unroll at all.
  63                  * C loop count -> 600.
  64                  * ASM loop count -> 600.
  65                  * ~110 insns in loop body.
  66                  * Total of 5 such loops. Total program size ~1500 insns.
  67                  */
  68                 { "pyperf600_nounroll.o", BPF_PROG_TYPE_RAW_TRACEPOINT },
  69 
  70                 { "loop1.o", BPF_PROG_TYPE_RAW_TRACEPOINT },
  71                 { "loop2.o", BPF_PROG_TYPE_RAW_TRACEPOINT },
  72                 { "loop4.o", BPF_PROG_TYPE_SCHED_CLS },
  73                 { "loop5.o", BPF_PROG_TYPE_SCHED_CLS },
  74 
  75                 /* partial unroll. 19k insn in a loop.
  76                  * Total program size 20.8k insn.
  77                  * ~350k processed_insns
  78                  */
  79                 { "strobemeta.o", BPF_PROG_TYPE_RAW_TRACEPOINT },
  80 
  81                 /* no unroll, tiny loops */
  82                 { "strobemeta_nounroll1.o", BPF_PROG_TYPE_RAW_TRACEPOINT },
  83                 { "strobemeta_nounroll2.o", BPF_PROG_TYPE_RAW_TRACEPOINT },
  84 
  85                 { "test_sysctl_loop1.o", BPF_PROG_TYPE_CGROUP_SYSCTL },
  86                 { "test_sysctl_loop2.o", BPF_PROG_TYPE_CGROUP_SYSCTL },
  87 
  88                 { "test_xdp_loop.o", BPF_PROG_TYPE_XDP },
  89                 { "test_seg6_loop.o", BPF_PROG_TYPE_LWT_SEG6LOCAL },
  90         };
  91         libbpf_print_fn_t old_print_fn = NULL;
  92         int err, i;
  93 
  94         if (env.verifier_stats) {
  95                 test__force_log();
  96                 old_print_fn = libbpf_set_print(libbpf_debug_print);
  97         }
  98 
  99         for (i = 0; i < ARRAY_SIZE(tests); i++) {
 100                 const struct scale_test_def *test = &tests[i];
 101 
 102                 if (!test__start_subtest(test->file))
 103                         continue;
 104 
 105                 err = check_load(test->file, test->attach_type);
 106                 CHECK_FAIL(err && !test->fails);
 107         }
 108 
 109         if (env.verifier_stats)
 110                 libbpf_set_print(old_print_fn);
 111 }

/* [<][>][^][v][top][bottom][index][help] */