Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/bpf: Use non-autoloaded programs in few tests

Take advantage of new libbpf feature for declarative non-autoloaded BPF
program SEC() definitions in few test that test single program at a time
out of many available programs within the single BPF object.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20220419002452.632125-2-andrii@kernel.org

authored by

Andrii Nakryiko and committed by
Alexei Starovoitov
0d7fefeb a3820c48

+35 -65
+4 -6
tools/testing/selftests/bpf/prog_tests/helper_restricted.c
··· 6 6 void test_helper_restricted(void) 7 7 { 8 8 int prog_i = 0, prog_cnt; 9 - int duration = 0; 10 9 11 10 do { 12 11 struct test_helper_restricted *test; 13 - int maybeOK; 12 + int err; 14 13 15 14 test = test_helper_restricted__open(); 16 15 if (!ASSERT_OK_PTR(test, "open")) ··· 20 21 for (int j = 0; j < prog_cnt; ++j) { 21 22 struct bpf_program *prog = *test->skeleton->progs[j].prog; 22 23 23 - maybeOK = bpf_program__set_autoload(prog, prog_i == j); 24 - ASSERT_OK(maybeOK, "set autoload"); 24 + bpf_program__set_autoload(prog, true); 25 25 } 26 26 27 - maybeOK = test_helper_restricted__load(test); 28 - CHECK(!maybeOK, test->skeleton->progs[prog_i].name, "helper isn't restricted"); 27 + err = test_helper_restricted__load(test); 28 + ASSERT_ERR(err, "load_should_fail"); 29 29 30 30 test_helper_restricted__destroy(test); 31 31 } while (++prog_i < prog_cnt);
+7 -16
tools/testing/selftests/bpf/prog_tests/reference_tracking.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 2 #include <test_progs.h> 3 3 4 - static void toggle_object_autoload_progs(const struct bpf_object *obj, 5 - const char *name_load) 6 - { 7 - struct bpf_program *prog; 8 - 9 - bpf_object__for_each_program(prog, obj) { 10 - const char *name = bpf_program__name(prog); 11 - 12 - if (!strcmp(name_load, name)) 13 - bpf_program__set_autoload(prog, true); 14 - else 15 - bpf_program__set_autoload(prog, false); 16 - } 17 - } 18 - 19 4 void test_reference_tracking(void) 20 5 { 21 6 const char *file = "test_sk_lookup_kern.o"; ··· 24 39 goto cleanup; 25 40 26 41 bpf_object__for_each_program(prog, obj_iter) { 42 + struct bpf_program *p; 27 43 const char *name; 28 44 29 45 name = bpf_program__name(prog); ··· 35 49 if (!ASSERT_OK_PTR(obj, "obj_open_file")) 36 50 goto cleanup; 37 51 38 - toggle_object_autoload_progs(obj, name); 52 + /* all programs are not loaded by default, so just set 53 + * autoload to true for the single prog under test 54 + */ 55 + p = bpf_object__find_program_by_name(obj, name); 56 + bpf_program__set_autoload(p, true); 57 + 39 58 /* Expect verifier failure if test name has 'err' */ 40 59 if (strncmp(name, "err_", sizeof("err_") - 1) == 0) { 41 60 libbpf_print_fn_t old_print_fn;
+3 -22
tools/testing/selftests/bpf/prog_tests/test_strncmp.c
··· 44 44 static void test_strncmp_ret(void) 45 45 { 46 46 struct strncmp_test *skel; 47 - struct bpf_program *prog; 48 47 int err, got; 49 48 50 49 skel = strncmp_test__open(); 51 50 if (!ASSERT_OK_PTR(skel, "strncmp_test open")) 52 51 return; 53 - 54 - bpf_object__for_each_program(prog, skel->obj) 55 - bpf_program__set_autoload(prog, false); 56 52 57 53 bpf_program__set_autoload(skel->progs.do_strncmp, true); 58 54 ··· 87 91 static void test_strncmp_bad_not_const_str_size(void) 88 92 { 89 93 struct strncmp_test *skel; 90 - struct bpf_program *prog; 91 94 int err; 92 95 93 96 skel = strncmp_test__open(); 94 97 if (!ASSERT_OK_PTR(skel, "strncmp_test open")) 95 98 return; 96 99 97 - bpf_object__for_each_program(prog, skel->obj) 98 - bpf_program__set_autoload(prog, false); 99 - 100 - bpf_program__set_autoload(skel->progs.strncmp_bad_not_const_str_size, 101 - true); 100 + bpf_program__set_autoload(skel->progs.strncmp_bad_not_const_str_size, true); 102 101 103 102 err = strncmp_test__load(skel); 104 103 ASSERT_ERR(err, "strncmp_test load bad_not_const_str_size"); ··· 104 113 static void test_strncmp_bad_writable_target(void) 105 114 { 106 115 struct strncmp_test *skel; 107 - struct bpf_program *prog; 108 116 int err; 109 117 110 118 skel = strncmp_test__open(); 111 119 if (!ASSERT_OK_PTR(skel, "strncmp_test open")) 112 120 return; 113 121 114 - bpf_object__for_each_program(prog, skel->obj) 115 - bpf_program__set_autoload(prog, false); 116 - 117 - bpf_program__set_autoload(skel->progs.strncmp_bad_writable_target, 118 - true); 122 + bpf_program__set_autoload(skel->progs.strncmp_bad_writable_target, true); 119 123 120 124 err = strncmp_test__load(skel); 121 125 ASSERT_ERR(err, "strncmp_test load bad_writable_target"); ··· 121 135 static void test_strncmp_bad_not_null_term_target(void) 122 136 { 123 137 struct strncmp_test *skel; 124 - struct bpf_program *prog; 125 138 int err; 126 139 127 140 skel = strncmp_test__open(); 128 141 if (!ASSERT_OK_PTR(skel, "strncmp_test open")) 129 142 return; 130 143 131 - bpf_object__for_each_program(prog, skel->obj) 132 - bpf_program__set_autoload(prog, false); 133 - 134 - bpf_program__set_autoload(skel->progs.strncmp_bad_not_null_term_target, 135 - true); 144 + bpf_program__set_autoload(skel->progs.strncmp_bad_not_null_term_target, true); 136 145 137 146 err = strncmp_test__load(skel); 138 147 ASSERT_ERR(err, "strncmp_test load bad_not_null_term_target");
+4 -4
tools/testing/selftests/bpf/progs/strncmp_test.c
··· 19 19 20 20 char _license[] SEC("license") = "GPL"; 21 21 22 - SEC("tp/syscalls/sys_enter_nanosleep") 22 + SEC("?tp/syscalls/sys_enter_nanosleep") 23 23 int do_strncmp(void *ctx) 24 24 { 25 25 if ((bpf_get_current_pid_tgid() >> 32) != target_pid) ··· 29 29 return 0; 30 30 } 31 31 32 - SEC("tp/syscalls/sys_enter_nanosleep") 32 + SEC("?tp/syscalls/sys_enter_nanosleep") 33 33 int strncmp_bad_not_const_str_size(void *ctx) 34 34 { 35 35 /* The value of string size is not const, so will fail */ ··· 37 37 return 0; 38 38 } 39 39 40 - SEC("tp/syscalls/sys_enter_nanosleep") 40 + SEC("?tp/syscalls/sys_enter_nanosleep") 41 41 int strncmp_bad_writable_target(void *ctx) 42 42 { 43 43 /* Compared target is not read-only, so will fail */ ··· 45 45 return 0; 46 46 } 47 47 48 - SEC("tp/syscalls/sys_enter_nanosleep") 48 + SEC("?tp/syscalls/sys_enter_nanosleep") 49 49 int strncmp_bad_not_null_term_target(void *ctx) 50 50 { 51 51 /* Compared target is not null-terminated, so will fail */
+8 -8
tools/testing/selftests/bpf/progs/test_helper_restricted.c
··· 56 56 } 57 57 } 58 58 59 - SEC("raw_tp/sys_enter") 59 + SEC("?raw_tp/sys_enter") 60 60 int raw_tp_timer(void *ctx) 61 61 { 62 62 timer_work(); ··· 64 64 return 0; 65 65 } 66 66 67 - SEC("tp/syscalls/sys_enter_nanosleep") 67 + SEC("?tp/syscalls/sys_enter_nanosleep") 68 68 int tp_timer(void *ctx) 69 69 { 70 70 timer_work(); ··· 72 72 return 0; 73 73 } 74 74 75 - SEC("kprobe/sys_nanosleep") 75 + SEC("?kprobe/sys_nanosleep") 76 76 int kprobe_timer(void *ctx) 77 77 { 78 78 timer_work(); ··· 80 80 return 0; 81 81 } 82 82 83 - SEC("perf_event") 83 + SEC("?perf_event") 84 84 int perf_event_timer(void *ctx) 85 85 { 86 86 timer_work(); ··· 88 88 return 0; 89 89 } 90 90 91 - SEC("raw_tp/sys_enter") 91 + SEC("?raw_tp/sys_enter") 92 92 int raw_tp_spin_lock(void *ctx) 93 93 { 94 94 spin_lock_work(); ··· 96 96 return 0; 97 97 } 98 98 99 - SEC("tp/syscalls/sys_enter_nanosleep") 99 + SEC("?tp/syscalls/sys_enter_nanosleep") 100 100 int tp_spin_lock(void *ctx) 101 101 { 102 102 spin_lock_work(); ··· 104 104 return 0; 105 105 } 106 106 107 - SEC("kprobe/sys_nanosleep") 107 + SEC("?kprobe/sys_nanosleep") 108 108 int kprobe_spin_lock(void *ctx) 109 109 { 110 110 spin_lock_work(); ··· 112 112 return 0; 113 113 } 114 114 115 - SEC("perf_event") 115 + SEC("?perf_event") 116 116 int perf_event_spin_lock(void *ctx) 117 117 { 118 118 spin_lock_work();
+9 -9
tools/testing/selftests/bpf/progs/test_sk_lookup_kern.c
··· 52 52 return result; 53 53 } 54 54 55 - SEC("tc") 55 + SEC("?tc") 56 56 int sk_lookup_success(struct __sk_buff *skb) 57 57 { 58 58 void *data_end = (void *)(long)skb->data_end; ··· 78 78 return sk ? TC_ACT_OK : TC_ACT_UNSPEC; 79 79 } 80 80 81 - SEC("tc") 81 + SEC("?tc") 82 82 int sk_lookup_success_simple(struct __sk_buff *skb) 83 83 { 84 84 struct bpf_sock_tuple tuple = {}; ··· 90 90 return 0; 91 91 } 92 92 93 - SEC("tc") 93 + SEC("?tc") 94 94 int err_use_after_free(struct __sk_buff *skb) 95 95 { 96 96 struct bpf_sock_tuple tuple = {}; ··· 105 105 return family; 106 106 } 107 107 108 - SEC("tc") 108 + SEC("?tc") 109 109 int err_modify_sk_pointer(struct __sk_buff *skb) 110 110 { 111 111 struct bpf_sock_tuple tuple = {}; ··· 120 120 return 0; 121 121 } 122 122 123 - SEC("tc") 123 + SEC("?tc") 124 124 int err_modify_sk_or_null_pointer(struct __sk_buff *skb) 125 125 { 126 126 struct bpf_sock_tuple tuple = {}; ··· 134 134 return 0; 135 135 } 136 136 137 - SEC("tc") 137 + SEC("?tc") 138 138 int err_no_release(struct __sk_buff *skb) 139 139 { 140 140 struct bpf_sock_tuple tuple = {}; ··· 143 143 return 0; 144 144 } 145 145 146 - SEC("tc") 146 + SEC("?tc") 147 147 int err_release_twice(struct __sk_buff *skb) 148 148 { 149 149 struct bpf_sock_tuple tuple = {}; ··· 155 155 return 0; 156 156 } 157 157 158 - SEC("tc") 158 + SEC("?tc") 159 159 int err_release_unchecked(struct __sk_buff *skb) 160 160 { 161 161 struct bpf_sock_tuple tuple = {}; ··· 172 172 bpf_sk_lookup_tcp(skb, &tuple, sizeof(tuple), BPF_F_CURRENT_NETNS, 0); 173 173 } 174 174 175 - SEC("tc") 175 + SEC("?tc") 176 176 int err_no_release_subcall(struct __sk_buff *skb) 177 177 { 178 178 lookup_no_release(skb);