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

selftests/bpf: Migrate from bpf_prog_test_run

bpf_prog_test_run is being deprecated in favor of the OPTS-based
bpf_prog_test_run_opts.
We end up unable to use CHECK in most cases, so replace usages with
ASSERT_* calls.

Signed-off-by: Delyan Kratunov <delyank@fb.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20220202235423.1097270-2-delyank@fb.com

authored by

Delyan Kratunov and committed by
Andrii Nakryiko
04fcb5f9 dd5152ab

+648 -522
+35 -37
tools/testing/selftests/bpf/prog_tests/atomics.c
··· 7 7 static void test_add(struct atomics_lskel *skel) 8 8 { 9 9 int err, prog_fd; 10 - __u32 duration = 0, retval; 11 10 int link_fd; 11 + LIBBPF_OPTS(bpf_test_run_opts, topts); 12 12 13 13 link_fd = atomics_lskel__add__attach(skel); 14 14 if (!ASSERT_GT(link_fd, 0, "attach(add)")) 15 15 return; 16 16 17 17 prog_fd = skel->progs.add.prog_fd; 18 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 19 - NULL, NULL, &retval, &duration); 20 - if (CHECK(err || retval, "test_run add", 21 - "err %d errno %d retval %d duration %d\n", err, errno, retval, duration)) 18 + err = bpf_prog_test_run_opts(prog_fd, &topts); 19 + if (!ASSERT_OK(err, "test_run_opts err")) 20 + goto cleanup; 21 + if (!ASSERT_OK(topts.retval, "test_run_opts retval")) 22 22 goto cleanup; 23 23 24 24 ASSERT_EQ(skel->data->add64_value, 3, "add64_value"); ··· 39 39 static void test_sub(struct atomics_lskel *skel) 40 40 { 41 41 int err, prog_fd; 42 - __u32 duration = 0, retval; 43 42 int link_fd; 43 + LIBBPF_OPTS(bpf_test_run_opts, topts); 44 44 45 45 link_fd = atomics_lskel__sub__attach(skel); 46 46 if (!ASSERT_GT(link_fd, 0, "attach(sub)")) 47 47 return; 48 48 49 49 prog_fd = skel->progs.sub.prog_fd; 50 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 51 - NULL, NULL, &retval, &duration); 52 - if (CHECK(err || retval, "test_run sub", 53 - "err %d errno %d retval %d duration %d\n", 54 - err, errno, retval, duration)) 50 + err = bpf_prog_test_run_opts(prog_fd, &topts); 51 + if (!ASSERT_OK(err, "test_run_opts err")) 52 + goto cleanup; 53 + if (!ASSERT_OK(topts.retval, "test_run_opts retval")) 55 54 goto cleanup; 56 55 57 56 ASSERT_EQ(skel->data->sub64_value, -1, "sub64_value"); ··· 71 72 static void test_and(struct atomics_lskel *skel) 72 73 { 73 74 int err, prog_fd; 74 - __u32 duration = 0, retval; 75 75 int link_fd; 76 + LIBBPF_OPTS(bpf_test_run_opts, topts); 76 77 77 78 link_fd = atomics_lskel__and__attach(skel); 78 79 if (!ASSERT_GT(link_fd, 0, "attach(and)")) 79 80 return; 80 81 81 82 prog_fd = skel->progs.and.prog_fd; 82 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 83 - NULL, NULL, &retval, &duration); 84 - if (CHECK(err || retval, "test_run and", 85 - "err %d errno %d retval %d duration %d\n", err, errno, retval, duration)) 83 + err = bpf_prog_test_run_opts(prog_fd, &topts); 84 + if (!ASSERT_OK(err, "test_run_opts err")) 85 + goto cleanup; 86 + if (!ASSERT_OK(topts.retval, "test_run_opts retval")) 86 87 goto cleanup; 87 88 88 89 ASSERT_EQ(skel->data->and64_value, 0x010ull << 32, "and64_value"); ··· 99 100 static void test_or(struct atomics_lskel *skel) 100 101 { 101 102 int err, prog_fd; 102 - __u32 duration = 0, retval; 103 103 int link_fd; 104 + LIBBPF_OPTS(bpf_test_run_opts, topts); 104 105 105 106 link_fd = atomics_lskel__or__attach(skel); 106 107 if (!ASSERT_GT(link_fd, 0, "attach(or)")) 107 108 return; 108 109 109 110 prog_fd = skel->progs.or.prog_fd; 110 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 111 - NULL, NULL, &retval, &duration); 112 - if (CHECK(err || retval, "test_run or", 113 - "err %d errno %d retval %d duration %d\n", 114 - err, errno, retval, duration)) 111 + err = bpf_prog_test_run_opts(prog_fd, &topts); 112 + if (!ASSERT_OK(err, "test_run_opts err")) 113 + goto cleanup; 114 + if (!ASSERT_OK(topts.retval, "test_run_opts retval")) 115 115 goto cleanup; 116 116 117 117 ASSERT_EQ(skel->data->or64_value, 0x111ull << 32, "or64_value"); ··· 127 129 static void test_xor(struct atomics_lskel *skel) 128 130 { 129 131 int err, prog_fd; 130 - __u32 duration = 0, retval; 131 132 int link_fd; 133 + LIBBPF_OPTS(bpf_test_run_opts, topts); 132 134 133 135 link_fd = atomics_lskel__xor__attach(skel); 134 136 if (!ASSERT_GT(link_fd, 0, "attach(xor)")) 135 137 return; 136 138 137 139 prog_fd = skel->progs.xor.prog_fd; 138 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 139 - NULL, NULL, &retval, &duration); 140 - if (CHECK(err || retval, "test_run xor", 141 - "err %d errno %d retval %d duration %d\n", err, errno, retval, duration)) 140 + err = bpf_prog_test_run_opts(prog_fd, &topts); 141 + if (!ASSERT_OK(err, "test_run_opts err")) 142 + goto cleanup; 143 + if (!ASSERT_OK(topts.retval, "test_run_opts retval")) 142 144 goto cleanup; 143 145 144 146 ASSERT_EQ(skel->data->xor64_value, 0x101ull << 32, "xor64_value"); ··· 155 157 static void test_cmpxchg(struct atomics_lskel *skel) 156 158 { 157 159 int err, prog_fd; 158 - __u32 duration = 0, retval; 159 160 int link_fd; 161 + LIBBPF_OPTS(bpf_test_run_opts, topts); 160 162 161 163 link_fd = atomics_lskel__cmpxchg__attach(skel); 162 164 if (!ASSERT_GT(link_fd, 0, "attach(cmpxchg)")) 163 165 return; 164 166 165 167 prog_fd = skel->progs.cmpxchg.prog_fd; 166 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 167 - NULL, NULL, &retval, &duration); 168 - if (CHECK(err || retval, "test_run cmpxchg", 169 - "err %d errno %d retval %d duration %d\n", err, errno, retval, duration)) 168 + err = bpf_prog_test_run_opts(prog_fd, &topts); 169 + if (!ASSERT_OK(err, "test_run_opts err")) 170 + goto cleanup; 171 + if (!ASSERT_OK(topts.retval, "test_run_opts retval")) 170 172 goto cleanup; 171 173 172 174 ASSERT_EQ(skel->data->cmpxchg64_value, 2, "cmpxchg64_value"); ··· 184 186 static void test_xchg(struct atomics_lskel *skel) 185 187 { 186 188 int err, prog_fd; 187 - __u32 duration = 0, retval; 188 189 int link_fd; 190 + LIBBPF_OPTS(bpf_test_run_opts, topts); 189 191 190 192 link_fd = atomics_lskel__xchg__attach(skel); 191 193 if (!ASSERT_GT(link_fd, 0, "attach(xchg)")) 192 194 return; 193 195 194 196 prog_fd = skel->progs.xchg.prog_fd; 195 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 196 - NULL, NULL, &retval, &duration); 197 - if (CHECK(err || retval, "test_run xchg", 198 - "err %d errno %d retval %d duration %d\n", err, errno, retval, duration)) 197 + err = bpf_prog_test_run_opts(prog_fd, &topts); 198 + if (!ASSERT_OK(err, "test_run_opts err")) 199 + goto cleanup; 200 + if (!ASSERT_OK(topts.retval, "test_run_opts retval")) 199 201 goto cleanup; 200 202 201 203 ASSERT_EQ(skel->data->xchg64_value, 2, "xchg64_value");
+7 -3
tools/testing/selftests/bpf/prog_tests/bpf_nf.c
··· 11 11 void test_bpf_nf_ct(int mode) 12 12 { 13 13 struct test_bpf_nf *skel; 14 - int prog_fd, err, retval; 14 + int prog_fd, err; 15 + LIBBPF_OPTS(bpf_test_run_opts, topts, 16 + .data_in = &pkt_v4, 17 + .data_size_in = sizeof(pkt_v4), 18 + .repeat = 1, 19 + ); 15 20 16 21 skel = test_bpf_nf__open_and_load(); 17 22 if (!ASSERT_OK_PTR(skel, "test_bpf_nf__open_and_load")) ··· 27 22 else 28 23 prog_fd = bpf_program__fd(skel->progs.nf_skb_ct_test); 29 24 30 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), NULL, NULL, 31 - (__u32 *)&retval, NULL); 25 + err = bpf_prog_test_run_opts(prog_fd, &topts); 32 26 if (!ASSERT_OK(err, "bpf_prog_test_run")) 33 27 goto end; 34 28
+10 -14
tools/testing/selftests/bpf/prog_tests/fentry_fexit.c
··· 9 9 struct fentry_test_lskel *fentry_skel = NULL; 10 10 struct fexit_test_lskel *fexit_skel = NULL; 11 11 __u64 *fentry_res, *fexit_res; 12 - __u32 duration = 0, retval; 13 12 int err, prog_fd, i; 13 + LIBBPF_OPTS(bpf_test_run_opts, topts); 14 14 15 15 fentry_skel = fentry_test_lskel__open_and_load(); 16 - if (CHECK(!fentry_skel, "fentry_skel_load", "fentry skeleton failed\n")) 16 + if (!ASSERT_OK_PTR(fentry_skel, "fentry_skel_load")) 17 17 goto close_prog; 18 18 fexit_skel = fexit_test_lskel__open_and_load(); 19 - if (CHECK(!fexit_skel, "fexit_skel_load", "fexit skeleton failed\n")) 19 + if (!ASSERT_OK_PTR(fexit_skel, "fexit_skel_load")) 20 20 goto close_prog; 21 21 22 22 err = fentry_test_lskel__attach(fentry_skel); 23 - if (CHECK(err, "fentry_attach", "fentry attach failed: %d\n", err)) 23 + if (!ASSERT_OK(err, "fentry_attach")) 24 24 goto close_prog; 25 25 err = fexit_test_lskel__attach(fexit_skel); 26 - if (CHECK(err, "fexit_attach", "fexit attach failed: %d\n", err)) 26 + if (!ASSERT_OK(err, "fexit_attach")) 27 27 goto close_prog; 28 28 29 29 prog_fd = fexit_skel->progs.test1.prog_fd; 30 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 31 - NULL, NULL, &retval, &duration); 32 - CHECK(err || retval, "ipv6", 33 - "err %d errno %d retval %d duration %d\n", 34 - err, errno, retval, duration); 30 + err = bpf_prog_test_run_opts(prog_fd, &topts); 31 + ASSERT_OK(err, "ipv6 test_run"); 32 + ASSERT_OK(topts.retval, "ipv6 test retval"); 35 33 36 34 fentry_res = (__u64 *)fentry_skel->bss; 37 35 fexit_res = (__u64 *)fexit_skel->bss; 38 36 printf("%lld\n", fentry_skel->bss->test1_result); 39 37 for (i = 0; i < 8; i++) { 40 - CHECK(fentry_res[i] != 1, "result", 41 - "fentry_test%d failed err %lld\n", i + 1, fentry_res[i]); 42 - CHECK(fexit_res[i] != 1, "result", 43 - "fexit_test%d failed err %lld\n", i + 1, fexit_res[i]); 38 + ASSERT_EQ(fentry_res[i], 1, "fentry result"); 39 + ASSERT_EQ(fexit_res[i], 1, "fexit result"); 44 40 } 45 41 46 42 close_prog:
+3 -4
tools/testing/selftests/bpf/prog_tests/fentry_test.c
··· 6 6 static int fentry_test(struct fentry_test_lskel *fentry_skel) 7 7 { 8 8 int err, prog_fd, i; 9 - __u32 duration = 0, retval; 10 9 int link_fd; 11 10 __u64 *result; 11 + LIBBPF_OPTS(bpf_test_run_opts, topts); 12 12 13 13 err = fentry_test_lskel__attach(fentry_skel); 14 14 if (!ASSERT_OK(err, "fentry_attach")) ··· 20 20 return -1; 21 21 22 22 prog_fd = fentry_skel->progs.test1.prog_fd; 23 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 24 - NULL, NULL, &retval, &duration); 23 + err = bpf_prog_test_run_opts(prog_fd, &topts); 25 24 ASSERT_OK(err, "test_run"); 26 - ASSERT_EQ(retval, 0, "test_run"); 25 + ASSERT_EQ(topts.retval, 0, "test_run"); 27 26 28 27 result = (__u64 *)fentry_skel->bss; 29 28 for (i = 0; i < sizeof(*fentry_skel->bss) / sizeof(__u64); i++) {
+19 -13
tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c
··· 58 58 test_cb cb) 59 59 { 60 60 struct bpf_object *obj = NULL, *tgt_obj; 61 - __u32 retval, tgt_prog_id, info_len; 61 + __u32 tgt_prog_id, info_len; 62 62 struct bpf_prog_info prog_info = {}; 63 63 struct bpf_program **prog = NULL, *p; 64 64 struct bpf_link **link = NULL; 65 65 int err, tgt_fd, i; 66 66 struct btf *btf; 67 + LIBBPF_OPTS(bpf_test_run_opts, topts, 68 + .data_in = &pkt_v6, 69 + .data_size_in = sizeof(pkt_v6), 70 + .repeat = 1, 71 + ); 67 72 68 73 err = bpf_prog_test_load(target_obj_file, BPF_PROG_TYPE_UNSPEC, 69 74 &tgt_obj, &tgt_fd); ··· 152 147 if (!run_prog) 153 148 goto close_prog; 154 149 155 - err = bpf_prog_test_run(tgt_fd, 1, &pkt_v6, sizeof(pkt_v6), 156 - NULL, NULL, &retval, NULL); 150 + err = bpf_prog_test_run_opts(tgt_fd, &topts); 157 151 ASSERT_OK(err, "prog_run"); 158 - ASSERT_EQ(retval, 0, "prog_run_ret"); 152 + ASSERT_EQ(topts.retval, 0, "prog_run_ret"); 159 153 160 154 if (check_data_map(obj, prog_cnt, false)) 161 155 goto close_prog; ··· 229 225 const char *tgt_obj_file = "./test_pkt_access.o"; 230 226 struct bpf_program *prog = NULL; 231 227 struct bpf_object *tgt_obj; 232 - __u32 duration = 0, retval; 233 228 struct bpf_link *link; 234 229 int err = 0, tgt_fd; 230 + LIBBPF_OPTS(bpf_test_run_opts, topts, 231 + .data_in = &pkt_v6, 232 + .data_size_in = sizeof(pkt_v6), 233 + .repeat = 1, 234 + ); 235 235 236 236 prog = bpf_object__find_program_by_name(obj, prog_name); 237 - if (CHECK(!prog, "find_prog", "prog %s not found\n", prog_name)) 237 + if (!ASSERT_OK_PTR(prog, "find_prog")) 238 238 return -ENOENT; 239 239 240 240 err = bpf_prog_test_load(tgt_obj_file, BPF_PROG_TYPE_UNSPEC, 241 241 &tgt_obj, &tgt_fd); 242 - if (CHECK(err, "second_prog_load", "file %s err %d errno %d\n", 243 - tgt_obj_file, err, errno)) 242 + if (!ASSERT_OK(err, "second_prog_load")) 244 243 return err; 245 244 246 245 link = bpf_program__attach_freplace(prog, tgt_fd, tgt_name); 247 246 if (!ASSERT_OK_PTR(link, "second_link")) 248 247 goto out; 249 248 250 - err = bpf_prog_test_run(tgt_fd, 1, &pkt_v6, sizeof(pkt_v6), 251 - NULL, NULL, &retval, &duration); 252 - if (CHECK(err || retval, "ipv6", 253 - "err %d errno %d retval %d duration %d\n", 254 - err, errno, retval, duration)) 249 + err = bpf_prog_test_run_opts(tgt_fd, &topts); 250 + if (!ASSERT_OK(err, "ipv6 test_run")) 251 + goto out; 252 + if (!ASSERT_OK(topts.retval, "ipv6 retval")) 255 253 goto out; 256 254 257 255 err = check_data_map(obj, 1, true);
+11 -11
tools/testing/selftests/bpf/prog_tests/fexit_stress.c
··· 10 10 char test_skb[128] = {}; 11 11 int fexit_fd[CNT] = {}; 12 12 int link_fd[CNT] = {}; 13 - __u32 duration = 0; 14 13 char error[4096]; 15 - __u32 prog_ret; 16 14 int err, i, filter_fd; 17 15 18 16 const struct bpf_insn trace_program[] = { ··· 34 36 .log_size = sizeof(error), 35 37 ); 36 38 39 + LIBBPF_OPTS(bpf_test_run_opts, topts, 40 + .data_in = test_skb, 41 + .data_size_in = sizeof(test_skb), 42 + .repeat = 1, 43 + ); 44 + 37 45 err = libbpf_find_vmlinux_btf_id("bpf_fentry_test1", 38 46 trace_opts.expected_attach_type); 39 - if (CHECK(err <= 0, "find_vmlinux_btf_id", "failed: %d\n", err)) 47 + if (!ASSERT_GT(err, 0, "find_vmlinux_btf_id")) 40 48 goto out; 41 49 trace_opts.attach_btf_id = err; 42 50 ··· 51 47 trace_program, 52 48 sizeof(trace_program) / sizeof(struct bpf_insn), 53 49 &trace_opts); 54 - if (CHECK(fexit_fd[i] < 0, "fexit loaded", 55 - "failed: %d errno %d\n", fexit_fd[i], errno)) 50 + if (!ASSERT_GE(fexit_fd[i], 0, "fexit load")) 56 51 goto out; 57 52 link_fd[i] = bpf_raw_tracepoint_open(NULL, fexit_fd[i]); 58 - if (CHECK(link_fd[i] < 0, "fexit attach failed", 59 - "prog %d failed: %d err %d\n", i, link_fd[i], errno)) 53 + if (!ASSERT_GE(link_fd[i], 0, "fexit attach")) 60 54 goto out; 61 55 } 62 56 63 57 filter_fd = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", 64 58 skb_program, sizeof(skb_program) / sizeof(struct bpf_insn), 65 59 &skb_opts); 66 - if (CHECK(filter_fd < 0, "test_program_loaded", "failed: %d errno %d\n", 67 - filter_fd, errno)) 60 + if (!ASSERT_GE(filter_fd, 0, "test_program_loaded")) 68 61 goto out; 69 62 70 - err = bpf_prog_test_run(filter_fd, 1, test_skb, sizeof(test_skb), 0, 71 - 0, &prog_ret, 0); 63 + err = bpf_prog_test_run_opts(filter_fd, &topts); 72 64 close(filter_fd); 73 65 CHECK_FAIL(err); 74 66 out:
+3 -4
tools/testing/selftests/bpf/prog_tests/fexit_test.c
··· 6 6 static int fexit_test(struct fexit_test_lskel *fexit_skel) 7 7 { 8 8 int err, prog_fd, i; 9 - __u32 duration = 0, retval; 10 9 int link_fd; 11 10 __u64 *result; 11 + LIBBPF_OPTS(bpf_test_run_opts, topts); 12 12 13 13 err = fexit_test_lskel__attach(fexit_skel); 14 14 if (!ASSERT_OK(err, "fexit_attach")) ··· 20 20 return -1; 21 21 22 22 prog_fd = fexit_skel->progs.test1.prog_fd; 23 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 24 - NULL, NULL, &retval, &duration); 23 + err = bpf_prog_test_run_opts(prog_fd, &topts); 25 24 ASSERT_OK(err, "test_run"); 26 - ASSERT_EQ(retval, 0, "test_run"); 25 + ASSERT_EQ(topts.retval, 0, "test_run"); 27 26 28 27 result = (__u64 *)fexit_skel->bss; 29 28 for (i = 0; i < sizeof(*fexit_skel->bss) / sizeof(__u64); i++) {
+13 -11
tools/testing/selftests/bpf/prog_tests/flow_dissector_load_bytes.c
··· 5 5 void serial_test_flow_dissector_load_bytes(void) 6 6 { 7 7 struct bpf_flow_keys flow_keys; 8 - __u32 duration = 0, retval, size; 9 8 struct bpf_insn prog[] = { 10 9 // BPF_REG_1 - 1st argument: context 11 10 // BPF_REG_2 - 2nd argument: offset, start at first byte ··· 26 27 BPF_EXIT_INSN(), 27 28 }; 28 29 int fd, err; 30 + LIBBPF_OPTS(bpf_test_run_opts, topts, 31 + .data_in = &pkt_v4, 32 + .data_size_in = sizeof(pkt_v4), 33 + .data_out = &flow_keys, 34 + .data_size_out = sizeof(flow_keys), 35 + .repeat = 1, 36 + ); 29 37 30 38 /* make sure bpf_skb_load_bytes is not allowed from skb-less context 31 39 */ 32 40 fd = bpf_test_load_program(BPF_PROG_TYPE_FLOW_DISSECTOR, prog, 33 41 ARRAY_SIZE(prog), "GPL", 0, NULL, 0); 34 - CHECK(fd < 0, 35 - "flow_dissector-bpf_skb_load_bytes-load", 36 - "fd %d errno %d\n", 37 - fd, errno); 42 + ASSERT_GE(fd, 0, "bpf_test_load_program good fd"); 38 43 39 - err = bpf_prog_test_run(fd, 1, &pkt_v4, sizeof(pkt_v4), 40 - &flow_keys, &size, &retval, &duration); 41 - CHECK(size != sizeof(flow_keys) || err || retval != 1, 42 - "flow_dissector-bpf_skb_load_bytes", 43 - "err %d errno %d retval %d duration %d size %u/%zu\n", 44 - err, errno, retval, duration, size, sizeof(flow_keys)); 44 + err = bpf_prog_test_run_opts(fd, &topts); 45 + ASSERT_OK(err, "test_run"); 46 + ASSERT_EQ(topts.data_size_out, sizeof(flow_keys), 47 + "test_run data_size_out"); 48 + ASSERT_EQ(topts.retval, 1, "test_run retval"); 45 49 46 50 if (fd >= -1) 47 51 close(fd);
+20 -12
tools/testing/selftests/bpf/prog_tests/for_each.c
··· 12 12 int i, err, hashmap_fd, max_entries, percpu_map_fd; 13 13 struct for_each_hash_map_elem *skel; 14 14 __u64 *percpu_valbuf = NULL; 15 - __u32 key, num_cpus, retval; 15 + __u32 key, num_cpus; 16 16 __u64 val; 17 + LIBBPF_OPTS(bpf_test_run_opts, topts, 18 + .data_in = &pkt_v4, 19 + .data_size_in = sizeof(pkt_v4), 20 + .repeat = 1, 21 + ); 17 22 18 23 skel = for_each_hash_map_elem__open_and_load(); 19 24 if (!ASSERT_OK_PTR(skel, "for_each_hash_map_elem__open_and_load")) ··· 47 42 if (!ASSERT_OK(err, "percpu_map_update")) 48 43 goto out; 49 44 50 - err = bpf_prog_test_run(bpf_program__fd(skel->progs.test_pkt_access), 51 - 1, &pkt_v4, sizeof(pkt_v4), NULL, NULL, 52 - &retval, &duration); 53 - if (CHECK(err || retval, "ipv4", "err %d errno %d retval %d\n", 54 - err, errno, retval)) 45 + err = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.test_pkt_access), &topts); 46 + duration = topts.duration; 47 + if (CHECK(err || topts.retval, "ipv4", "err %d errno %d retval %d\n", 48 + err, errno, topts.retval)) 55 49 goto out; 56 50 57 51 ASSERT_EQ(skel->bss->hashmap_output, 4, "hashmap_output"); ··· 73 69 74 70 static void test_array_map(void) 75 71 { 76 - __u32 key, num_cpus, max_entries, retval; 72 + __u32 key, num_cpus, max_entries; 77 73 int i, arraymap_fd, percpu_map_fd, err; 78 74 struct for_each_array_map_elem *skel; 79 75 __u64 *percpu_valbuf = NULL; 80 76 __u64 val, expected_total; 77 + LIBBPF_OPTS(bpf_test_run_opts, topts, 78 + .data_in = &pkt_v4, 79 + .data_size_in = sizeof(pkt_v4), 80 + .repeat = 1, 81 + ); 81 82 82 83 skel = for_each_array_map_elem__open_and_load(); 83 84 if (!ASSERT_OK_PTR(skel, "for_each_array_map_elem__open_and_load")) ··· 115 106 if (!ASSERT_OK(err, "percpu_map_update")) 116 107 goto out; 117 108 118 - err = bpf_prog_test_run(bpf_program__fd(skel->progs.test_pkt_access), 119 - 1, &pkt_v4, sizeof(pkt_v4), NULL, NULL, 120 - &retval, &duration); 121 - if (CHECK(err || retval, "ipv4", "err %d errno %d retval %d\n", 122 - err, errno, retval)) 109 + err = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.test_pkt_access), &topts); 110 + duration = topts.duration; 111 + if (CHECK(err || topts.retval, "ipv4", "err %d errno %d retval %d\n", 112 + err, errno, topts.retval)) 123 113 goto out; 124 114 125 115 ASSERT_EQ(skel->bss->arraymap_output, expected_total, "array_output");
+5 -7
tools/testing/selftests/bpf/prog_tests/get_func_args_test.c
··· 5 5 void test_get_func_args_test(void) 6 6 { 7 7 struct get_func_args_test *skel = NULL; 8 - __u32 duration = 0, retval; 9 8 int err, prog_fd; 9 + LIBBPF_OPTS(bpf_test_run_opts, topts); 10 10 11 11 skel = get_func_args_test__open_and_load(); 12 12 if (!ASSERT_OK_PTR(skel, "get_func_args_test__open_and_load")) ··· 20 20 * fentry/fexit programs. 21 21 */ 22 22 prog_fd = bpf_program__fd(skel->progs.test1); 23 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 24 - NULL, NULL, &retval, &duration); 23 + err = bpf_prog_test_run_opts(prog_fd, &topts); 25 24 ASSERT_OK(err, "test_run"); 26 - ASSERT_EQ(retval, 0, "test_run"); 25 + ASSERT_EQ(topts.retval, 0, "test_run"); 27 26 28 27 /* This runs bpf_modify_return_test function and triggers 29 28 * fmod_ret_test and fexit_test programs. 30 29 */ 31 30 prog_fd = bpf_program__fd(skel->progs.fmod_ret_test); 32 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 33 - NULL, NULL, &retval, &duration); 31 + err = bpf_prog_test_run_opts(prog_fd, &topts); 34 32 ASSERT_OK(err, "test_run"); 35 - ASSERT_EQ(retval, 1234, "test_run"); 33 + ASSERT_EQ(topts.retval, 1234, "test_run"); 36 34 37 35 ASSERT_EQ(skel->bss->test1_result, 1, "test1_result"); 38 36 ASSERT_EQ(skel->bss->test2_result, 1, "test2_result");
+4 -6
tools/testing/selftests/bpf/prog_tests/get_func_ip_test.c
··· 5 5 void test_get_func_ip_test(void) 6 6 { 7 7 struct get_func_ip_test *skel = NULL; 8 - __u32 duration = 0, retval; 9 8 int err, prog_fd; 9 + LIBBPF_OPTS(bpf_test_run_opts, topts); 10 10 11 11 skel = get_func_ip_test__open(); 12 12 if (!ASSERT_OK_PTR(skel, "get_func_ip_test__open")) ··· 29 29 goto cleanup; 30 30 31 31 prog_fd = bpf_program__fd(skel->progs.test1); 32 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 33 - NULL, NULL, &retval, &duration); 32 + err = bpf_prog_test_run_opts(prog_fd, &topts); 34 33 ASSERT_OK(err, "test_run"); 35 - ASSERT_EQ(retval, 0, "test_run"); 34 + ASSERT_EQ(topts.retval, 0, "test_run"); 36 35 37 36 prog_fd = bpf_program__fd(skel->progs.test5); 38 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 39 - NULL, NULL, &retval, &duration); 37 + err = bpf_prog_test_run_opts(prog_fd, &topts); 40 38 41 39 ASSERT_OK(err, "test_run"); 42 40
+13 -11
tools/testing/selftests/bpf/prog_tests/global_data.c
··· 132 132 void test_global_data(void) 133 133 { 134 134 const char *file = "./test_global_data.o"; 135 - __u32 duration = 0, retval; 136 135 struct bpf_object *obj; 137 136 int err, prog_fd; 137 + LIBBPF_OPTS(bpf_test_run_opts, topts, 138 + .data_in = &pkt_v4, 139 + .data_size_in = sizeof(pkt_v4), 140 + .repeat = 1, 141 + ); 138 142 139 143 err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd); 140 - if (CHECK(err, "load program", "error %d loading %s\n", err, file)) 144 + if (!ASSERT_OK(err, "load program")) 141 145 return; 142 146 143 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 144 - NULL, NULL, &retval, &duration); 145 - CHECK(err || retval, "pass global data run", 146 - "err %d errno %d retval %d duration %d\n", 147 - err, errno, retval, duration); 147 + err = bpf_prog_test_run_opts(prog_fd, &topts); 148 + ASSERT_OK(err, "pass global data run err"); 149 + ASSERT_OK(topts.retval, "pass global data run retval"); 148 150 149 - test_global_data_number(obj, duration); 150 - test_global_data_string(obj, duration); 151 - test_global_data_struct(obj, duration); 152 - test_global_data_rdonly(obj, duration); 151 + test_global_data_number(obj, topts.duration); 152 + test_global_data_string(obj, topts.duration); 153 + test_global_data_struct(obj, topts.duration); 154 + test_global_data_rdonly(obj, topts.duration); 153 155 154 156 bpf_object__close(obj); 155 157 }
+8 -6
tools/testing/selftests/bpf/prog_tests/global_func_args.c
··· 40 40 void test_global_func_args(void) 41 41 { 42 42 const char *file = "./test_global_func_args.o"; 43 - __u32 retval; 44 43 struct bpf_object *obj; 45 44 int err, prog_fd; 45 + LIBBPF_OPTS(bpf_test_run_opts, topts, 46 + .data_in = &pkt_v4, 47 + .data_size_in = sizeof(pkt_v4), 48 + .repeat = 1, 49 + ); 46 50 47 51 err = bpf_prog_test_load(file, BPF_PROG_TYPE_CGROUP_SKB, &obj, &prog_fd); 48 52 if (CHECK(err, "load program", "error %d loading %s\n", err, file)) 49 53 return; 50 54 51 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 52 - NULL, NULL, &retval, &duration); 53 - CHECK(err || retval, "pass global func args run", 54 - "err %d errno %d retval %d duration %d\n", 55 - err, errno, retval, duration); 55 + err = bpf_prog_test_run_opts(prog_fd, &topts); 56 + ASSERT_OK(err, "test_run"); 57 + ASSERT_OK(topts.retval, "test_run retval"); 56 58 57 59 test_global_func_args0(obj); 58 60
+28 -18
tools/testing/selftests/bpf/prog_tests/kfunc_call.c
··· 9 9 static void test_main(void) 10 10 { 11 11 struct kfunc_call_test_lskel *skel; 12 - int prog_fd, retval, err; 12 + int prog_fd, err; 13 + LIBBPF_OPTS(bpf_test_run_opts, topts, 14 + .data_in = &pkt_v4, 15 + .data_size_in = sizeof(pkt_v4), 16 + .repeat = 1, 17 + ); 13 18 14 19 skel = kfunc_call_test_lskel__open_and_load(); 15 20 if (!ASSERT_OK_PTR(skel, "skel")) 16 21 return; 17 22 18 23 prog_fd = skel->progs.kfunc_call_test1.prog_fd; 19 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 20 - NULL, NULL, (__u32 *)&retval, NULL); 24 + err = bpf_prog_test_run_opts(prog_fd, &topts); 21 25 ASSERT_OK(err, "bpf_prog_test_run(test1)"); 22 - ASSERT_EQ(retval, 12, "test1-retval"); 26 + ASSERT_EQ(topts.retval, 12, "test1-retval"); 23 27 24 28 prog_fd = skel->progs.kfunc_call_test2.prog_fd; 25 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 26 - NULL, NULL, (__u32 *)&retval, NULL); 29 + err = bpf_prog_test_run_opts(prog_fd, &topts); 27 30 ASSERT_OK(err, "bpf_prog_test_run(test2)"); 28 - ASSERT_EQ(retval, 3, "test2-retval"); 31 + ASSERT_EQ(topts.retval, 3, "test2-retval"); 29 32 30 33 prog_fd = skel->progs.kfunc_call_test_ref_btf_id.prog_fd; 31 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 32 - NULL, NULL, (__u32 *)&retval, NULL); 34 + err = bpf_prog_test_run_opts(prog_fd, &topts); 33 35 ASSERT_OK(err, "bpf_prog_test_run(test_ref_btf_id)"); 34 - ASSERT_EQ(retval, 0, "test_ref_btf_id-retval"); 36 + ASSERT_EQ(topts.retval, 0, "test_ref_btf_id-retval"); 35 37 36 38 kfunc_call_test_lskel__destroy(skel); 37 39 } ··· 41 39 static void test_subprog(void) 42 40 { 43 41 struct kfunc_call_test_subprog *skel; 44 - int prog_fd, retval, err; 42 + int prog_fd, err; 43 + LIBBPF_OPTS(bpf_test_run_opts, topts, 44 + .data_in = &pkt_v4, 45 + .data_size_in = sizeof(pkt_v4), 46 + .repeat = 1, 47 + ); 45 48 46 49 skel = kfunc_call_test_subprog__open_and_load(); 47 50 if (!ASSERT_OK_PTR(skel, "skel")) 48 51 return; 49 52 50 53 prog_fd = bpf_program__fd(skel->progs.kfunc_call_test1); 51 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 52 - NULL, NULL, (__u32 *)&retval, NULL); 54 + err = bpf_prog_test_run_opts(prog_fd, &topts); 53 55 ASSERT_OK(err, "bpf_prog_test_run(test1)"); 54 - ASSERT_EQ(retval, 10, "test1-retval"); 56 + ASSERT_EQ(topts.retval, 10, "test1-retval"); 55 57 ASSERT_NEQ(skel->data->active_res, -1, "active_res"); 56 58 ASSERT_EQ(skel->data->sk_state_res, BPF_TCP_CLOSE, "sk_state_res"); 57 59 ··· 65 59 static void test_subprog_lskel(void) 66 60 { 67 61 struct kfunc_call_test_subprog_lskel *skel; 68 - int prog_fd, retval, err; 62 + int prog_fd, err; 63 + LIBBPF_OPTS(bpf_test_run_opts, topts, 64 + .data_in = &pkt_v4, 65 + .data_size_in = sizeof(pkt_v4), 66 + .repeat = 1, 67 + ); 69 68 70 69 skel = kfunc_call_test_subprog_lskel__open_and_load(); 71 70 if (!ASSERT_OK_PTR(skel, "skel")) 72 71 return; 73 72 74 73 prog_fd = skel->progs.kfunc_call_test1.prog_fd; 75 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 76 - NULL, NULL, (__u32 *)&retval, NULL); 74 + err = bpf_prog_test_run_opts(prog_fd, &topts); 77 75 ASSERT_OK(err, "bpf_prog_test_run(test1)"); 78 - ASSERT_EQ(retval, 10, "test1-retval"); 76 + ASSERT_EQ(topts.retval, 10, "test1-retval"); 79 77 ASSERT_NEQ(skel->data->active_res, -1, "active_res"); 80 78 ASSERT_EQ(skel->data->sk_state_res, BPF_TCP_CLOSE, "sk_state_res"); 81 79
+15 -8
tools/testing/selftests/bpf/prog_tests/ksyms_module.c
··· 9 9 void test_ksyms_module_lskel(void) 10 10 { 11 11 struct test_ksyms_module_lskel *skel; 12 - int retval; 13 12 int err; 13 + LIBBPF_OPTS(bpf_test_run_opts, topts, 14 + .data_in = &pkt_v4, 15 + .data_size_in = sizeof(pkt_v4), 16 + .repeat = 1, 17 + ); 14 18 15 19 if (!env.has_testmod) { 16 20 test__skip(); ··· 24 20 skel = test_ksyms_module_lskel__open_and_load(); 25 21 if (!ASSERT_OK_PTR(skel, "test_ksyms_module_lskel__open_and_load")) 26 22 return; 27 - err = bpf_prog_test_run(skel->progs.load.prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 28 - NULL, NULL, (__u32 *)&retval, NULL); 23 + err = bpf_prog_test_run_opts(skel->progs.load.prog_fd, &topts); 29 24 if (!ASSERT_OK(err, "bpf_prog_test_run")) 30 25 goto cleanup; 31 - ASSERT_EQ(retval, 0, "retval"); 26 + ASSERT_EQ(topts.retval, 0, "retval"); 32 27 ASSERT_EQ(skel->bss->out_bpf_testmod_ksym, 42, "bpf_testmod_ksym"); 33 28 cleanup: 34 29 test_ksyms_module_lskel__destroy(skel); ··· 36 33 void test_ksyms_module_libbpf(void) 37 34 { 38 35 struct test_ksyms_module *skel; 39 - int retval, err; 36 + int err; 37 + LIBBPF_OPTS(bpf_test_run_opts, topts, 38 + .data_in = &pkt_v4, 39 + .data_size_in = sizeof(pkt_v4), 40 + .repeat = 1, 41 + ); 40 42 41 43 if (!env.has_testmod) { 42 44 test__skip(); ··· 51 43 skel = test_ksyms_module__open_and_load(); 52 44 if (!ASSERT_OK_PTR(skel, "test_ksyms_module__open")) 53 45 return; 54 - err = bpf_prog_test_run(bpf_program__fd(skel->progs.load), 1, &pkt_v4, 55 - sizeof(pkt_v4), NULL, NULL, (__u32 *)&retval, NULL); 46 + err = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.load), &topts); 56 47 if (!ASSERT_OK(err, "bpf_prog_test_run")) 57 48 goto cleanup; 58 - ASSERT_EQ(retval, 0, "retval"); 49 + ASSERT_EQ(topts.retval, 0, "retval"); 59 50 ASSERT_EQ(skel->bss->out_bpf_testmod_ksym, 42, "bpf_testmod_ksym"); 60 51 cleanup: 61 52 test_ksyms_module__destroy(skel);
+22 -13
tools/testing/selftests/bpf/prog_tests/l4lb_all.c
··· 23 23 __u8 flags; 24 24 } real_def = {.dst = MAGIC_VAL}; 25 25 __u32 ch_key = 11, real_num = 3; 26 - __u32 duration, retval, size; 27 26 int err, i, prog_fd, map_fd; 28 27 __u64 bytes = 0, pkts = 0; 29 28 struct bpf_object *obj; 30 29 char buf[128]; 31 30 u32 *magic = (u32 *)buf; 31 + LIBBPF_OPTS(bpf_test_run_opts, topts, 32 + .data_out = buf, 33 + .data_size_out = sizeof(buf), 34 + .repeat = NUM_ITER, 35 + ); 32 36 33 37 err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd); 34 38 if (CHECK_FAIL(err)) ··· 53 49 goto out; 54 50 bpf_map_update_elem(map_fd, &real_num, &real_def, 0); 55 51 56 - err = bpf_prog_test_run(prog_fd, NUM_ITER, &pkt_v4, sizeof(pkt_v4), 57 - buf, &size, &retval, &duration); 58 - CHECK(err || retval != 7/*TC_ACT_REDIRECT*/ || size != 54 || 59 - *magic != MAGIC_VAL, "ipv4", 60 - "err %d errno %d retval %d size %d magic %x\n", 61 - err, errno, retval, size, *magic); 52 + topts.data_in = &pkt_v4; 53 + topts.data_size_in = sizeof(pkt_v4); 62 54 63 - err = bpf_prog_test_run(prog_fd, NUM_ITER, &pkt_v6, sizeof(pkt_v6), 64 - buf, &size, &retval, &duration); 65 - CHECK(err || retval != 7/*TC_ACT_REDIRECT*/ || size != 74 || 66 - *magic != MAGIC_VAL, "ipv6", 67 - "err %d errno %d retval %d size %d magic %x\n", 68 - err, errno, retval, size, *magic); 55 + err = bpf_prog_test_run_opts(prog_fd, &topts); 56 + ASSERT_OK(err, "test_run"); 57 + ASSERT_EQ(topts.retval, 7 /*TC_ACT_REDIRECT*/, "ipv4 test_run retval"); 58 + ASSERT_EQ(topts.data_size_out, 54, "ipv4 test_run data_size_out"); 59 + ASSERT_EQ(*magic, MAGIC_VAL, "ipv4 magic"); 60 + 61 + topts.data_in = &pkt_v6; 62 + topts.data_size_in = sizeof(pkt_v6); 63 + topts.data_size_out = sizeof(buf); /* reset out size */ 64 + 65 + err = bpf_prog_test_run_opts(prog_fd, &topts); 66 + ASSERT_OK(err, "test_run"); 67 + ASSERT_EQ(topts.retval, 7 /*TC_ACT_REDIRECT*/, "ipv6 test_run retval"); 68 + ASSERT_EQ(topts.data_size_out, 74, "ipv6 test_run data_size_out"); 69 + ASSERT_EQ(*magic, MAGIC_VAL, "ipv6 magic"); 69 70 70 71 map_fd = bpf_find_map(__func__, obj, "stats"); 71 72 if (map_fd < 0)
+9 -6
tools/testing/selftests/bpf/prog_tests/map_lock.c
··· 4 4 5 5 static void *spin_lock_thread(void *arg) 6 6 { 7 - __u32 duration, retval; 8 7 int err, prog_fd = *(u32 *) arg; 8 + LIBBPF_OPTS(bpf_test_run_opts, topts, 9 + .data_in = &pkt_v4, 10 + .data_size_in = sizeof(pkt_v4), 11 + .repeat = 10000, 12 + ); 9 13 10 - err = bpf_prog_test_run(prog_fd, 10000, &pkt_v4, sizeof(pkt_v4), 11 - NULL, NULL, &retval, &duration); 12 - CHECK(err || retval, "", 13 - "err %d errno %d retval %d duration %d\n", 14 - err, errno, retval, duration); 14 + err = bpf_prog_test_run_opts(prog_fd, &topts); 15 + ASSERT_OK(err, "test_run_opts err"); 16 + ASSERT_OK(topts.retval, "test_run_opts retval"); 17 + 15 18 pthread_exit(arg); 16 19 } 17 20
+10 -6
tools/testing/selftests/bpf/prog_tests/map_ptr.c
··· 9 9 void test_map_ptr(void) 10 10 { 11 11 struct map_ptr_kern_lskel *skel; 12 - __u32 duration = 0, retval; 13 12 char buf[128]; 14 13 int err; 15 14 int page_size = getpagesize(); 15 + LIBBPF_OPTS(bpf_test_run_opts, topts, 16 + .data_in = &pkt_v4, 17 + .data_size_in = sizeof(pkt_v4), 18 + .data_out = buf, 19 + .data_size_out = sizeof(buf), 20 + .repeat = 1, 21 + ); 16 22 17 23 skel = map_ptr_kern_lskel__open(); 18 24 if (!ASSERT_OK_PTR(skel, "skel_open")) ··· 32 26 33 27 skel->bss->page_size = page_size; 34 28 35 - err = bpf_prog_test_run(skel->progs.cg_skb.prog_fd, 1, &pkt_v4, 36 - sizeof(pkt_v4), buf, NULL, &retval, NULL); 29 + err = bpf_prog_test_run_opts(skel->progs.cg_skb.prog_fd, &topts); 37 30 38 - if (CHECK(err, "test_run", "err=%d errno=%d\n", err, errno)) 31 + if (!ASSERT_OK(err, "test_run")) 39 32 goto cleanup; 40 33 41 - if (CHECK(!retval, "retval", "retval=%d map_type=%u line=%u\n", retval, 42 - skel->bss->g_map_type, skel->bss->g_line)) 34 + if (!ASSERT_NEQ(topts.retval, 0, "test_run retval")) 43 35 goto cleanup; 44 36 45 37 cleanup:
+12 -21
tools/testing/selftests/bpf/prog_tests/modify_return.c
··· 15 15 { 16 16 struct modify_return *skel = NULL; 17 17 int err, prog_fd; 18 - __u32 duration = 0, retval; 19 18 __u16 side_effect; 20 19 __s16 ret; 20 + LIBBPF_OPTS(bpf_test_run_opts, topts); 21 21 22 22 skel = modify_return__open_and_load(); 23 - if (CHECK(!skel, "skel_load", "modify_return skeleton failed\n")) 23 + if (!ASSERT_OK_PTR(skel, "skel_load")) 24 24 goto cleanup; 25 25 26 26 err = modify_return__attach(skel); 27 - if (CHECK(err, "modify_return", "attach failed: %d\n", err)) 27 + if (!ASSERT_OK(err, "modify_return__attach failed")) 28 28 goto cleanup; 29 29 30 30 skel->bss->input_retval = input_retval; 31 31 prog_fd = bpf_program__fd(skel->progs.fmod_ret_test); 32 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, NULL, 0, 33 - &retval, &duration); 32 + err = bpf_prog_test_run_opts(prog_fd, &topts); 33 + ASSERT_OK(err, "test_run"); 34 34 35 - CHECK(err, "test_run", "err %d errno %d\n", err, errno); 35 + side_effect = UPPER(topts.retval); 36 + ret = LOWER(topts.retval); 36 37 37 - side_effect = UPPER(retval); 38 - ret = LOWER(retval); 39 - 40 - CHECK(ret != want_ret, "test_run", 41 - "unexpected ret: %d, expected: %d\n", ret, want_ret); 42 - CHECK(side_effect != want_side_effect, "modify_return", 43 - "unexpected side_effect: %d\n", side_effect); 44 - 45 - CHECK(skel->bss->fentry_result != 1, "modify_return", 46 - "fentry failed\n"); 47 - CHECK(skel->bss->fexit_result != 1, "modify_return", 48 - "fexit failed\n"); 49 - CHECK(skel->bss->fmod_ret_result != 1, "modify_return", 50 - "fmod_ret failed\n"); 38 + ASSERT_EQ(ret, want_ret, "test_run ret"); 39 + ASSERT_EQ(side_effect, want_side_effect, "modify_return side_effect"); 40 + ASSERT_EQ(skel->bss->fentry_result, 1, "modify_return fentry_result"); 41 + ASSERT_EQ(skel->bss->fexit_result, 1, "modify_return fexit_result"); 42 + ASSERT_EQ(skel->bss->fmod_ret_result, 1, "modify_return fmod_ret_result"); 51 43 52 44 cleanup: 53 45 modify_return__destroy(skel); ··· 55 63 0 /* want_side_effect */, 56 64 -EINVAL /* want_ret */); 57 65 } 58 -
+15 -11
tools/testing/selftests/bpf/prog_tests/pkt_access.c
··· 6 6 { 7 7 const char *file = "./test_pkt_access.o"; 8 8 struct bpf_object *obj; 9 - __u32 duration, retval; 10 9 int err, prog_fd; 10 + LIBBPF_OPTS(bpf_test_run_opts, topts, 11 + .data_in = &pkt_v4, 12 + .data_size_in = sizeof(pkt_v4), 13 + .repeat = 100000, 14 + ); 11 15 12 16 err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd); 13 17 if (CHECK_FAIL(err)) 14 18 return; 15 19 16 - err = bpf_prog_test_run(prog_fd, 100000, &pkt_v4, sizeof(pkt_v4), 17 - NULL, NULL, &retval, &duration); 18 - CHECK(err || retval, "ipv4", 19 - "err %d errno %d retval %d duration %d\n", 20 - err, errno, retval, duration); 20 + err = bpf_prog_test_run_opts(prog_fd, &topts); 21 + ASSERT_OK(err, "ipv4 test_run_opts err"); 22 + ASSERT_OK(topts.retval, "ipv4 test_run_opts retval"); 21 23 22 - err = bpf_prog_test_run(prog_fd, 100000, &pkt_v6, sizeof(pkt_v6), 23 - NULL, NULL, &retval, &duration); 24 - CHECK(err || retval, "ipv6", 25 - "err %d errno %d retval %d duration %d\n", 26 - err, errno, retval, duration); 24 + topts.data_in = &pkt_v6; 25 + topts.data_size_in = sizeof(pkt_v6); 26 + topts.data_size_out = 0; /* reset from last call */ 27 + err = bpf_prog_test_run_opts(prog_fd, &topts); 28 + ASSERT_OK(err, "ipv6 test_run_opts err"); 29 + ASSERT_OK(topts.retval, "ipv6 test_run_opts retval"); 30 + 27 31 bpf_object__close(obj); 28 32 }
+8 -6
tools/testing/selftests/bpf/prog_tests/pkt_md_access.c
··· 6 6 { 7 7 const char *file = "./test_pkt_md_access.o"; 8 8 struct bpf_object *obj; 9 - __u32 duration, retval; 10 9 int err, prog_fd; 10 + LIBBPF_OPTS(bpf_test_run_opts, topts, 11 + .data_in = &pkt_v4, 12 + .data_size_in = sizeof(pkt_v4), 13 + .repeat = 10, 14 + ); 11 15 12 16 err = bpf_prog_test_load(file, BPF_PROG_TYPE_SCHED_CLS, &obj, &prog_fd); 13 17 if (CHECK_FAIL(err)) 14 18 return; 15 19 16 - err = bpf_prog_test_run(prog_fd, 10, &pkt_v4, sizeof(pkt_v4), 17 - NULL, NULL, &retval, &duration); 18 - CHECK(err || retval, "", 19 - "err %d errno %d retval %d duration %d\n", 20 - err, errno, retval, duration); 20 + err = bpf_prog_test_run_opts(prog_fd, &topts); 21 + ASSERT_OK(err, "test_run_opts err"); 22 + ASSERT_OK(topts.retval, "test_run_opts retval"); 21 23 22 24 bpf_object__close(obj); 23 25 }
+26 -20
tools/testing/selftests/bpf/prog_tests/queue_stack_map.c
··· 10 10 static void test_queue_stack_map_by_type(int type) 11 11 { 12 12 const int MAP_SIZE = 32; 13 - __u32 vals[MAP_SIZE], duration, retval, size, val; 13 + __u32 vals[MAP_SIZE], val; 14 14 int i, err, prog_fd, map_in_fd, map_out_fd; 15 15 char file[32], buf[128]; 16 16 struct bpf_object *obj; 17 17 struct iphdr iph; 18 + LIBBPF_OPTS(bpf_test_run_opts, topts, 19 + .data_in = &pkt_v4, 20 + .data_size_in = sizeof(pkt_v4), 21 + .data_out = buf, 22 + .data_size_out = sizeof(buf), 23 + .repeat = 1, 24 + ); 18 25 19 26 /* Fill test values to be used */ 20 27 for (i = 0; i < MAP_SIZE; i++) ··· 65 58 pkt_v4.iph.saddr = vals[MAP_SIZE - 1 - i] * 5; 66 59 } 67 60 68 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 69 - buf, &size, &retval, &duration); 70 - if (err || retval || size != sizeof(pkt_v4)) 61 + topts.data_size_out = sizeof(buf); 62 + err = bpf_prog_test_run_opts(prog_fd, &topts); 63 + if (err || topts.retval || 64 + topts.data_size_out != sizeof(pkt_v4)) 71 65 break; 72 66 memcpy(&iph, buf + sizeof(struct ethhdr), sizeof(iph)); 73 67 if (iph.daddr != val) 74 68 break; 75 69 } 76 70 77 - CHECK(err || retval || size != sizeof(pkt_v4) || iph.daddr != val, 78 - "bpf_map_pop_elem", 79 - "err %d errno %d retval %d size %d iph->daddr %u\n", 80 - err, errno, retval, size, iph.daddr); 71 + ASSERT_OK(err, "bpf_map_pop_elem"); 72 + ASSERT_OK(topts.retval, "bpf_map_pop_elem test retval"); 73 + ASSERT_EQ(topts.data_size_out, sizeof(pkt_v4), 74 + "bpf_map_pop_elem data_size_out"); 75 + ASSERT_EQ(iph.daddr, val, "bpf_map_pop_elem iph.daddr"); 81 76 82 77 /* Queue is empty, program should return TC_ACT_SHOT */ 83 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 84 - buf, &size, &retval, &duration); 85 - CHECK(err || retval != 2 /* TC_ACT_SHOT */|| size != sizeof(pkt_v4), 86 - "check-queue-stack-map-empty", 87 - "err %d errno %d retval %d size %d\n", 88 - err, errno, retval, size); 78 + topts.data_size_out = sizeof(buf); 79 + err = bpf_prog_test_run_opts(prog_fd, &topts); 80 + ASSERT_OK(err, "check-queue-stack-map-empty"); 81 + ASSERT_EQ(topts.retval, 2 /* TC_ACT_SHOT */, 82 + "check-queue-stack-map-empty test retval"); 83 + ASSERT_EQ(topts.data_size_out, sizeof(pkt_v4), 84 + "check-queue-stack-map-empty data_size_out"); 89 85 90 86 /* Check that the program pushed elements correctly */ 91 87 for (i = 0; i < MAP_SIZE; i++) { 92 88 err = bpf_map_lookup_and_delete_elem(map_out_fd, NULL, &val); 93 - if (err || val != vals[i] * 5) 94 - break; 89 + ASSERT_OK(err, "bpf_map_lookup_and_delete_elem"); 90 + ASSERT_EQ(val, vals[i] * 5, "bpf_map_push_elem val"); 95 91 } 96 - 97 - CHECK(i != MAP_SIZE && (err || val != vals[i] * 5), 98 - "bpf_map_push_elem", "err %d value %u\n", err, val); 99 - 100 92 out: 101 93 pkt_v4.iph.saddr = 0; 102 94 bpf_object__close(obj);
+9 -7
tools/testing/selftests/bpf/prog_tests/raw_tp_writable_test_run.c
··· 56 56 0, 57 57 }; 58 58 59 - __u32 prog_ret; 60 - int err = bpf_prog_test_run(filter_fd, 1, test_skb, sizeof(test_skb), 0, 61 - 0, &prog_ret, 0); 59 + LIBBPF_OPTS(bpf_test_run_opts, topts, 60 + .data_in = test_skb, 61 + .data_size_in = sizeof(test_skb), 62 + .repeat = 1, 63 + ); 64 + int err = bpf_prog_test_run_opts(filter_fd, &topts); 62 65 CHECK(err != 42, "test_run", 63 66 "tracepoint did not modify return value\n"); 64 - CHECK(prog_ret != 0, "test_run_ret", 67 + CHECK(topts.retval != 0, "test_run_ret", 65 68 "socket_filter did not return 0\n"); 66 69 67 70 close(tp_fd); 68 71 69 - err = bpf_prog_test_run(filter_fd, 1, test_skb, sizeof(test_skb), 0, 0, 70 - &prog_ret, 0); 72 + err = bpf_prog_test_run_opts(filter_fd, &topts); 71 73 CHECK(err != 0, "test_run_notrace", 72 74 "test_run failed with %d errno %d\n", err, errno); 73 - CHECK(prog_ret != 0, "test_run_ret_notrace", 75 + CHECK(topts.retval != 0, "test_run_ret_notrace", 74 76 "socket_filter did not return 0\n"); 75 77 76 78 out_filterfd:
+11 -10
tools/testing/selftests/bpf/prog_tests/signal_pending.c
··· 13 13 struct itimerval timeo = { 14 14 .it_value.tv_usec = 100000, /* 100ms */ 15 15 }; 16 - __u32 duration = 0, retval; 17 16 int prog_fd; 18 17 int err; 19 18 int i; 19 + LIBBPF_OPTS(bpf_test_run_opts, topts, 20 + .data_in = &pkt_v4, 21 + .data_size_in = sizeof(pkt_v4), 22 + .repeat = 0xffffffff, 23 + ); 20 24 21 25 for (i = 0; i < ARRAY_SIZE(prog); i++) 22 26 prog[i] = BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0); ··· 28 24 29 25 prog_fd = bpf_test_load_program(prog_type, prog, ARRAY_SIZE(prog), 30 26 "GPL", 0, NULL, 0); 31 - CHECK(prog_fd < 0, "test-run", "errno %d\n", errno); 27 + ASSERT_GE(prog_fd, 0, "test-run load"); 32 28 33 29 err = sigaction(SIGALRM, &sigalrm_action, NULL); 34 - CHECK(err, "test-run-signal-sigaction", "errno %d\n", errno); 30 + ASSERT_OK(err, "test-run-signal-sigaction"); 35 31 36 32 err = setitimer(ITIMER_REAL, &timeo, NULL); 37 - CHECK(err, "test-run-signal-timer", "errno %d\n", errno); 33 + ASSERT_OK(err, "test-run-signal-timer"); 38 34 39 - err = bpf_prog_test_run(prog_fd, 0xffffffff, &pkt_v4, sizeof(pkt_v4), 40 - NULL, NULL, &retval, &duration); 41 - CHECK(duration > 500000000, /* 500ms */ 42 - "test-run-signal-duration", 43 - "duration %dns > 500ms\n", 44 - duration); 35 + err = bpf_prog_test_run_opts(prog_fd, &topts); 36 + ASSERT_LE(topts.duration, 500000000 /* 500ms */, 37 + "test-run-signal-duration"); 45 38 46 39 signal(SIGALRM, SIG_DFL); 47 40 }
+8 -6
tools/testing/selftests/bpf/prog_tests/spinlock.c
··· 4 4 5 5 static void *spin_lock_thread(void *arg) 6 6 { 7 - __u32 duration, retval; 8 7 int err, prog_fd = *(u32 *) arg; 8 + LIBBPF_OPTS(bpf_test_run_opts, topts, 9 + .data_in = &pkt_v4, 10 + .data_size_in = sizeof(pkt_v4), 11 + .repeat = 10000, 12 + ); 9 13 10 - err = bpf_prog_test_run(prog_fd, 10000, &pkt_v4, sizeof(pkt_v4), 11 - NULL, NULL, &retval, &duration); 12 - CHECK(err || retval, "", 13 - "err %d errno %d retval %d duration %d\n", 14 - err, errno, retval, duration); 14 + err = bpf_prog_test_run_opts(prog_fd, &topts); 15 + ASSERT_OK(err, "test_run"); 16 + ASSERT_OK(topts.retval, "test_run retval"); 15 17 pthread_exit(arg); 16 18 } 17 19
+123 -115
tools/testing/selftests/bpf/prog_tests/tailcalls.c
··· 12 12 struct bpf_map *prog_array; 13 13 struct bpf_program *prog; 14 14 struct bpf_object *obj; 15 - __u32 retval, duration; 16 15 char prog_name[32]; 17 16 char buff[128] = {}; 17 + LIBBPF_OPTS(bpf_test_run_opts, topts, 18 + .data_in = buff, 19 + .data_size_in = sizeof(buff), 20 + .repeat = 1, 21 + ); 18 22 19 23 err = bpf_prog_test_load("tailcall1.o", BPF_PROG_TYPE_SCHED_CLS, &obj, 20 24 &prog_fd); ··· 58 54 } 59 55 60 56 for (i = 0; i < bpf_map__max_entries(prog_array); i++) { 61 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 62 - &duration, &retval, NULL); 63 - CHECK(err || retval != i, "tailcall", 64 - "err %d errno %d retval %d\n", err, errno, retval); 57 + err = bpf_prog_test_run_opts(main_fd, &topts); 58 + ASSERT_OK(err, "tailcall"); 59 + ASSERT_EQ(topts.retval, i, "tailcall retval"); 65 60 66 61 err = bpf_map_delete_elem(map_fd, &i); 67 62 if (CHECK_FAIL(err)) 68 63 goto out; 69 64 } 70 65 71 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 72 - &duration, &retval, NULL); 73 - CHECK(err || retval != 3, "tailcall", "err %d errno %d retval %d\n", 74 - err, errno, retval); 66 + err = bpf_prog_test_run_opts(main_fd, &topts); 67 + ASSERT_OK(err, "tailcall"); 68 + ASSERT_EQ(topts.retval, 3, "tailcall retval"); 75 69 76 70 for (i = 0; i < bpf_map__max_entries(prog_array); i++) { 77 71 snprintf(prog_name, sizeof(prog_name), "classifier_%d", i); ··· 87 85 goto out; 88 86 } 89 87 90 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 91 - &duration, &retval, NULL); 92 - CHECK(err || retval != 0, "tailcall", "err %d errno %d retval %d\n", 93 - err, errno, retval); 88 + err = bpf_prog_test_run_opts(main_fd, &topts); 89 + ASSERT_OK(err, "tailcall"); 90 + ASSERT_OK(topts.retval, "tailcall retval"); 94 91 95 92 for (i = 0; i < bpf_map__max_entries(prog_array); i++) { 96 93 j = bpf_map__max_entries(prog_array) - 1 - i; ··· 111 110 for (i = 0; i < bpf_map__max_entries(prog_array); i++) { 112 111 j = bpf_map__max_entries(prog_array) - 1 - i; 113 112 114 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 115 - &duration, &retval, NULL); 116 - CHECK(err || retval != j, "tailcall", 117 - "err %d errno %d retval %d\n", err, errno, retval); 113 + err = bpf_prog_test_run_opts(main_fd, &topts); 114 + ASSERT_OK(err, "tailcall"); 115 + ASSERT_EQ(topts.retval, j, "tailcall retval"); 118 116 119 117 err = bpf_map_delete_elem(map_fd, &i); 120 118 if (CHECK_FAIL(err)) 121 119 goto out; 122 120 } 123 121 124 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 125 - &duration, &retval, NULL); 126 - CHECK(err || retval != 3, "tailcall", "err %d errno %d retval %d\n", 127 - err, errno, retval); 122 + err = bpf_prog_test_run_opts(main_fd, &topts); 123 + ASSERT_OK(err, "tailcall"); 124 + ASSERT_EQ(topts.retval, 3, "tailcall retval"); 128 125 129 126 for (i = 0; i < bpf_map__max_entries(prog_array); i++) { 130 127 err = bpf_map_delete_elem(map_fd, &i); 131 128 if (CHECK_FAIL(err >= 0 || errno != ENOENT)) 132 129 goto out; 133 130 134 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 135 - &duration, &retval, NULL); 136 - CHECK(err || retval != 3, "tailcall", 137 - "err %d errno %d retval %d\n", err, errno, retval); 131 + err = bpf_prog_test_run_opts(main_fd, &topts); 132 + ASSERT_OK(err, "tailcall"); 133 + ASSERT_EQ(topts.retval, 3, "tailcall retval"); 138 134 } 139 135 140 136 out: ··· 148 150 struct bpf_map *prog_array; 149 151 struct bpf_program *prog; 150 152 struct bpf_object *obj; 151 - __u32 retval, duration; 152 153 char prog_name[32]; 153 154 char buff[128] = {}; 155 + LIBBPF_OPTS(bpf_test_run_opts, topts, 156 + .data_in = buff, 157 + .data_size_in = sizeof(buff), 158 + .repeat = 1, 159 + ); 154 160 155 161 err = bpf_prog_test_load("tailcall2.o", BPF_PROG_TYPE_SCHED_CLS, &obj, 156 162 &prog_fd); ··· 193 191 goto out; 194 192 } 195 193 196 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 197 - &duration, &retval, NULL); 198 - CHECK(err || retval != 2, "tailcall", "err %d errno %d retval %d\n", 199 - err, errno, retval); 194 + err = bpf_prog_test_run_opts(main_fd, &topts); 195 + ASSERT_OK(err, "tailcall"); 196 + ASSERT_EQ(topts.retval, 2, "tailcall retval"); 200 197 201 198 i = 2; 202 199 err = bpf_map_delete_elem(map_fd, &i); 203 200 if (CHECK_FAIL(err)) 204 201 goto out; 205 202 206 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 207 - &duration, &retval, NULL); 208 - CHECK(err || retval != 1, "tailcall", "err %d errno %d retval %d\n", 209 - err, errno, retval); 203 + err = bpf_prog_test_run_opts(main_fd, &topts); 204 + ASSERT_OK(err, "tailcall"); 205 + ASSERT_EQ(topts.retval, 1, "tailcall retval"); 210 206 211 207 i = 0; 212 208 err = bpf_map_delete_elem(map_fd, &i); 213 209 if (CHECK_FAIL(err)) 214 210 goto out; 215 211 216 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 217 - &duration, &retval, NULL); 218 - CHECK(err || retval != 3, "tailcall", "err %d errno %d retval %d\n", 219 - err, errno, retval); 212 + err = bpf_prog_test_run_opts(main_fd, &topts); 213 + ASSERT_OK(err, "tailcall"); 214 + ASSERT_EQ(topts.retval, 3, "tailcall retval"); 220 215 out: 221 216 bpf_object__close(obj); 222 217 } ··· 224 225 struct bpf_map *prog_array, *data_map; 225 226 struct bpf_program *prog; 226 227 struct bpf_object *obj; 227 - __u32 retval, duration; 228 228 char buff[128] = {}; 229 + LIBBPF_OPTS(bpf_test_run_opts, topts, 230 + .data_in = buff, 231 + .data_size_in = sizeof(buff), 232 + .repeat = 1, 233 + ); 229 234 230 235 err = bpf_prog_test_load(which, BPF_PROG_TYPE_SCHED_CLS, &obj, 231 236 &prog_fd); ··· 265 262 if (CHECK_FAIL(err)) 266 263 goto out; 267 264 268 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 269 - &duration, &retval, NULL); 270 - CHECK(err || retval != 1, "tailcall", "err %d errno %d retval %d\n", 271 - err, errno, retval); 265 + err = bpf_prog_test_run_opts(main_fd, &topts); 266 + ASSERT_OK(err, "tailcall"); 267 + ASSERT_EQ(topts.retval, 1, "tailcall retval"); 272 268 273 269 data_map = bpf_object__find_map_by_name(obj, "tailcall.bss"); 274 270 if (CHECK_FAIL(!data_map || !bpf_map__is_internal(data_map))) ··· 279 277 280 278 i = 0; 281 279 err = bpf_map_lookup_elem(data_fd, &i, &val); 282 - CHECK(err || val != 33, "tailcall count", "err %d errno %d count %d\n", 283 - err, errno, val); 280 + ASSERT_OK(err, "tailcall count"); 281 + ASSERT_EQ(val, 33, "tailcall count"); 284 282 285 283 i = 0; 286 284 err = bpf_map_delete_elem(map_fd, &i); 287 285 if (CHECK_FAIL(err)) 288 286 goto out; 289 287 290 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 291 - &duration, &retval, NULL); 292 - CHECK(err || retval != 0, "tailcall", "err %d errno %d retval %d\n", 293 - err, errno, retval); 288 + err = bpf_prog_test_run_opts(main_fd, &topts); 289 + ASSERT_OK(err, "tailcall"); 290 + ASSERT_OK(topts.retval, "tailcall retval"); 294 291 out: 295 292 bpf_object__close(obj); 296 293 } ··· 320 319 struct bpf_map *prog_array, *data_map; 321 320 struct bpf_program *prog; 322 321 struct bpf_object *obj; 323 - __u32 retval, duration; 324 322 static const int zero = 0; 325 323 char buff[128] = {}; 326 324 char prog_name[32]; 325 + LIBBPF_OPTS(bpf_test_run_opts, topts, 326 + .data_in = buff, 327 + .data_size_in = sizeof(buff), 328 + .repeat = 1, 329 + ); 327 330 328 331 err = bpf_prog_test_load("tailcall4.o", BPF_PROG_TYPE_SCHED_CLS, &obj, 329 332 &prog_fd); ··· 379 374 if (CHECK_FAIL(err)) 380 375 goto out; 381 376 382 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 383 - &duration, &retval, NULL); 384 - CHECK(err || retval != i, "tailcall", 385 - "err %d errno %d retval %d\n", err, errno, retval); 377 + err = bpf_prog_test_run_opts(main_fd, &topts); 378 + ASSERT_OK(err, "tailcall"); 379 + ASSERT_EQ(topts.retval, i, "tailcall retval"); 386 380 } 387 381 388 382 for (i = 0; i < bpf_map__max_entries(prog_array); i++) { ··· 393 389 if (CHECK_FAIL(err)) 394 390 goto out; 395 391 396 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 397 - &duration, &retval, NULL); 398 - CHECK(err || retval != 3, "tailcall", 399 - "err %d errno %d retval %d\n", err, errno, retval); 392 + err = bpf_prog_test_run_opts(main_fd, &topts); 393 + ASSERT_OK(err, "tailcall"); 394 + ASSERT_EQ(topts.retval, 3, "tailcall retval"); 400 395 } 401 396 out: 402 397 bpf_object__close(obj); ··· 410 407 struct bpf_map *prog_array, *data_map; 411 408 struct bpf_program *prog; 412 409 struct bpf_object *obj; 413 - __u32 retval, duration; 414 410 static const int zero = 0; 415 411 char buff[128] = {}; 416 412 char prog_name[32]; 413 + LIBBPF_OPTS(bpf_test_run_opts, topts, 414 + .data_in = buff, 415 + .data_size_in = sizeof(buff), 416 + .repeat = 1, 417 + ); 417 418 418 419 err = bpf_prog_test_load("tailcall5.o", BPF_PROG_TYPE_SCHED_CLS, &obj, 419 420 &prog_fd); ··· 469 462 if (CHECK_FAIL(err)) 470 463 goto out; 471 464 472 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 473 - &duration, &retval, NULL); 474 - CHECK(err || retval != i, "tailcall", 475 - "err %d errno %d retval %d\n", err, errno, retval); 465 + err = bpf_prog_test_run_opts(main_fd, &topts); 466 + ASSERT_OK(err, "tailcall"); 467 + ASSERT_EQ(topts.retval, i, "tailcall retval"); 476 468 } 477 469 478 470 for (i = 0; i < bpf_map__max_entries(prog_array); i++) { ··· 483 477 if (CHECK_FAIL(err)) 484 478 goto out; 485 479 486 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 487 - &duration, &retval, NULL); 488 - CHECK(err || retval != 3, "tailcall", 489 - "err %d errno %d retval %d\n", err, errno, retval); 480 + err = bpf_prog_test_run_opts(main_fd, &topts); 481 + ASSERT_OK(err, "tailcall"); 482 + ASSERT_EQ(topts.retval, 3, "tailcall retval"); 490 483 } 491 484 out: 492 485 bpf_object__close(obj); ··· 500 495 struct bpf_map *prog_array; 501 496 struct bpf_program *prog; 502 497 struct bpf_object *obj; 503 - __u32 retval, duration; 504 498 char prog_name[32]; 499 + LIBBPF_OPTS(bpf_test_run_opts, topts, 500 + .data_in = &pkt_v4, 501 + .data_size_in = sizeof(pkt_v4), 502 + .repeat = 1, 503 + ); 505 504 506 505 err = bpf_prog_test_load("tailcall_bpf2bpf1.o", BPF_PROG_TYPE_SCHED_CLS, 507 506 &obj, &prog_fd); ··· 545 536 goto out; 546 537 } 547 538 548 - err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, 549 - 0, &retval, &duration); 550 - CHECK(err || retval != 1, "tailcall", 551 - "err %d errno %d retval %d\n", err, errno, retval); 539 + err = bpf_prog_test_run_opts(main_fd, &topts); 540 + ASSERT_OK(err, "tailcall"); 541 + ASSERT_EQ(topts.retval, 1, "tailcall retval"); 552 542 553 543 /* jmp -> nop, call subprog that will do tailcall */ 554 544 i = 1; ··· 555 547 if (CHECK_FAIL(err)) 556 548 goto out; 557 549 558 - err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, 559 - 0, &retval, &duration); 560 - CHECK(err || retval != 0, "tailcall", "err %d errno %d retval %d\n", 561 - err, errno, retval); 550 + err = bpf_prog_test_run_opts(main_fd, &topts); 551 + ASSERT_OK(err, "tailcall"); 552 + ASSERT_OK(topts.retval, "tailcall retval"); 562 553 563 554 /* make sure that subprog can access ctx and entry prog that 564 555 * called this subprog can properly return ··· 567 560 if (CHECK_FAIL(err)) 568 561 goto out; 569 562 570 - err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, 571 - 0, &retval, &duration); 572 - CHECK(err || retval != sizeof(pkt_v4) * 2, 573 - "tailcall", "err %d errno %d retval %d\n", 574 - err, errno, retval); 563 + err = bpf_prog_test_run_opts(main_fd, &topts); 564 + ASSERT_OK(err, "tailcall"); 565 + ASSERT_EQ(topts.retval, sizeof(pkt_v4) * 2, "tailcall retval"); 575 566 out: 576 567 bpf_object__close(obj); 577 568 } ··· 584 579 struct bpf_map *prog_array, *data_map; 585 580 struct bpf_program *prog; 586 581 struct bpf_object *obj; 587 - __u32 retval, duration; 588 582 char buff[128] = {}; 583 + LIBBPF_OPTS(bpf_test_run_opts, topts, 584 + .data_in = buff, 585 + .data_size_in = sizeof(buff), 586 + .repeat = 1, 587 + ); 589 588 590 589 err = bpf_prog_test_load("tailcall_bpf2bpf2.o", BPF_PROG_TYPE_SCHED_CLS, 591 590 &obj, &prog_fd); ··· 625 616 if (CHECK_FAIL(err)) 626 617 goto out; 627 618 628 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 629 - &duration, &retval, NULL); 630 - CHECK(err || retval != 1, "tailcall", "err %d errno %d retval %d\n", 631 - err, errno, retval); 619 + err = bpf_prog_test_run_opts(main_fd, &topts); 620 + ASSERT_OK(err, "tailcall"); 621 + ASSERT_EQ(topts.retval, 1, "tailcall retval"); 632 622 633 623 data_map = bpf_object__find_map_by_name(obj, "tailcall.bss"); 634 624 if (CHECK_FAIL(!data_map || !bpf_map__is_internal(data_map))) ··· 639 631 640 632 i = 0; 641 633 err = bpf_map_lookup_elem(data_fd, &i, &val); 642 - CHECK(err || val != 33, "tailcall count", "err %d errno %d count %d\n", 643 - err, errno, val); 634 + ASSERT_OK(err, "tailcall count"); 635 + ASSERT_EQ(val, 33, "tailcall count"); 644 636 645 637 i = 0; 646 638 err = bpf_map_delete_elem(map_fd, &i); 647 639 if (CHECK_FAIL(err)) 648 640 goto out; 649 641 650 - err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, 651 - &duration, &retval, NULL); 652 - CHECK(err || retval != 0, "tailcall", "err %d errno %d retval %d\n", 653 - err, errno, retval); 642 + err = bpf_prog_test_run_opts(main_fd, &topts); 643 + ASSERT_OK(err, "tailcall"); 644 + ASSERT_OK(topts.retval, "tailcall retval"); 654 645 out: 655 646 bpf_object__close(obj); 656 647 } ··· 664 657 struct bpf_map *prog_array; 665 658 struct bpf_program *prog; 666 659 struct bpf_object *obj; 667 - __u32 retval, duration; 668 660 char prog_name[32]; 661 + LIBBPF_OPTS(bpf_test_run_opts, topts, 662 + .data_in = &pkt_v4, 663 + .data_size_in = sizeof(pkt_v4), 664 + .repeat = 1, 665 + ); 669 666 670 667 err = bpf_prog_test_load("tailcall_bpf2bpf3.o", BPF_PROG_TYPE_SCHED_CLS, 671 668 &obj, &prog_fd); ··· 708 697 goto out; 709 698 } 710 699 711 - err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, 712 - &duration, &retval, NULL); 713 - CHECK(err || retval != sizeof(pkt_v4) * 3, 714 - "tailcall", "err %d errno %d retval %d\n", 715 - err, errno, retval); 700 + err = bpf_prog_test_run_opts(main_fd, &topts); 701 + ASSERT_OK(err, "tailcall"); 702 + ASSERT_EQ(topts.retval, sizeof(pkt_v4) * 3, "tailcall retval"); 716 703 717 704 i = 1; 718 705 err = bpf_map_delete_elem(map_fd, &i); 719 706 if (CHECK_FAIL(err)) 720 707 goto out; 721 708 722 - err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, 723 - &duration, &retval, NULL); 724 - CHECK(err || retval != sizeof(pkt_v4), 725 - "tailcall", "err %d errno %d retval %d\n", 726 - err, errno, retval); 709 + err = bpf_prog_test_run_opts(main_fd, &topts); 710 + ASSERT_OK(err, "tailcall"); 711 + ASSERT_EQ(topts.retval, sizeof(pkt_v4), "tailcall retval"); 727 712 728 713 i = 0; 729 714 err = bpf_map_delete_elem(map_fd, &i); 730 715 if (CHECK_FAIL(err)) 731 716 goto out; 732 717 733 - err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, 734 - &duration, &retval, NULL); 735 - CHECK(err || retval != sizeof(pkt_v4) * 2, 736 - "tailcall", "err %d errno %d retval %d\n", 737 - err, errno, retval); 718 + err = bpf_prog_test_run_opts(main_fd, &topts); 719 + ASSERT_OK(err, "tailcall"); 720 + ASSERT_EQ(topts.retval, sizeof(pkt_v4) * 2, "tailcall retval"); 738 721 out: 739 722 bpf_object__close(obj); 740 723 } ··· 759 754 struct bpf_map *prog_array, *data_map; 760 755 struct bpf_program *prog; 761 756 struct bpf_object *obj; 762 - __u32 retval, duration; 763 757 char prog_name[32]; 758 + LIBBPF_OPTS(bpf_test_run_opts, topts, 759 + .data_in = &pkt_v4, 760 + .data_size_in = sizeof(pkt_v4), 761 + .repeat = 1, 762 + ); 764 763 765 764 err = bpf_prog_test_load("tailcall_bpf2bpf4.o", BPF_PROG_TYPE_SCHED_CLS, 766 765 &obj, &prog_fd); ··· 818 809 if (CHECK_FAIL(err)) 819 810 goto out; 820 811 821 - err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, 822 - &duration, &retval, NULL); 823 - CHECK(err || retval != sizeof(pkt_v4) * 3, "tailcall", "err %d errno %d retval %d\n", 824 - err, errno, retval); 812 + err = bpf_prog_test_run_opts(main_fd, &topts); 813 + ASSERT_OK(err, "tailcall"); 814 + ASSERT_EQ(topts.retval, sizeof(pkt_v4) * 3, "tailcall retval"); 825 815 826 816 i = 0; 827 817 err = bpf_map_lookup_elem(data_fd, &i, &val); 828 - CHECK(err || val.count != 31, "tailcall count", "err %d errno %d count %d\n", 829 - err, errno, val.count); 818 + ASSERT_OK(err, "tailcall count"); 819 + ASSERT_EQ(val.count, 31, "tailcall count"); 830 820 831 821 out: 832 822 bpf_object__close(obj);
+9 -6
tools/testing/selftests/bpf/prog_tests/test_skb_pkt_end.c
··· 6 6 7 7 static int sanity_run(struct bpf_program *prog) 8 8 { 9 - __u32 duration, retval; 10 9 int err, prog_fd; 10 + LIBBPF_OPTS(bpf_test_run_opts, topts, 11 + .data_in = &pkt_v4, 12 + .data_size_in = sizeof(pkt_v4), 13 + .repeat = 1, 14 + ); 11 15 12 16 prog_fd = bpf_program__fd(prog); 13 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 14 - NULL, NULL, &retval, &duration); 15 - if (CHECK(err || retval != 123, "test_run", 16 - "err %d errno %d retval %d duration %d\n", 17 - err, errno, retval, duration)) 17 + err = bpf_prog_test_run_opts(prog_fd, &topts); 18 + if (!ASSERT_OK(err, "test_run")) 19 + return -1; 20 + if (!ASSERT_EQ(topts.retval, 123, "test_run retval")) 18 21 return -1; 19 22 return 0; 20 23 }
+3 -4
tools/testing/selftests/bpf/prog_tests/timer.c
··· 6 6 static int timer(struct timer *timer_skel) 7 7 { 8 8 int err, prog_fd; 9 - __u32 duration = 0, retval; 9 + LIBBPF_OPTS(bpf_test_run_opts, topts); 10 10 11 11 err = timer__attach(timer_skel); 12 12 if (!ASSERT_OK(err, "timer_attach")) ··· 16 16 ASSERT_EQ(timer_skel->data->callback2_check, 52, "callback2_check1"); 17 17 18 18 prog_fd = bpf_program__fd(timer_skel->progs.test1); 19 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 20 - NULL, NULL, &retval, &duration); 19 + err = bpf_prog_test_run_opts(prog_fd, &topts); 21 20 ASSERT_OK(err, "test_run"); 22 - ASSERT_EQ(retval, 0, "test_run"); 21 + ASSERT_EQ(topts.retval, 0, "test_run"); 23 22 timer__detach(timer_skel); 24 23 25 24 usleep(50); /* 10 usecs should be enough, but give it extra */
+3 -4
tools/testing/selftests/bpf/prog_tests/timer_mim.c
··· 6 6 7 7 static int timer_mim(struct timer_mim *timer_skel) 8 8 { 9 - __u32 duration = 0, retval; 10 9 __u64 cnt1, cnt2; 11 10 int err, prog_fd, key1 = 1; 11 + LIBBPF_OPTS(bpf_test_run_opts, topts); 12 12 13 13 err = timer_mim__attach(timer_skel); 14 14 if (!ASSERT_OK(err, "timer_attach")) 15 15 return err; 16 16 17 17 prog_fd = bpf_program__fd(timer_skel->progs.test1); 18 - err = bpf_prog_test_run(prog_fd, 1, NULL, 0, 19 - NULL, NULL, &retval, &duration); 18 + err = bpf_prog_test_run_opts(prog_fd, &topts); 20 19 ASSERT_OK(err, "test_run"); 21 - ASSERT_EQ(retval, 0, "test_run"); 20 + ASSERT_EQ(topts.retval, 0, "test_run"); 22 21 timer_mim__detach(timer_skel); 23 22 24 23 /* check that timer_cb[12] are incrementing 'cnt' */
+16 -12
tools/testing/selftests/bpf/prog_tests/trace_ext.c
··· 23 23 int err, pkt_fd, ext_fd; 24 24 struct bpf_program *prog; 25 25 char buf[100]; 26 - __u32 retval; 27 26 __u64 len; 27 + LIBBPF_OPTS(bpf_test_run_opts, topts, 28 + .data_in = &pkt_v4, 29 + .data_size_in = sizeof(pkt_v4), 30 + .repeat = 1, 31 + ); 28 32 29 33 /* open/load/attach test_pkt_md_access */ 30 34 skel_pkt = test_pkt_md_access__open_and_load(); ··· 81 77 82 78 /* load/attach tracing */ 83 79 err = test_trace_ext_tracing__load(skel_trace); 84 - if (CHECK(err, "setup", "tracing/test_pkt_md_access_new load failed\n")) { 80 + if (!ASSERT_OK(err, "tracing/test_pkt_md_access_new load")) { 85 81 libbpf_strerror(err, buf, sizeof(buf)); 86 82 fprintf(stderr, "%s\n", buf); 87 83 goto cleanup; 88 84 } 89 85 90 86 err = test_trace_ext_tracing__attach(skel_trace); 91 - if (CHECK(err, "setup", "tracing/test_pkt_md_access_new attach failed: %d\n", err)) 87 + if (!ASSERT_OK(err, "tracing/test_pkt_md_access_new attach")) 92 88 goto cleanup; 93 89 94 90 /* trigger the test */ 95 - err = bpf_prog_test_run(pkt_fd, 1, &pkt_v4, sizeof(pkt_v4), 96 - NULL, NULL, &retval, &duration); 97 - CHECK(err || retval, "run", "err %d errno %d retval %d\n", err, errno, retval); 91 + err = bpf_prog_test_run_opts(pkt_fd, &topts); 92 + ASSERT_OK(err, "test_run_opts err"); 93 + ASSERT_OK(topts.retval, "test_run_opts retval"); 98 94 99 95 bss_ext = skel_ext->bss; 100 96 bss_trace = skel_trace->bss; 101 97 102 98 len = bss_ext->ext_called; 103 99 104 - CHECK(bss_ext->ext_called == 0, 105 - "check", "failed to trigger freplace/test_pkt_md_access\n"); 106 - CHECK(bss_trace->fentry_called != len, 107 - "check", "failed to trigger fentry/test_pkt_md_access_new\n"); 108 - CHECK(bss_trace->fexit_called != len, 109 - "check", "failed to trigger fexit/test_pkt_md_access_new\n"); 100 + ASSERT_NEQ(bss_ext->ext_called, 0, 101 + "failed to trigger freplace/test_pkt_md_access"); 102 + ASSERT_EQ(bss_trace->fentry_called, len, 103 + "failed to trigger fentry/test_pkt_md_access_new"); 104 + ASSERT_EQ(bss_trace->fexit_called, len, 105 + "failed to trigger fexit/test_pkt_md_access_new"); 110 106 111 107 cleanup: 112 108 test_trace_ext_tracing__destroy(skel_trace);
+21 -13
tools/testing/selftests/bpf/prog_tests/xdp.c
··· 13 13 char buf[128]; 14 14 struct ipv6hdr iph6; 15 15 struct iphdr iph; 16 - __u32 duration, retval, size; 17 16 int err, prog_fd, map_fd; 17 + LIBBPF_OPTS(bpf_test_run_opts, topts, 18 + .data_in = &pkt_v4, 19 + .data_size_in = sizeof(pkt_v4), 20 + .data_out = buf, 21 + .data_size_out = sizeof(buf), 22 + .repeat = 1, 23 + ); 18 24 19 25 err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd); 20 26 if (CHECK_FAIL(err)) ··· 32 26 bpf_map_update_elem(map_fd, &key4, &value4, 0); 33 27 bpf_map_update_elem(map_fd, &key6, &value6, 0); 34 28 35 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 36 - buf, &size, &retval, &duration); 29 + err = bpf_prog_test_run_opts(prog_fd, &topts); 37 30 memcpy(&iph, buf + sizeof(struct ethhdr), sizeof(iph)); 38 - CHECK(err || retval != XDP_TX || size != 74 || 39 - iph.protocol != IPPROTO_IPIP, "ipv4", 40 - "err %d errno %d retval %d size %d\n", 41 - err, errno, retval, size); 31 + ASSERT_OK(err, "test_run"); 32 + ASSERT_EQ(topts.retval, XDP_TX, "ipv4 test_run retval"); 33 + ASSERT_EQ(topts.data_size_out, 74, "ipv4 test_run data_size_out"); 34 + ASSERT_EQ(iph.protocol, IPPROTO_IPIP, "ipv4 test_run iph.protocol"); 42 35 43 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6), 44 - buf, &size, &retval, &duration); 36 + topts.data_in = &pkt_v6; 37 + topts.data_size_in = sizeof(pkt_v6); 38 + topts.data_size_out = sizeof(buf); 39 + 40 + err = bpf_prog_test_run_opts(prog_fd, &topts); 45 41 memcpy(&iph6, buf + sizeof(struct ethhdr), sizeof(iph6)); 46 - CHECK(err || retval != XDP_TX || size != 114 || 47 - iph6.nexthdr != IPPROTO_IPV6, "ipv6", 48 - "err %d errno %d retval %d size %d\n", 49 - err, errno, retval, size); 42 + ASSERT_OK(err, "test_run"); 43 + ASSERT_EQ(topts.retval, XDP_TX, "ipv6 test_run retval"); 44 + ASSERT_EQ(topts.data_size_out, 114, "ipv6 test_run data_size_out"); 45 + ASSERT_EQ(iph6.nexthdr, IPPROTO_IPV6, "ipv6 test_run iph6.nexthdr"); 50 46 out: 51 47 bpf_object__close(obj); 52 48 }
+19 -13
tools/testing/selftests/bpf/prog_tests/xdp_adjust_frags.c
··· 5 5 void test_xdp_update_frags(void) 6 6 { 7 7 const char *file = "./test_xdp_update_frags.o"; 8 - __u32 duration, retval, size; 9 8 struct bpf_program *prog; 10 9 struct bpf_object *obj; 11 10 int err, prog_fd; 12 11 __u32 *offset; 13 12 __u8 *buf; 13 + LIBBPF_OPTS(bpf_test_run_opts, topts); 14 14 15 15 obj = bpf_object__open(file); 16 16 if (libbpf_get_error(obj)) ··· 32 32 buf[*offset] = 0xaa; /* marker at offset 16 (head) */ 33 33 buf[*offset + 15] = 0xaa; /* marker at offset 31 (head) */ 34 34 35 - err = bpf_prog_test_run(prog_fd, 1, buf, 128, 36 - buf, &size, &retval, &duration); 35 + topts.data_in = buf; 36 + topts.data_out = buf; 37 + topts.data_size_in = 128; 38 + topts.data_size_out = 128; 39 + 40 + err = bpf_prog_test_run_opts(prog_fd, &topts); 37 41 38 42 /* test_xdp_update_frags: buf[16,31]: 0xaa -> 0xbb */ 39 43 ASSERT_OK(err, "xdp_update_frag"); 40 - ASSERT_EQ(retval, XDP_PASS, "xdp_update_frag retval"); 44 + ASSERT_EQ(topts.retval, XDP_PASS, "xdp_update_frag retval"); 41 45 ASSERT_EQ(buf[16], 0xbb, "xdp_update_frag buf[16]"); 42 46 ASSERT_EQ(buf[31], 0xbb, "xdp_update_frag buf[31]"); 43 47 ··· 57 53 buf[*offset] = 0xaa; /* marker at offset 5000 (frag0) */ 58 54 buf[*offset + 15] = 0xaa; /* marker at offset 5015 (frag0) */ 59 55 60 - err = bpf_prog_test_run(prog_fd, 1, buf, 9000, 61 - buf, &size, &retval, &duration); 56 + topts.data_in = buf; 57 + topts.data_out = buf; 58 + topts.data_size_in = 9000; 59 + topts.data_size_out = 9000; 60 + 61 + err = bpf_prog_test_run_opts(prog_fd, &topts); 62 62 63 63 /* test_xdp_update_frags: buf[5000,5015]: 0xaa -> 0xbb */ 64 64 ASSERT_OK(err, "xdp_update_frag"); 65 - ASSERT_EQ(retval, XDP_PASS, "xdp_update_frag retval"); 65 + ASSERT_EQ(topts.retval, XDP_PASS, "xdp_update_frag retval"); 66 66 ASSERT_EQ(buf[5000], 0xbb, "xdp_update_frag buf[5000]"); 67 67 ASSERT_EQ(buf[5015], 0xbb, "xdp_update_frag buf[5015]"); 68 68 ··· 76 68 buf[*offset] = 0xaa; /* marker at offset 3510 (head) */ 77 69 buf[*offset + 15] = 0xaa; /* marker at offset 3525 (frag0) */ 78 70 79 - err = bpf_prog_test_run(prog_fd, 1, buf, 9000, 80 - buf, &size, &retval, &duration); 71 + err = bpf_prog_test_run_opts(prog_fd, &topts); 81 72 82 73 /* test_xdp_update_frags: buf[3510,3525]: 0xaa -> 0xbb */ 83 74 ASSERT_OK(err, "xdp_update_frag"); 84 - ASSERT_EQ(retval, XDP_PASS, "xdp_update_frag retval"); 75 + ASSERT_EQ(topts.retval, XDP_PASS, "xdp_update_frag retval"); 85 76 ASSERT_EQ(buf[3510], 0xbb, "xdp_update_frag buf[3510]"); 86 77 ASSERT_EQ(buf[3525], 0xbb, "xdp_update_frag buf[3525]"); 87 78 ··· 90 83 buf[*offset] = 0xaa; /* marker at offset 7606 (frag0) */ 91 84 buf[*offset + 15] = 0xaa; /* marker at offset 7621 (frag1) */ 92 85 93 - err = bpf_prog_test_run(prog_fd, 1, buf, 9000, 94 - buf, &size, &retval, &duration); 86 + err = bpf_prog_test_run_opts(prog_fd, &topts); 95 87 96 88 /* test_xdp_update_frags: buf[7606,7621]: 0xaa -> 0xbb */ 97 89 ASSERT_OK(err, "xdp_update_frag"); 98 - ASSERT_EQ(retval, XDP_PASS, "xdp_update_frag retval"); 90 + ASSERT_EQ(topts.retval, XDP_PASS, "xdp_update_frag retval"); 99 91 ASSERT_EQ(buf[7606], 0xbb, "xdp_update_frag buf[7606]"); 100 92 ASSERT_EQ(buf[7621], 0xbb, "xdp_update_frag buf[7621]"); 101 93
+68 -42
tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c
··· 5 5 static void test_xdp_adjust_tail_shrink(void) 6 6 { 7 7 const char *file = "./test_xdp_adjust_tail_shrink.o"; 8 - __u32 duration, retval, size, expect_sz; 8 + __u32 expect_sz; 9 9 struct bpf_object *obj; 10 10 int err, prog_fd; 11 11 char buf[128]; 12 + LIBBPF_OPTS(bpf_test_run_opts, topts, 13 + .data_in = &pkt_v4, 14 + .data_size_in = sizeof(pkt_v4), 15 + .data_out = buf, 16 + .data_size_out = sizeof(buf), 17 + .repeat = 1, 18 + ); 12 19 13 20 err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd); 14 21 if (ASSERT_OK(err, "test_xdp_adjust_tail_shrink")) 15 22 return; 16 23 17 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 18 - buf, &size, &retval, &duration); 24 + err = bpf_prog_test_run_opts(prog_fd, &topts); 19 25 ASSERT_OK(err, "ipv4"); 20 - ASSERT_EQ(retval, XDP_DROP, "ipv4 retval"); 26 + ASSERT_EQ(topts.retval, XDP_DROP, "ipv4 retval"); 21 27 22 28 expect_sz = sizeof(pkt_v6) - 20; /* Test shrink with 20 bytes */ 23 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6), 24 - buf, &size, &retval, &duration); 29 + topts.data_in = &pkt_v6; 30 + topts.data_size_in = sizeof(pkt_v6); 31 + topts.data_size_out = sizeof(buf); 32 + err = bpf_prog_test_run_opts(prog_fd, &topts); 25 33 ASSERT_OK(err, "ipv6"); 26 - ASSERT_EQ(retval, XDP_TX, "ipv6 retval"); 27 - ASSERT_EQ(size, expect_sz, "ipv6 size"); 34 + ASSERT_EQ(topts.retval, XDP_TX, "ipv6 retval"); 35 + ASSERT_EQ(topts.data_size_out, expect_sz, "ipv6 size"); 28 36 29 37 bpf_object__close(obj); 30 38 } ··· 42 34 const char *file = "./test_xdp_adjust_tail_grow.o"; 43 35 struct bpf_object *obj; 44 36 char buf[4096]; /* avoid segfault: large buf to hold grow results */ 45 - __u32 duration, retval, size, expect_sz; 37 + __u32 expect_sz; 46 38 int err, prog_fd; 39 + LIBBPF_OPTS(bpf_test_run_opts, topts, 40 + .data_in = &pkt_v4, 41 + .data_size_in = sizeof(pkt_v4), 42 + .data_out = buf, 43 + .data_size_out = sizeof(buf), 44 + .repeat = 1, 45 + ); 47 46 48 47 err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd); 49 48 if (ASSERT_OK(err, "test_xdp_adjust_tail_grow")) 50 49 return; 51 50 52 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4), 53 - buf, &size, &retval, &duration); 51 + err = bpf_prog_test_run_opts(prog_fd, &topts); 54 52 ASSERT_OK(err, "ipv4"); 55 - ASSERT_EQ(retval, XDP_DROP, "ipv4 retval"); 53 + ASSERT_EQ(topts.retval, XDP_DROP, "ipv4 retval"); 56 54 57 55 expect_sz = sizeof(pkt_v6) + 40; /* Test grow with 40 bytes */ 58 - err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6) /* 74 */, 59 - buf, &size, &retval, &duration); 56 + topts.data_in = &pkt_v6; 57 + topts.data_size_in = sizeof(pkt_v6); 58 + err = bpf_prog_test_run_opts(prog_fd, &topts); 60 59 ASSERT_OK(err, "ipv6"); 61 - ASSERT_EQ(retval, XDP_TX, "ipv6 retval"); 62 - ASSERT_EQ(size, expect_sz, "ipv6 size"); 60 + ASSERT_EQ(topts.retval, XDP_TX, "ipv6 retval"); 61 + ASSERT_EQ(topts.data_size_out, expect_sz, "ipv6 size"); 63 62 64 63 bpf_object__close(obj); 65 64 } ··· 136 121 void test_xdp_adjust_frags_tail_shrink(void) 137 122 { 138 123 const char *file = "./test_xdp_adjust_tail_shrink.o"; 139 - __u32 duration, retval, size, exp_size; 124 + __u32 exp_size; 140 125 struct bpf_program *prog; 141 126 struct bpf_object *obj; 142 127 int err, prog_fd; 143 128 __u8 *buf; 129 + LIBBPF_OPTS(bpf_test_run_opts, topts); 144 130 145 131 /* For the individual test cases, the first byte in the packet 146 132 * indicates which test will be run. ··· 164 148 165 149 /* Test case removing 10 bytes from last frag, NOT freeing it */ 166 150 exp_size = 8990; /* 9000 - 10 */ 167 - err = bpf_prog_test_run(prog_fd, 1, buf, 9000, 168 - buf, &size, &retval, &duration); 151 + topts.data_in = buf; 152 + topts.data_out = buf; 153 + topts.data_size_in = 9000; 154 + topts.data_size_out = 9000; 155 + err = bpf_prog_test_run_opts(prog_fd, &topts); 169 156 170 157 ASSERT_OK(err, "9Kb-10b"); 171 - ASSERT_EQ(retval, XDP_TX, "9Kb-10b retval"); 172 - ASSERT_EQ(size, exp_size, "9Kb-10b size"); 158 + ASSERT_EQ(topts.retval, XDP_TX, "9Kb-10b retval"); 159 + ASSERT_EQ(topts.data_size_out, exp_size, "9Kb-10b size"); 173 160 174 161 /* Test case removing one of two pages, assuming 4K pages */ 175 162 buf[0] = 1; 176 163 exp_size = 4900; /* 9000 - 4100 */ 177 - err = bpf_prog_test_run(prog_fd, 1, buf, 9000, 178 - buf, &size, &retval, &duration); 164 + 165 + topts.data_size_out = 9000; /* reset from previous invocation */ 166 + err = bpf_prog_test_run_opts(prog_fd, &topts); 179 167 180 168 ASSERT_OK(err, "9Kb-4Kb"); 181 - ASSERT_EQ(retval, XDP_TX, "9Kb-4Kb retval"); 182 - ASSERT_EQ(size, exp_size, "9Kb-4Kb size"); 169 + ASSERT_EQ(topts.retval, XDP_TX, "9Kb-4Kb retval"); 170 + ASSERT_EQ(topts.data_size_out, exp_size, "9Kb-4Kb size"); 183 171 184 172 /* Test case removing two pages resulting in a linear xdp_buff */ 185 173 buf[0] = 2; 186 174 exp_size = 800; /* 9000 - 8200 */ 187 - err = bpf_prog_test_run(prog_fd, 1, buf, 9000, 188 - buf, &size, &retval, &duration); 175 + topts.data_size_out = 9000; /* reset from previous invocation */ 176 + err = bpf_prog_test_run_opts(prog_fd, &topts); 189 177 190 178 ASSERT_OK(err, "9Kb-9Kb"); 191 - ASSERT_EQ(retval, XDP_TX, "9Kb-9Kb retval"); 192 - ASSERT_EQ(size, exp_size, "9Kb-9Kb size"); 179 + ASSERT_EQ(topts.retval, XDP_TX, "9Kb-9Kb retval"); 180 + ASSERT_EQ(topts.data_size_out, exp_size, "9Kb-9Kb size"); 193 181 194 182 free(buf); 195 183 out: ··· 203 183 void test_xdp_adjust_frags_tail_grow(void) 204 184 { 205 185 const char *file = "./test_xdp_adjust_tail_grow.o"; 206 - __u32 duration, retval, size, exp_size; 186 + __u32 exp_size; 207 187 struct bpf_program *prog; 208 188 struct bpf_object *obj; 209 189 int err, i, prog_fd; 210 190 __u8 *buf; 191 + LIBBPF_OPTS(bpf_test_run_opts, topts); 211 192 212 193 obj = bpf_object__open(file); 213 194 if (libbpf_get_error(obj)) ··· 226 205 227 206 /* Test case add 10 bytes to last frag */ 228 207 memset(buf, 1, 16384); 229 - size = 9000; 230 - exp_size = size + 10; 231 - err = bpf_prog_test_run(prog_fd, 1, buf, size, 232 - buf, &size, &retval, &duration); 208 + exp_size = 9000 + 10; 209 + 210 + topts.data_in = buf; 211 + topts.data_out = buf; 212 + topts.data_size_in = 9000; 213 + topts.data_size_out = 16384; 214 + err = bpf_prog_test_run_opts(prog_fd, &topts); 233 215 234 216 ASSERT_OK(err, "9Kb+10b"); 235 - ASSERT_EQ(retval, XDP_TX, "9Kb+10b retval"); 236 - ASSERT_EQ(size, exp_size, "9Kb+10b size"); 217 + ASSERT_EQ(topts.retval, XDP_TX, "9Kb+10b retval"); 218 + ASSERT_EQ(topts.data_size_out, exp_size, "9Kb+10b size"); 237 219 238 220 for (i = 0; i < 9000; i++) 239 221 ASSERT_EQ(buf[i], 1, "9Kb+10b-old"); ··· 249 225 250 226 /* Test a too large grow */ 251 227 memset(buf, 1, 16384); 252 - size = 9001; 253 - exp_size = size; 254 - err = bpf_prog_test_run(prog_fd, 1, buf, size, 255 - buf, &size, &retval, &duration); 228 + exp_size = 9001; 229 + 230 + topts.data_in = topts.data_out = buf; 231 + topts.data_size_in = 9001; 232 + topts.data_size_out = 16384; 233 + err = bpf_prog_test_run_opts(prog_fd, &topts); 256 234 257 235 ASSERT_OK(err, "9Kb+10b"); 258 - ASSERT_EQ(retval, XDP_DROP, "9Kb+10b retval"); 259 - ASSERT_EQ(size, exp_size, "9Kb+10b size"); 236 + ASSERT_EQ(topts.retval, XDP_DROP, "9Kb+10b retval"); 237 + ASSERT_EQ(topts.data_size_out, exp_size, "9Kb+10b size"); 260 238 261 239 free(buf); 262 240 out:
+9 -5
tools/testing/selftests/bpf/prog_tests/xdp_bpf2bpf.c
··· 45 45 struct test_xdp_bpf2bpf *ftrace_skel, 46 46 int pkt_size) 47 47 { 48 - __u32 duration = 0, retval, size; 49 48 __u8 *buf, *buf_in; 50 49 int err; 50 + LIBBPF_OPTS(bpf_test_run_opts, topts); 51 51 52 52 if (!ASSERT_LE(pkt_size, BUF_SZ, "pkt_size") || 53 53 !ASSERT_GE(pkt_size, sizeof(pkt_v4), "pkt_size")) ··· 73 73 } 74 74 75 75 /* Run test program */ 76 - err = bpf_prog_test_run(pkt_fd, 1, buf_in, pkt_size, 77 - buf, &size, &retval, &duration); 76 + topts.data_in = buf_in; 77 + topts.data_size_in = pkt_size; 78 + topts.data_out = buf; 79 + topts.data_size_out = BUF_SZ; 80 + 81 + err = bpf_prog_test_run_opts(pkt_fd, &topts); 78 82 79 83 ASSERT_OK(err, "ipv4"); 80 - ASSERT_EQ(retval, XDP_PASS, "ipv4 retval"); 81 - ASSERT_EQ(size, pkt_size, "ipv4 size"); 84 + ASSERT_EQ(topts.retval, XDP_PASS, "ipv4 retval"); 85 + ASSERT_EQ(topts.data_size_out, pkt_size, "ipv4 size"); 82 86 83 87 /* Make sure bpf_xdp_output() was triggered and it sent the expected 84 88 * data to the perf ring buffer.
+25 -19
tools/testing/selftests/bpf/prog_tests/xdp_noinline.c
··· 25 25 __u8 flags; 26 26 } real_def = {.dst = MAGIC_VAL}; 27 27 __u32 ch_key = 11, real_num = 3; 28 - __u32 duration = 0, retval, size; 29 28 int err, i; 30 29 __u64 bytes = 0, pkts = 0; 31 30 char buf[128]; 32 31 u32 *magic = (u32 *)buf; 32 + LIBBPF_OPTS(bpf_test_run_opts, topts, 33 + .data_in = &pkt_v4, 34 + .data_size_in = sizeof(pkt_v4), 35 + .data_out = buf, 36 + .data_size_out = sizeof(buf), 37 + .repeat = NUM_ITER, 38 + ); 33 39 34 40 skel = test_xdp_noinline__open_and_load(); 35 - if (CHECK(!skel, "skel_open_and_load", "failed\n")) 41 + if (!ASSERT_OK_PTR(skel, "skel_open_and_load")) 36 42 return; 37 43 38 44 bpf_map_update_elem(bpf_map__fd(skel->maps.vip_map), &key, &value, 0); 39 45 bpf_map_update_elem(bpf_map__fd(skel->maps.ch_rings), &ch_key, &real_num, 0); 40 46 bpf_map_update_elem(bpf_map__fd(skel->maps.reals), &real_num, &real_def, 0); 41 47 42 - err = bpf_prog_test_run(bpf_program__fd(skel->progs.balancer_ingress_v4), 43 - NUM_ITER, &pkt_v4, sizeof(pkt_v4), 44 - buf, &size, &retval, &duration); 45 - CHECK(err || retval != 1 || size != 54 || 46 - *magic != MAGIC_VAL, "ipv4", 47 - "err %d errno %d retval %d size %d magic %x\n", 48 - err, errno, retval, size, *magic); 48 + err = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.balancer_ingress_v4), &topts); 49 + ASSERT_OK(err, "ipv4 test_run"); 50 + ASSERT_EQ(topts.retval, 1, "ipv4 test_run retval"); 51 + ASSERT_EQ(topts.data_size_out, 54, "ipv4 test_run data_size_out"); 52 + ASSERT_EQ(*magic, MAGIC_VAL, "ipv4 test_run magic"); 49 53 50 - err = bpf_prog_test_run(bpf_program__fd(skel->progs.balancer_ingress_v6), 51 - NUM_ITER, &pkt_v6, sizeof(pkt_v6), 52 - buf, &size, &retval, &duration); 53 - CHECK(err || retval != 1 || size != 74 || 54 - *magic != MAGIC_VAL, "ipv6", 55 - "err %d errno %d retval %d size %d magic %x\n", 56 - err, errno, retval, size, *magic); 54 + topts.data_in = &pkt_v6; 55 + topts.data_size_in = sizeof(pkt_v6); 56 + topts.data_out = buf; 57 + topts.data_size_out = sizeof(buf); 58 + 59 + err = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.balancer_ingress_v6), &topts); 60 + ASSERT_OK(err, "ipv6 test_run"); 61 + ASSERT_EQ(topts.retval, 1, "ipv6 test_run retval"); 62 + ASSERT_EQ(topts.data_size_out, 74, "ipv6 test_run data_size_out"); 63 + ASSERT_EQ(*magic, MAGIC_VAL, "ipv6 test_run magic"); 57 64 58 65 bpf_map_lookup_elem(bpf_map__fd(skel->maps.stats), &stats_key, stats); 59 66 for (i = 0; i < nr_cpus; i++) { 60 67 bytes += stats[i].bytes; 61 68 pkts += stats[i].pkts; 62 69 } 63 - CHECK(bytes != MAGIC_BYTES * NUM_ITER * 2 || pkts != NUM_ITER * 2, 64 - "stats", "bytes %lld pkts %lld\n", 65 - (unsigned long long)bytes, (unsigned long long)pkts); 70 + ASSERT_EQ(bytes, MAGIC_BYTES * NUM_ITER * 2, "stats bytes"); 71 + ASSERT_EQ(pkts, NUM_ITER * 2, "stats pkts"); 66 72 test_xdp_noinline__destroy(skel); 67 73 }
+11 -8
tools/testing/selftests/bpf/prog_tests/xdp_perf.c
··· 4 4 void test_xdp_perf(void) 5 5 { 6 6 const char *file = "./xdp_dummy.o"; 7 - __u32 duration, retval, size; 8 7 struct bpf_object *obj; 9 8 char in[128], out[128]; 10 9 int err, prog_fd; 10 + LIBBPF_OPTS(bpf_test_run_opts, topts, 11 + .data_in = in, 12 + .data_size_in = sizeof(in), 13 + .data_out = out, 14 + .data_size_out = sizeof(out), 15 + .repeat = 1000000, 16 + ); 11 17 12 18 err = bpf_prog_test_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd); 13 19 if (CHECK_FAIL(err)) 14 20 return; 15 21 16 - err = bpf_prog_test_run(prog_fd, 1000000, &in[0], 128, 17 - out, &size, &retval, &duration); 18 - 19 - CHECK(err || retval != XDP_PASS || size != 128, 20 - "xdp-perf", 21 - "err %d errno %d retval %d size %d\n", 22 - err, errno, retval, size); 22 + err = bpf_prog_test_run_opts(prog_fd, &topts); 23 + ASSERT_OK(err, "test_run"); 24 + ASSERT_EQ(topts.retval, XDP_PASS, "test_run retval"); 25 + ASSERT_EQ(topts.data_size_out, 128, "test_run data_size_out"); 23 26 24 27 bpf_object__close(obj); 25 28 }
+7 -4
tools/testing/selftests/bpf/test_lru_map.c
··· 61 61 }; 62 62 __u8 data[64] = {}; 63 63 int mfd, pfd, ret, zero = 0; 64 - __u32 retval = 0; 64 + LIBBPF_OPTS(bpf_test_run_opts, topts, 65 + .data_in = data, 66 + .data_size_in = sizeof(data), 67 + .repeat = 1, 68 + ); 65 69 66 70 mfd = bpf_map_create(BPF_MAP_TYPE_ARRAY, NULL, sizeof(int), sizeof(__u64), 1, NULL); 67 71 if (mfd < 0) ··· 79 75 return -1; 80 76 } 81 77 82 - ret = bpf_prog_test_run(pfd, 1, data, sizeof(data), 83 - NULL, NULL, &retval, NULL); 84 - if (ret < 0 || retval != 42) { 78 + ret = bpf_prog_test_run_opts(pfd, &topts); 79 + if (ret < 0 || topts.retval != 42) { 85 80 ret = -1; 86 81 } else { 87 82 assert(!bpf_map_lookup_elem(mfd, &zero, value));
+10 -6
tools/testing/selftests/bpf/test_verifier.c
··· 1021 1021 { 1022 1022 __u8 tmp[TEST_DATA_LEN << 2]; 1023 1023 __u32 size_tmp = sizeof(tmp); 1024 - uint32_t retval; 1025 1024 int err, saved_errno; 1025 + LIBBPF_OPTS(bpf_test_run_opts, topts, 1026 + .data_in = data, 1027 + .data_size_in = size_data, 1028 + .data_out = tmp, 1029 + .data_size_out = size_tmp, 1030 + .repeat = 1, 1031 + ); 1026 1032 1027 1033 if (unpriv) 1028 1034 set_admin(true); 1029 - err = bpf_prog_test_run(fd_prog, 1, data, size_data, 1030 - tmp, &size_tmp, &retval, NULL); 1035 + err = bpf_prog_test_run_opts(fd_prog, &topts); 1031 1036 saved_errno = errno; 1032 1037 1033 1038 if (unpriv) ··· 1056 1051 } 1057 1052 } 1058 1053 1059 - if (retval != expected_val && 1060 - expected_val != POINTER_VALUE) { 1061 - printf("FAIL retval %d != %d ", retval, expected_val); 1054 + if (topts.retval != expected_val && expected_val != POINTER_VALUE) { 1055 + printf("FAIL retval %d != %d ", topts.retval, expected_val); 1062 1056 return 1; 1063 1057 } 1064 1058