diff options
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests')
4 files changed, 111 insertions, 39 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_cookie.c b/tools/testing/selftests/bpf/prog_tests/bpf_cookie.c index 83ef55e3caa4..2974b44f80fa 100644 --- a/tools/testing/selftests/bpf/prog_tests/bpf_cookie.c +++ b/tools/testing/selftests/bpf/prog_tests/bpf_cookie.c @@ -121,24 +121,24 @@ static void kprobe_multi_link_api_subtest(void)  })  	GET_ADDR("bpf_fentry_test1", addrs[0]); -	GET_ADDR("bpf_fentry_test2", addrs[1]); -	GET_ADDR("bpf_fentry_test3", addrs[2]); -	GET_ADDR("bpf_fentry_test4", addrs[3]); -	GET_ADDR("bpf_fentry_test5", addrs[4]); -	GET_ADDR("bpf_fentry_test6", addrs[5]); -	GET_ADDR("bpf_fentry_test7", addrs[6]); +	GET_ADDR("bpf_fentry_test3", addrs[1]); +	GET_ADDR("bpf_fentry_test4", addrs[2]); +	GET_ADDR("bpf_fentry_test5", addrs[3]); +	GET_ADDR("bpf_fentry_test6", addrs[4]); +	GET_ADDR("bpf_fentry_test7", addrs[5]); +	GET_ADDR("bpf_fentry_test2", addrs[6]);  	GET_ADDR("bpf_fentry_test8", addrs[7]);  #undef GET_ADDR -	cookies[0] = 1; -	cookies[1] = 2; -	cookies[2] = 3; -	cookies[3] = 4; -	cookies[4] = 5; -	cookies[5] = 6; -	cookies[6] = 7; -	cookies[7] = 8; +	cookies[0] = 1; /* bpf_fentry_test1 */ +	cookies[1] = 2; /* bpf_fentry_test3 */ +	cookies[2] = 3; /* bpf_fentry_test4 */ +	cookies[3] = 4; /* bpf_fentry_test5 */ +	cookies[4] = 5; /* bpf_fentry_test6 */ +	cookies[5] = 6; /* bpf_fentry_test7 */ +	cookies[6] = 7; /* bpf_fentry_test2 */ +	cookies[7] = 8; /* bpf_fentry_test8 */  	opts.kprobe_multi.addrs = (const unsigned long *) &addrs;  	opts.kprobe_multi.cnt = ARRAY_SIZE(addrs); @@ -149,14 +149,14 @@ static void kprobe_multi_link_api_subtest(void)  	if (!ASSERT_GE(link1_fd, 0, "link1_fd"))  		goto cleanup; -	cookies[0] = 8; -	cookies[1] = 7; -	cookies[2] = 6; -	cookies[3] = 5; -	cookies[4] = 4; -	cookies[5] = 3; -	cookies[6] = 2; -	cookies[7] = 1; +	cookies[0] = 8; /* bpf_fentry_test1 */ +	cookies[1] = 7; /* bpf_fentry_test3 */ +	cookies[2] = 6; /* bpf_fentry_test4 */ +	cookies[3] = 5; /* bpf_fentry_test5 */ +	cookies[4] = 4; /* bpf_fentry_test6 */ +	cookies[5] = 3; /* bpf_fentry_test7 */ +	cookies[6] = 2; /* bpf_fentry_test2 */ +	cookies[7] = 1; /* bpf_fentry_test8 */  	opts.kprobe_multi.flags = BPF_F_KPROBE_MULTI_RETURN;  	prog_fd = bpf_program__fd(skel->progs.test_kretprobe); @@ -181,12 +181,12 @@ static void kprobe_multi_attach_api_subtest(void)  	struct kprobe_multi *skel = NULL;  	const char *syms[8] = {  		"bpf_fentry_test1", -		"bpf_fentry_test2",  		"bpf_fentry_test3",  		"bpf_fentry_test4",  		"bpf_fentry_test5",  		"bpf_fentry_test6",  		"bpf_fentry_test7", +		"bpf_fentry_test2",  		"bpf_fentry_test8",  	};  	__u64 cookies[8]; @@ -198,14 +198,14 @@ static void kprobe_multi_attach_api_subtest(void)  	skel->bss->pid = getpid();  	skel->bss->test_cookie = true; -	cookies[0] = 1; -	cookies[1] = 2; -	cookies[2] = 3; -	cookies[3] = 4; -	cookies[4] = 5; -	cookies[5] = 6; -	cookies[6] = 7; -	cookies[7] = 8; +	cookies[0] = 1; /* bpf_fentry_test1 */ +	cookies[1] = 2; /* bpf_fentry_test3 */ +	cookies[2] = 3; /* bpf_fentry_test4 */ +	cookies[3] = 4; /* bpf_fentry_test5 */ +	cookies[4] = 5; /* bpf_fentry_test6 */ +	cookies[5] = 6; /* bpf_fentry_test7 */ +	cookies[6] = 7; /* bpf_fentry_test2 */ +	cookies[7] = 8; /* bpf_fentry_test8 */  	opts.syms = syms;  	opts.cnt = ARRAY_SIZE(syms); @@ -216,14 +216,14 @@ static void kprobe_multi_attach_api_subtest(void)  	if (!ASSERT_OK_PTR(link1, "bpf_program__attach_kprobe_multi_opts"))  		goto cleanup; -	cookies[0] = 8; -	cookies[1] = 7; -	cookies[2] = 6; -	cookies[3] = 5; -	cookies[4] = 4; -	cookies[5] = 3; -	cookies[6] = 2; -	cookies[7] = 1; +	cookies[0] = 8; /* bpf_fentry_test1 */ +	cookies[1] = 7; /* bpf_fentry_test3 */ +	cookies[2] = 6; /* bpf_fentry_test4 */ +	cookies[3] = 5; /* bpf_fentry_test5 */ +	cookies[4] = 4; /* bpf_fentry_test6 */ +	cookies[5] = 3; /* bpf_fentry_test7 */ +	cookies[6] = 2; /* bpf_fentry_test2 */ +	cookies[7] = 1; /* bpf_fentry_test8 */  	opts.retprobe = true; diff --git a/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c b/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c index d9aad15e0d24..02bb8cbf9194 100644 --- a/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c +++ b/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c @@ -395,6 +395,18 @@ static void test_func_map_prog_compatibility(void)  				     "./test_attach_probe.o");  } +static void test_func_replace_global_func(void) +{ +	const char *prog_name[] = { +		"freplace/test_pkt_access", +	}; + +	test_fexit_bpf2bpf_common("./freplace_global_func.o", +				  "./test_pkt_access.o", +				  ARRAY_SIZE(prog_name), +				  prog_name, false, NULL); +} +  /* NOTE: affect other tests, must run in serial mode */  void serial_test_fexit_bpf2bpf(void)  { @@ -416,4 +428,6 @@ void serial_test_fexit_bpf2bpf(void)  		test_func_replace_multi();  	if (test__start_subtest("fmod_ret_freplace"))  		test_fmod_ret_freplace(); +	if (test__start_subtest("func_replace_global_func")) +		test_func_replace_global_func();  } diff --git a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c b/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c index 586dc52d6fb9..5b93d5d0bd93 100644 --- a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c +++ b/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c @@ -364,6 +364,9 @@ static int get_syms(char ***symsp, size_t *cntp)  			continue;  		if (!strncmp(name, "rcu_", 4))  			continue; +		if (!strncmp(name, "__ftrace_invalid_address__", +			     sizeof("__ftrace_invalid_address__") - 1)) +			continue;  		err = hashmap__add(map, name, NULL);  		if (err) {  			free(name); diff --git a/tools/testing/selftests/bpf/prog_tests/tailcalls.c b/tools/testing/selftests/bpf/prog_tests/tailcalls.c index c4da87ec3ba4..19c70880cfb3 100644 --- a/tools/testing/selftests/bpf/prog_tests/tailcalls.c +++ b/tools/testing/selftests/bpf/prog_tests/tailcalls.c @@ -831,6 +831,59 @@ out:  	bpf_object__close(obj);  } +#include "tailcall_bpf2bpf6.skel.h" + +/* Tail call counting works even when there is data on stack which is + * not aligned to 8 bytes. + */ +static void test_tailcall_bpf2bpf_6(void) +{ +	struct tailcall_bpf2bpf6 *obj; +	int err, map_fd, prog_fd, main_fd, data_fd, i, val; +	LIBBPF_OPTS(bpf_test_run_opts, topts, +		.data_in = &pkt_v4, +		.data_size_in = sizeof(pkt_v4), +		.repeat = 1, +	); + +	obj = tailcall_bpf2bpf6__open_and_load(); +	if (!ASSERT_OK_PTR(obj, "open and load")) +		return; + +	main_fd = bpf_program__fd(obj->progs.entry); +	if (!ASSERT_GE(main_fd, 0, "entry prog fd")) +		goto out; + +	map_fd = bpf_map__fd(obj->maps.jmp_table); +	if (!ASSERT_GE(map_fd, 0, "jmp_table map fd")) +		goto out; + +	prog_fd = bpf_program__fd(obj->progs.classifier_0); +	if (!ASSERT_GE(prog_fd, 0, "classifier_0 prog fd")) +		goto out; + +	i = 0; +	err = bpf_map_update_elem(map_fd, &i, &prog_fd, BPF_ANY); +	if (!ASSERT_OK(err, "jmp_table map update")) +		goto out; + +	err = bpf_prog_test_run_opts(main_fd, &topts); +	ASSERT_OK(err, "entry prog test run"); +	ASSERT_EQ(topts.retval, 0, "tailcall retval"); + +	data_fd = bpf_map__fd(obj->maps.bss); +	if (!ASSERT_GE(map_fd, 0, "bss map fd")) +		goto out; + +	i = 0; +	err = bpf_map_lookup_elem(data_fd, &i, &val); +	ASSERT_OK(err, "bss map lookup"); +	ASSERT_EQ(val, 1, "done flag is set"); + +out: +	tailcall_bpf2bpf6__destroy(obj); +} +  void test_tailcalls(void)  {  	if (test__start_subtest("tailcall_1")) @@ -855,4 +908,6 @@ void test_tailcalls(void)  		test_tailcall_bpf2bpf_4(false);  	if (test__start_subtest("tailcall_bpf2bpf_5"))  		test_tailcall_bpf2bpf_4(true); +	if (test__start_subtest("tailcall_bpf2bpf_6")) +		test_tailcall_bpf2bpf_6();  }  |