diff options
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests/tailcalls.c')
| -rw-r--r-- | tools/testing/selftests/bpf/prog_tests/tailcalls.c | 274 | 
1 files changed, 141 insertions, 133 deletions
| diff --git a/tools/testing/selftests/bpf/prog_tests/tailcalls.c b/tools/testing/selftests/bpf/prog_tests/tailcalls.c index 5dc0f425bd11..c4da87ec3ba4 100644 --- a/tools/testing/selftests/bpf/prog_tests/tailcalls.c +++ b/tools/testing/selftests/bpf/prog_tests/tailcalls.c @@ -12,9 +12,13 @@ static void test_tailcall_1(void)  	struct bpf_map *prog_array;  	struct bpf_program *prog;  	struct bpf_object *obj; -	__u32 retval, duration;  	char prog_name[32];  	char buff[128] = {}; +	LIBBPF_OPTS(bpf_test_run_opts, topts, +		.data_in = buff, +		.data_size_in = sizeof(buff), +		.repeat = 1, +	);  	err = bpf_prog_test_load("tailcall1.o", BPF_PROG_TYPE_SCHED_CLS, &obj,  			    &prog_fd); @@ -37,7 +41,7 @@ static void test_tailcall_1(void)  	if (CHECK_FAIL(map_fd < 0))  		goto out; -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		snprintf(prog_name, sizeof(prog_name), "classifier_%d", i);  		prog = bpf_object__find_program_by_name(obj, prog_name); @@ -53,23 +57,21 @@ static void test_tailcall_1(void)  			goto out;  	} -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { -		err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -					&duration, &retval, NULL); -		CHECK(err || retval != i, "tailcall", -		      "err %d errno %d retval %d\n", err, errno, retval); +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) { +		err = bpf_prog_test_run_opts(main_fd, &topts); +		ASSERT_OK(err, "tailcall"); +		ASSERT_EQ(topts.retval, i, "tailcall retval");  		err = bpf_map_delete_elem(map_fd, &i);  		if (CHECK_FAIL(err))  			goto out;  	} -	err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != 3, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, 3, "tailcall retval"); -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		snprintf(prog_name, sizeof(prog_name), "classifier_%d", i);  		prog = bpf_object__find_program_by_name(obj, prog_name); @@ -85,13 +87,12 @@ static void test_tailcall_1(void)  			goto out;  	} -	err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != 0, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_OK(topts.retval, "tailcall retval"); -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { -		j = bpf_map__def(prog_array)->max_entries - 1 - i; +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) { +		j = bpf_map__max_entries(prog_array) - 1 - i;  		snprintf(prog_name, sizeof(prog_name), "classifier_%d", j);  		prog = bpf_object__find_program_by_name(obj, prog_name); @@ -107,33 +108,30 @@ static void test_tailcall_1(void)  			goto out;  	} -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { -		j = bpf_map__def(prog_array)->max_entries - 1 - i; +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) { +		j = bpf_map__max_entries(prog_array) - 1 - i; -		err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -					&duration, &retval, NULL); -		CHECK(err || retval != j, "tailcall", -		      "err %d errno %d retval %d\n", err, errno, retval); +		err = bpf_prog_test_run_opts(main_fd, &topts); +		ASSERT_OK(err, "tailcall"); +		ASSERT_EQ(topts.retval, j, "tailcall retval");  		err = bpf_map_delete_elem(map_fd, &i);  		if (CHECK_FAIL(err))  			goto out;  	} -	err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != 3, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, 3, "tailcall retval"); -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		err = bpf_map_delete_elem(map_fd, &i);  		if (CHECK_FAIL(err >= 0 || errno != ENOENT))  			goto out; -		err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -					&duration, &retval, NULL); -		CHECK(err || retval != 3, "tailcall", -		      "err %d errno %d retval %d\n", err, errno, retval); +		err = bpf_prog_test_run_opts(main_fd, &topts); +		ASSERT_OK(err, "tailcall"); +		ASSERT_EQ(topts.retval, 3, "tailcall retval");  	}  out: @@ -150,9 +148,13 @@ static void test_tailcall_2(void)  	struct bpf_map *prog_array;  	struct bpf_program *prog;  	struct bpf_object *obj; -	__u32 retval, duration;  	char prog_name[32];  	char buff[128] = {}; +	LIBBPF_OPTS(bpf_test_run_opts, topts, +		.data_in = buff, +		.data_size_in = sizeof(buff), +		.repeat = 1, +	);  	err = bpf_prog_test_load("tailcall2.o", BPF_PROG_TYPE_SCHED_CLS, &obj,  			    &prog_fd); @@ -175,7 +177,7 @@ static void test_tailcall_2(void)  	if (CHECK_FAIL(map_fd < 0))  		goto out; -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		snprintf(prog_name, sizeof(prog_name), "classifier_%d", i);  		prog = bpf_object__find_program_by_name(obj, prog_name); @@ -191,30 +193,27 @@ static void test_tailcall_2(void)  			goto out;  	} -	err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != 2, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, 2, "tailcall retval");  	i = 2;  	err = bpf_map_delete_elem(map_fd, &i);  	if (CHECK_FAIL(err))  		goto out; -	err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != 1, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, 1, "tailcall retval");  	i = 0;  	err = bpf_map_delete_elem(map_fd, &i);  	if (CHECK_FAIL(err))  		goto out; -	err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != 3, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, 3, "tailcall retval");  out:  	bpf_object__close(obj);  } @@ -225,8 +224,12 @@ static void test_tailcall_count(const char *which)  	struct bpf_map *prog_array, *data_map;  	struct bpf_program *prog;  	struct bpf_object *obj; -	__u32 retval, duration;  	char buff[128] = {}; +	LIBBPF_OPTS(bpf_test_run_opts, topts, +		.data_in = buff, +		.data_size_in = sizeof(buff), +		.repeat = 1, +	);  	err = bpf_prog_test_load(which, BPF_PROG_TYPE_SCHED_CLS, &obj,  			    &prog_fd); @@ -262,10 +265,9 @@ static void test_tailcall_count(const char *which)  	if (CHECK_FAIL(err))  		goto out; -	err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != 1, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, 1, "tailcall retval");  	data_map = bpf_object__find_map_by_name(obj, "tailcall.bss");  	if (CHECK_FAIL(!data_map || !bpf_map__is_internal(data_map))) @@ -277,18 +279,17 @@ static void test_tailcall_count(const char *which)  	i = 0;  	err = bpf_map_lookup_elem(data_fd, &i, &val); -	CHECK(err || val != 33, "tailcall count", "err %d errno %d count %d\n", -	      err, errno, val); +	ASSERT_OK(err, "tailcall count"); +	ASSERT_EQ(val, 33, "tailcall count");  	i = 0;  	err = bpf_map_delete_elem(map_fd, &i);  	if (CHECK_FAIL(err))  		goto out; -	err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != 0, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_OK(topts.retval, "tailcall retval");  out:  	bpf_object__close(obj);  } @@ -319,10 +320,14 @@ static void test_tailcall_4(void)  	struct bpf_map *prog_array, *data_map;  	struct bpf_program *prog;  	struct bpf_object *obj; -	__u32 retval, duration;  	static const int zero = 0;  	char buff[128] = {};  	char prog_name[32]; +	LIBBPF_OPTS(bpf_test_run_opts, topts, +		.data_in = buff, +		.data_size_in = sizeof(buff), +		.repeat = 1, +	);  	err = bpf_prog_test_load("tailcall4.o", BPF_PROG_TYPE_SCHED_CLS, &obj,  			    &prog_fd); @@ -353,7 +358,7 @@ static void test_tailcall_4(void)  	if (CHECK_FAIL(map_fd < 0))  		return; -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		snprintf(prog_name, sizeof(prog_name), "classifier_%d", i);  		prog = bpf_object__find_program_by_name(obj, prog_name); @@ -369,18 +374,17 @@ static void test_tailcall_4(void)  			goto out;  	} -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		err = bpf_map_update_elem(data_fd, &zero, &i, BPF_ANY);  		if (CHECK_FAIL(err))  			goto out; -		err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -					&duration, &retval, NULL); -		CHECK(err || retval != i, "tailcall", -		      "err %d errno %d retval %d\n", err, errno, retval); +		err = bpf_prog_test_run_opts(main_fd, &topts); +		ASSERT_OK(err, "tailcall"); +		ASSERT_EQ(topts.retval, i, "tailcall retval");  	} -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		err = bpf_map_update_elem(data_fd, &zero, &i, BPF_ANY);  		if (CHECK_FAIL(err))  			goto out; @@ -389,10 +393,9 @@ static void test_tailcall_4(void)  		if (CHECK_FAIL(err))  			goto out; -		err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -					&duration, &retval, NULL); -		CHECK(err || retval != 3, "tailcall", -		      "err %d errno %d retval %d\n", err, errno, retval); +		err = bpf_prog_test_run_opts(main_fd, &topts); +		ASSERT_OK(err, "tailcall"); +		ASSERT_EQ(topts.retval, 3, "tailcall retval");  	}  out:  	bpf_object__close(obj); @@ -407,10 +410,14 @@ static void test_tailcall_5(void)  	struct bpf_map *prog_array, *data_map;  	struct bpf_program *prog;  	struct bpf_object *obj; -	__u32 retval, duration;  	static const int zero = 0;  	char buff[128] = {};  	char prog_name[32]; +	LIBBPF_OPTS(bpf_test_run_opts, topts, +		.data_in = buff, +		.data_size_in = sizeof(buff), +		.repeat = 1, +	);  	err = bpf_prog_test_load("tailcall5.o", BPF_PROG_TYPE_SCHED_CLS, &obj,  			    &prog_fd); @@ -441,7 +448,7 @@ static void test_tailcall_5(void)  	if (CHECK_FAIL(map_fd < 0))  		return; -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		snprintf(prog_name, sizeof(prog_name), "classifier_%d", i);  		prog = bpf_object__find_program_by_name(obj, prog_name); @@ -457,18 +464,17 @@ static void test_tailcall_5(void)  			goto out;  	} -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		err = bpf_map_update_elem(data_fd, &zero, &key[i], BPF_ANY);  		if (CHECK_FAIL(err))  			goto out; -		err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -					&duration, &retval, NULL); -		CHECK(err || retval != i, "tailcall", -		      "err %d errno %d retval %d\n", err, errno, retval); +		err = bpf_prog_test_run_opts(main_fd, &topts); +		ASSERT_OK(err, "tailcall"); +		ASSERT_EQ(topts.retval, i, "tailcall retval");  	} -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		err = bpf_map_update_elem(data_fd, &zero, &key[i], BPF_ANY);  		if (CHECK_FAIL(err))  			goto out; @@ -477,10 +483,9 @@ static void test_tailcall_5(void)  		if (CHECK_FAIL(err))  			goto out; -		err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -					&duration, &retval, NULL); -		CHECK(err || retval != 3, "tailcall", -		      "err %d errno %d retval %d\n", err, errno, retval); +		err = bpf_prog_test_run_opts(main_fd, &topts); +		ASSERT_OK(err, "tailcall"); +		ASSERT_EQ(topts.retval, 3, "tailcall retval");  	}  out:  	bpf_object__close(obj); @@ -495,8 +500,12 @@ static void test_tailcall_bpf2bpf_1(void)  	struct bpf_map *prog_array;  	struct bpf_program *prog;  	struct bpf_object *obj; -	__u32 retval, duration;  	char prog_name[32]; +	LIBBPF_OPTS(bpf_test_run_opts, topts, +		.data_in = &pkt_v4, +		.data_size_in = sizeof(pkt_v4), +		.repeat = 1, +	);  	err = bpf_prog_test_load("tailcall_bpf2bpf1.o", BPF_PROG_TYPE_SCHED_CLS,  			    &obj, &prog_fd); @@ -520,7 +529,7 @@ static void test_tailcall_bpf2bpf_1(void)  		goto out;  	/* nop -> jmp */ -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		snprintf(prog_name, sizeof(prog_name), "classifier_%d", i);  		prog = bpf_object__find_program_by_name(obj, prog_name); @@ -536,10 +545,9 @@ static void test_tailcall_bpf2bpf_1(void)  			goto out;  	} -	err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, -				0, &retval, &duration); -	CHECK(err || retval != 1, "tailcall", -	      "err %d errno %d retval %d\n", err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, 1, "tailcall retval");  	/* jmp -> nop, call subprog that will do tailcall */  	i = 1; @@ -547,10 +555,9 @@ static void test_tailcall_bpf2bpf_1(void)  	if (CHECK_FAIL(err))  		goto out; -	err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, -				0, &retval, &duration); -	CHECK(err || retval != 0, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_OK(topts.retval, "tailcall retval");  	/* make sure that subprog can access ctx and entry prog that  	 * called this subprog can properly return @@ -560,11 +567,9 @@ static void test_tailcall_bpf2bpf_1(void)  	if (CHECK_FAIL(err))  		goto out; -	err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, -				0, &retval, &duration); -	CHECK(err || retval != sizeof(pkt_v4) * 2, -	      "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, sizeof(pkt_v4) * 2, "tailcall retval");  out:  	bpf_object__close(obj);  } @@ -579,8 +584,12 @@ static void test_tailcall_bpf2bpf_2(void)  	struct bpf_map *prog_array, *data_map;  	struct bpf_program *prog;  	struct bpf_object *obj; -	__u32 retval, duration;  	char buff[128] = {}; +	LIBBPF_OPTS(bpf_test_run_opts, topts, +		.data_in = buff, +		.data_size_in = sizeof(buff), +		.repeat = 1, +	);  	err = bpf_prog_test_load("tailcall_bpf2bpf2.o", BPF_PROG_TYPE_SCHED_CLS,  			    &obj, &prog_fd); @@ -616,10 +625,9 @@ static void test_tailcall_bpf2bpf_2(void)  	if (CHECK_FAIL(err))  		goto out; -	err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != 1, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, 1, "tailcall retval");  	data_map = bpf_object__find_map_by_name(obj, "tailcall.bss");  	if (CHECK_FAIL(!data_map || !bpf_map__is_internal(data_map))) @@ -631,18 +639,17 @@ static void test_tailcall_bpf2bpf_2(void)  	i = 0;  	err = bpf_map_lookup_elem(data_fd, &i, &val); -	CHECK(err || val != 33, "tailcall count", "err %d errno %d count %d\n", -	      err, errno, val); +	ASSERT_OK(err, "tailcall count"); +	ASSERT_EQ(val, 33, "tailcall count");  	i = 0;  	err = bpf_map_delete_elem(map_fd, &i);  	if (CHECK_FAIL(err))  		goto out; -	err = bpf_prog_test_run(main_fd, 1, buff, sizeof(buff), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != 0, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_OK(topts.retval, "tailcall retval");  out:  	bpf_object__close(obj);  } @@ -657,8 +664,12 @@ static void test_tailcall_bpf2bpf_3(void)  	struct bpf_map *prog_array;  	struct bpf_program *prog;  	struct bpf_object *obj; -	__u32 retval, duration;  	char prog_name[32]; +	LIBBPF_OPTS(bpf_test_run_opts, topts, +		.data_in = &pkt_v4, +		.data_size_in = sizeof(pkt_v4), +		.repeat = 1, +	);  	err = bpf_prog_test_load("tailcall_bpf2bpf3.o", BPF_PROG_TYPE_SCHED_CLS,  			    &obj, &prog_fd); @@ -681,7 +692,7 @@ static void test_tailcall_bpf2bpf_3(void)  	if (CHECK_FAIL(map_fd < 0))  		goto out; -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		snprintf(prog_name, sizeof(prog_name), "classifier_%d", i);  		prog = bpf_object__find_program_by_name(obj, prog_name); @@ -697,33 +708,27 @@ static void test_tailcall_bpf2bpf_3(void)  			goto out;  	} -	err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != sizeof(pkt_v4) * 3, -	      "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, sizeof(pkt_v4) * 3, "tailcall retval");  	i = 1;  	err = bpf_map_delete_elem(map_fd, &i);  	if (CHECK_FAIL(err))  		goto out; -	err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != sizeof(pkt_v4), -	      "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, sizeof(pkt_v4), "tailcall retval");  	i = 0;  	err = bpf_map_delete_elem(map_fd, &i);  	if (CHECK_FAIL(err))  		goto out; -	err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != sizeof(pkt_v4) * 2, -	      "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, sizeof(pkt_v4) * 2, "tailcall retval");  out:  	bpf_object__close(obj);  } @@ -754,8 +759,12 @@ static void test_tailcall_bpf2bpf_4(bool noise)  	struct bpf_map *prog_array, *data_map;  	struct bpf_program *prog;  	struct bpf_object *obj; -	__u32 retval, duration;  	char prog_name[32]; +	LIBBPF_OPTS(bpf_test_run_opts, topts, +		.data_in = &pkt_v4, +		.data_size_in = sizeof(pkt_v4), +		.repeat = 1, +	);  	err = bpf_prog_test_load("tailcall_bpf2bpf4.o", BPF_PROG_TYPE_SCHED_CLS,  			    &obj, &prog_fd); @@ -778,7 +787,7 @@ static void test_tailcall_bpf2bpf_4(bool noise)  	if (CHECK_FAIL(map_fd < 0))  		goto out; -	for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { +	for (i = 0; i < bpf_map__max_entries(prog_array); i++) {  		snprintf(prog_name, sizeof(prog_name), "classifier_%d", i);  		prog = bpf_object__find_program_by_name(obj, prog_name); @@ -809,15 +818,14 @@ static void test_tailcall_bpf2bpf_4(bool noise)  	if (CHECK_FAIL(err))  		goto out; -	err = bpf_prog_test_run(main_fd, 1, &pkt_v4, sizeof(pkt_v4), 0, -				&duration, &retval, NULL); -	CHECK(err || retval != sizeof(pkt_v4) * 3, "tailcall", "err %d errno %d retval %d\n", -	      err, errno, retval); +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "tailcall"); +	ASSERT_EQ(topts.retval, sizeof(pkt_v4) * 3, "tailcall retval");  	i = 0;  	err = bpf_map_lookup_elem(data_fd, &i, &val); -	CHECK(err || val.count != 31, "tailcall count", "err %d errno %d count %d\n", -	      err, errno, val.count); +	ASSERT_OK(err, "tailcall count"); +	ASSERT_EQ(val.count, 31, "tailcall count");  out:  	bpf_object__close(obj); |