diff options
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests')
75 files changed, 1257 insertions, 359 deletions
| diff --git a/tools/testing/selftests/bpf/prog_tests/atomics.c b/tools/testing/selftests/bpf/prog_tests/atomics.c index ba0e1efe5a45..0f9525293881 100644 --- a/tools/testing/selftests/bpf/prog_tests/atomics.c +++ b/tools/testing/selftests/bpf/prog_tests/atomics.c @@ -4,13 +4,13 @@  #include "atomics.lskel.h" -static void test_add(struct atomics *skel) +static void test_add(struct atomics_lskel *skel)  {  	int err, prog_fd;  	__u32 duration = 0, retval;  	int link_fd; -	link_fd = atomics__add__attach(skel); +	link_fd = atomics_lskel__add__attach(skel);  	if (!ASSERT_GT(link_fd, 0, "attach(add)"))  		return; @@ -36,13 +36,13 @@ cleanup:  	close(link_fd);  } -static void test_sub(struct atomics *skel) +static void test_sub(struct atomics_lskel *skel)  {  	int err, prog_fd;  	__u32 duration = 0, retval;  	int link_fd; -	link_fd = atomics__sub__attach(skel); +	link_fd = atomics_lskel__sub__attach(skel);  	if (!ASSERT_GT(link_fd, 0, "attach(sub)"))  		return; @@ -69,13 +69,13 @@ cleanup:  	close(link_fd);  } -static void test_and(struct atomics *skel) +static void test_and(struct atomics_lskel *skel)  {  	int err, prog_fd;  	__u32 duration = 0, retval;  	int link_fd; -	link_fd = atomics__and__attach(skel); +	link_fd = atomics_lskel__and__attach(skel);  	if (!ASSERT_GT(link_fd, 0, "attach(and)"))  		return; @@ -97,13 +97,13 @@ cleanup:  	close(link_fd);  } -static void test_or(struct atomics *skel) +static void test_or(struct atomics_lskel *skel)  {  	int err, prog_fd;  	__u32 duration = 0, retval;  	int link_fd; -	link_fd = atomics__or__attach(skel); +	link_fd = atomics_lskel__or__attach(skel);  	if (!ASSERT_GT(link_fd, 0, "attach(or)"))  		return; @@ -126,13 +126,13 @@ cleanup:  	close(link_fd);  } -static void test_xor(struct atomics *skel) +static void test_xor(struct atomics_lskel *skel)  {  	int err, prog_fd;  	__u32 duration = 0, retval;  	int link_fd; -	link_fd = atomics__xor__attach(skel); +	link_fd = atomics_lskel__xor__attach(skel);  	if (!ASSERT_GT(link_fd, 0, "attach(xor)"))  		return; @@ -154,13 +154,13 @@ cleanup:  	close(link_fd);  } -static void test_cmpxchg(struct atomics *skel) +static void test_cmpxchg(struct atomics_lskel *skel)  {  	int err, prog_fd;  	__u32 duration = 0, retval;  	int link_fd; -	link_fd = atomics__cmpxchg__attach(skel); +	link_fd = atomics_lskel__cmpxchg__attach(skel);  	if (!ASSERT_GT(link_fd, 0, "attach(cmpxchg)"))  		return; @@ -183,13 +183,13 @@ cleanup:  	close(link_fd);  } -static void test_xchg(struct atomics *skel) +static void test_xchg(struct atomics_lskel *skel)  {  	int err, prog_fd;  	__u32 duration = 0, retval;  	int link_fd; -	link_fd = atomics__xchg__attach(skel); +	link_fd = atomics_lskel__xchg__attach(skel);  	if (!ASSERT_GT(link_fd, 0, "attach(xchg)"))  		return; @@ -212,10 +212,10 @@ cleanup:  void test_atomics(void)  { -	struct atomics *skel; +	struct atomics_lskel *skel;  	__u32 duration = 0; -	skel = atomics__open_and_load(); +	skel = atomics_lskel__open_and_load();  	if (CHECK(!skel, "skel_load", "atomics skeleton failed\n"))  		return; @@ -225,6 +225,7 @@ void test_atomics(void)  		test__skip();  		goto cleanup;  	} +	skel->bss->pid = getpid();  	if (test__start_subtest("add"))  		test_add(skel); @@ -242,5 +243,5 @@ void test_atomics(void)  		test_xchg(skel);  cleanup: -	atomics__destroy(skel); +	atomics_lskel__destroy(skel);  } diff --git a/tools/testing/selftests/bpf/prog_tests/attach_probe.c b/tools/testing/selftests/bpf/prog_tests/attach_probe.c index 6c511dcd1465..d0bd51eb23c8 100644 --- a/tools/testing/selftests/bpf/prog_tests/attach_probe.c +++ b/tools/testing/selftests/bpf/prog_tests/attach_probe.c @@ -5,6 +5,11 @@  /* this is how USDT semaphore is actually defined, except volatile modifier */  volatile unsigned short uprobe_ref_ctr __attribute__((unused)) __attribute((section(".probes"))); +/* attach point */ +static void method(void) { +	return ; +} +  void test_attach_probe(void)  {  	DECLARE_LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); @@ -33,7 +38,7 @@ void test_attach_probe(void)  	if (CHECK(base_addr < 0, "get_base_addr",  		  "failed to find base addr: %zd", base_addr))  		return; -	uprobe_offset = get_uprobe_offset(&get_base_addr, base_addr); +	uprobe_offset = get_uprobe_offset(&method, base_addr);  	ref_ctr_offset = get_rel_offset((uintptr_t)&uprobe_ref_ctr);  	if (!ASSERT_GE(ref_ctr_offset, 0, "ref_ctr_offset")) @@ -98,7 +103,7 @@ void test_attach_probe(void)  		goto cleanup;  	/* trigger & validate uprobe & uretprobe */ -	get_base_addr(); +	method();  	if (CHECK(skel->bss->uprobe_res != 3, "check_uprobe_res",  		  "wrong uprobe res: %d\n", skel->bss->uprobe_res)) diff --git a/tools/testing/selftests/bpf/prog_tests/bloom_filter_map.c b/tools/testing/selftests/bpf/prog_tests/bloom_filter_map.c new file mode 100644 index 000000000000..be73e3de6668 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/bloom_filter_map.c @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2021 Facebook */ + +#include <sys/syscall.h> +#include <test_progs.h> +#include "bloom_filter_map.skel.h" + +static void test_fail_cases(void) +{ +	__u32 value; +	int fd, err; + +	/* Invalid key size */ +	fd = bpf_create_map(BPF_MAP_TYPE_BLOOM_FILTER, 4, sizeof(value), 100, 0); +	if (!ASSERT_LT(fd, 0, "bpf_create_map bloom filter invalid key size")) +		close(fd); + +	/* Invalid value size */ +	fd = bpf_create_map(BPF_MAP_TYPE_BLOOM_FILTER, 0, 0, 100, 0); +	if (!ASSERT_LT(fd, 0, "bpf_create_map bloom filter invalid value size 0")) +		close(fd); + +	/* Invalid max entries size */ +	fd = bpf_create_map(BPF_MAP_TYPE_BLOOM_FILTER, 0, sizeof(value), 0, 0); +	if (!ASSERT_LT(fd, 0, "bpf_create_map bloom filter invalid max entries size")) +		close(fd); + +	/* Bloom filter maps do not support BPF_F_NO_PREALLOC */ +	fd = bpf_create_map(BPF_MAP_TYPE_BLOOM_FILTER, 0, sizeof(value), 100, +			    BPF_F_NO_PREALLOC); +	if (!ASSERT_LT(fd, 0, "bpf_create_map bloom filter invalid flags")) +		close(fd); + +	fd = bpf_create_map(BPF_MAP_TYPE_BLOOM_FILTER, 0, sizeof(value), 100, 0); +	if (!ASSERT_GE(fd, 0, "bpf_create_map bloom filter")) +		return; + +	/* Test invalid flags */ +	err = bpf_map_update_elem(fd, NULL, &value, -1); +	ASSERT_EQ(err, -EINVAL, "bpf_map_update_elem bloom filter invalid flags"); + +	err = bpf_map_update_elem(fd, NULL, &value, BPF_EXIST); +	ASSERT_EQ(err, -EINVAL, "bpf_map_update_elem bloom filter invalid flags"); + +	err = bpf_map_update_elem(fd, NULL, &value, BPF_F_LOCK); +	ASSERT_EQ(err, -EINVAL, "bpf_map_update_elem bloom filter invalid flags"); + +	err = bpf_map_update_elem(fd, NULL, &value, BPF_NOEXIST); +	ASSERT_EQ(err, -EINVAL, "bpf_map_update_elem bloom filter invalid flags"); + +	err = bpf_map_update_elem(fd, NULL, &value, 10000); +	ASSERT_EQ(err, -EINVAL, "bpf_map_update_elem bloom filter invalid flags"); + +	close(fd); +} + +static void test_success_cases(void) +{ +	char value[11]; +	int fd, err; + +	/* Create a map */ +	fd = bpf_create_map(BPF_MAP_TYPE_BLOOM_FILTER, 0, sizeof(value), 100, +			    BPF_F_ZERO_SEED | BPF_F_NUMA_NODE); +	if (!ASSERT_GE(fd, 0, "bpf_create_map bloom filter success case")) +		return; + +	/* Add a value to the bloom filter */ +	err = bpf_map_update_elem(fd, NULL, &value, 0); +	if (!ASSERT_OK(err, "bpf_map_update_elem bloom filter success case")) +		goto done; + +	 /* Lookup a value in the bloom filter */ +	err = bpf_map_lookup_elem(fd, NULL, &value); +	ASSERT_OK(err, "bpf_map_update_elem bloom filter success case"); + +done: +	close(fd); +} + +static void check_bloom(struct bloom_filter_map *skel) +{ +	struct bpf_link *link; + +	link = bpf_program__attach(skel->progs.check_bloom); +	if (!ASSERT_OK_PTR(link, "link")) +		return; + +	syscall(SYS_getpgid); + +	ASSERT_EQ(skel->bss->error, 0, "error"); + +	bpf_link__destroy(link); +} + +static void test_inner_map(struct bloom_filter_map *skel, const __u32 *rand_vals, +			   __u32 nr_rand_vals) +{ +	int outer_map_fd, inner_map_fd, err, i, key = 0; +	struct bpf_link *link; + +	/* Create a bloom filter map that will be used as the inner map */ +	inner_map_fd = bpf_create_map(BPF_MAP_TYPE_BLOOM_FILTER, 0, sizeof(*rand_vals), +				      nr_rand_vals, 0); +	if (!ASSERT_GE(inner_map_fd, 0, "bpf_create_map bloom filter inner map")) +		return; + +	for (i = 0; i < nr_rand_vals; i++) { +		err = bpf_map_update_elem(inner_map_fd, NULL, rand_vals + i, BPF_ANY); +		if (!ASSERT_OK(err, "Add random value to inner_map_fd")) +			goto done; +	} + +	/* Add the bloom filter map to the outer map */ +	outer_map_fd = bpf_map__fd(skel->maps.outer_map); +	err = bpf_map_update_elem(outer_map_fd, &key, &inner_map_fd, BPF_ANY); +	if (!ASSERT_OK(err, "Add bloom filter map to outer map")) +		goto done; + +	/* Attach the bloom_filter_inner_map prog */ +	link = bpf_program__attach(skel->progs.inner_map); +	if (!ASSERT_OK_PTR(link, "link")) +		goto delete_inner_map; + +	syscall(SYS_getpgid); + +	ASSERT_EQ(skel->bss->error, 0, "error"); + +	bpf_link__destroy(link); + +delete_inner_map: +	/* Ensure the inner bloom filter map can be deleted */ +	err = bpf_map_delete_elem(outer_map_fd, &key); +	ASSERT_OK(err, "Delete inner bloom filter map"); + +done: +	close(inner_map_fd); +} + +static int setup_progs(struct bloom_filter_map **out_skel, __u32 **out_rand_vals, +		       __u32 *out_nr_rand_vals) +{ +	struct bloom_filter_map *skel; +	int random_data_fd, bloom_fd; +	__u32 *rand_vals = NULL; +	__u32 map_size, val; +	int err, i; + +	/* Set up a bloom filter map skeleton */ +	skel = bloom_filter_map__open_and_load(); +	if (!ASSERT_OK_PTR(skel, "bloom_filter_map__open_and_load")) +		return -EINVAL; + +	/* Set up rand_vals */ +	map_size = bpf_map__max_entries(skel->maps.map_random_data); +	rand_vals = malloc(sizeof(*rand_vals) * map_size); +	if (!rand_vals) { +		err = -ENOMEM; +		goto error; +	} + +	/* Generate random values and populate both skeletons */ +	random_data_fd = bpf_map__fd(skel->maps.map_random_data); +	bloom_fd = bpf_map__fd(skel->maps.map_bloom); +	for (i = 0; i < map_size; i++) { +		val = rand(); + +		err = bpf_map_update_elem(random_data_fd, &i, &val, BPF_ANY); +		if (!ASSERT_OK(err, "Add random value to map_random_data")) +			goto error; + +		err = bpf_map_update_elem(bloom_fd, NULL, &val, BPF_ANY); +		if (!ASSERT_OK(err, "Add random value to map_bloom")) +			goto error; + +		rand_vals[i] = val; +	} + +	*out_skel = skel; +	*out_rand_vals = rand_vals; +	*out_nr_rand_vals = map_size; + +	return 0; + +error: +	bloom_filter_map__destroy(skel); +	if (rand_vals) +		free(rand_vals); +	return err; +} + +void test_bloom_filter_map(void) +{ +	__u32 *rand_vals, nr_rand_vals; +	struct bloom_filter_map *skel; +	int err; + +	test_fail_cases(); +	test_success_cases(); + +	err = setup_progs(&skel, &rand_vals, &nr_rand_vals); +	if (err) +		return; + +	test_inner_map(skel, rand_vals, nr_rand_vals); +	free(rand_vals); + +	check_bloom(skel); + +	bloom_filter_map__destroy(skel); +} diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_iter_setsockopt.c b/tools/testing/selftests/bpf/prog_tests/bpf_iter_setsockopt.c index 85babb0487b3..b52ff8ce34db 100644 --- a/tools/testing/selftests/bpf/prog_tests/bpf_iter_setsockopt.c +++ b/tools/testing/selftests/bpf/prog_tests/bpf_iter_setsockopt.c @@ -179,7 +179,7 @@ done:  	free_fds(est_fds, nr_est);  } -void test_bpf_iter_setsockopt(void) +void serial_test_bpf_iter_setsockopt(void)  {  	struct bpf_iter_setsockopt *iter_skel = NULL;  	struct bpf_cubic *cubic_skel = NULL; diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_obj_id.c b/tools/testing/selftests/bpf/prog_tests/bpf_obj_id.c index 284d5921c345..eb8eeebe6935 100644 --- a/tools/testing/selftests/bpf/prog_tests/bpf_obj_id.c +++ b/tools/testing/selftests/bpf/prog_tests/bpf_obj_id.c @@ -3,7 +3,7 @@  #define nr_iters 2 -void test_bpf_obj_id(void) +void serial_test_bpf_obj_id(void)  {  	const __u64 array_magic_value = 0xfaceb00c;  	const __u32 array_key = 0; diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_verif_scale.c b/tools/testing/selftests/bpf/prog_tests/bpf_verif_scale.c index 3d002c245d2b..27f5d8ea7964 100644 --- a/tools/testing/selftests/bpf/prog_tests/bpf_verif_scale.c +++ b/tools/testing/selftests/bpf/prog_tests/bpf_verif_scale.c @@ -39,82 +39,171 @@ struct scale_test_def {  	bool fails;  }; -void test_bpf_verif_scale(void) -{ -	struct scale_test_def tests[] = { -		{ "loop3.o", BPF_PROG_TYPE_RAW_TRACEPOINT, true /* fails */ }, - -		{ "test_verif_scale1.o", BPF_PROG_TYPE_SCHED_CLS }, -		{ "test_verif_scale2.o", BPF_PROG_TYPE_SCHED_CLS }, -		{ "test_verif_scale3.o", BPF_PROG_TYPE_SCHED_CLS }, - -		{ "pyperf_global.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, -		{ "pyperf_subprogs.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, - -		/* full unroll by llvm */ -		{ "pyperf50.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, -		{ "pyperf100.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, -		{ "pyperf180.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, - -		/* partial unroll. llvm will unroll loop ~150 times. -		 * C loop count -> 600. -		 * Asm loop count -> 4. -		 * 16k insns in loop body. -		 * Total of 5 such loops. Total program size ~82k insns. -		 */ -		{ "pyperf600.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, - -		/* no unroll at all. -		 * C loop count -> 600. -		 * ASM loop count -> 600. -		 * ~110 insns in loop body. -		 * Total of 5 such loops. Total program size ~1500 insns. -		 */ -		{ "pyperf600_nounroll.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, - -		{ "loop1.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, -		{ "loop2.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, -		{ "loop4.o", BPF_PROG_TYPE_SCHED_CLS }, -		{ "loop5.o", BPF_PROG_TYPE_SCHED_CLS }, -		{ "loop6.o", BPF_PROG_TYPE_KPROBE }, - -		/* partial unroll. 19k insn in a loop. -		 * Total program size 20.8k insn. -		 * ~350k processed_insns -		 */ -		{ "strobemeta.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, - -		/* no unroll, tiny loops */ -		{ "strobemeta_nounroll1.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, -		{ "strobemeta_nounroll2.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, - -		/* non-inlined subprogs */ -		{ "strobemeta_subprogs.o", BPF_PROG_TYPE_RAW_TRACEPOINT }, - -		{ "test_sysctl_loop1.o", BPF_PROG_TYPE_CGROUP_SYSCTL }, -		{ "test_sysctl_loop2.o", BPF_PROG_TYPE_CGROUP_SYSCTL }, - -		{ "test_xdp_loop.o", BPF_PROG_TYPE_XDP }, -		{ "test_seg6_loop.o", BPF_PROG_TYPE_LWT_SEG6LOCAL }, -	}; +static void scale_test(const char *file, +		       enum bpf_prog_type attach_type, +		       bool should_fail) +{  	libbpf_print_fn_t old_print_fn = NULL; -	int err, i; +	int err;  	if (env.verifier_stats) {  		test__force_log();  		old_print_fn = libbpf_set_print(libbpf_debug_print);  	} -	for (i = 0; i < ARRAY_SIZE(tests); i++) { -		const struct scale_test_def *test = &tests[i]; - -		if (!test__start_subtest(test->file)) -			continue; - -		err = check_load(test->file, test->attach_type); -		CHECK_FAIL(err && !test->fails); -	} +	err = check_load(file, attach_type); +	if (should_fail) +		ASSERT_ERR(err, "expect_error"); +	else +		ASSERT_OK(err, "expect_success");  	if (env.verifier_stats)  		libbpf_set_print(old_print_fn);  } + +void test_verif_scale1() +{ +	scale_test("test_verif_scale1.o", BPF_PROG_TYPE_SCHED_CLS, false); +} + +void test_verif_scale2() +{ +	scale_test("test_verif_scale2.o", BPF_PROG_TYPE_SCHED_CLS, false); +} + +void test_verif_scale3() +{ +	scale_test("test_verif_scale3.o", BPF_PROG_TYPE_SCHED_CLS, false); +} + +void test_verif_scale_pyperf_global() +{ +	scale_test("pyperf_global.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_pyperf_subprogs() +{ +	scale_test("pyperf_subprogs.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_pyperf50() +{ +	/* full unroll by llvm */ +	scale_test("pyperf50.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_pyperf100() +{ +	/* full unroll by llvm */ +	scale_test("pyperf100.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_pyperf180() +{ +	/* full unroll by llvm */ +	scale_test("pyperf180.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_pyperf600() +{ +	/* partial unroll. llvm will unroll loop ~150 times. +	 * C loop count -> 600. +	 * Asm loop count -> 4. +	 * 16k insns in loop body. +	 * Total of 5 such loops. Total program size ~82k insns. +	 */ +	scale_test("pyperf600.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_pyperf600_nounroll() +{ +	/* no unroll at all. +	 * C loop count -> 600. +	 * ASM loop count -> 600. +	 * ~110 insns in loop body. +	 * Total of 5 such loops. Total program size ~1500 insns. +	 */ +	scale_test("pyperf600_nounroll.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_loop1() +{ +	scale_test("loop1.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_loop2() +{ +	scale_test("loop2.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_loop3_fail() +{ +	scale_test("loop3.o", BPF_PROG_TYPE_RAW_TRACEPOINT, true /* fails */); +} + +void test_verif_scale_loop4() +{ +	scale_test("loop4.o", BPF_PROG_TYPE_SCHED_CLS, false); +} + +void test_verif_scale_loop5() +{ +	scale_test("loop5.o", BPF_PROG_TYPE_SCHED_CLS, false); +} + +void test_verif_scale_loop6() +{ +	scale_test("loop6.o", BPF_PROG_TYPE_KPROBE, false); +} + +void test_verif_scale_strobemeta() +{ +	/* partial unroll. 19k insn in a loop. +	 * Total program size 20.8k insn. +	 * ~350k processed_insns +	 */ +	scale_test("strobemeta.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_strobemeta_nounroll1() +{ +	/* no unroll, tiny loops */ +	scale_test("strobemeta_nounroll1.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_strobemeta_nounroll2() +{ +	/* no unroll, tiny loops */ +	scale_test("strobemeta_nounroll2.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_strobemeta_subprogs() +{ +	/* non-inlined subprogs */ +	scale_test("strobemeta_subprogs.o", BPF_PROG_TYPE_RAW_TRACEPOINT, false); +} + +void test_verif_scale_sysctl_loop1() +{ +	scale_test("test_sysctl_loop1.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false); +} + +void test_verif_scale_sysctl_loop2() +{ +	scale_test("test_sysctl_loop2.o", BPF_PROG_TYPE_CGROUP_SYSCTL, false); +} + +void test_verif_scale_xdp_loop() +{ +	scale_test("test_xdp_loop.o", BPF_PROG_TYPE_XDP, false); +} + +void test_verif_scale_seg6_loop() +{ +	scale_test("test_seg6_loop.o", BPF_PROG_TYPE_LWT_SEG6LOCAL, false); +} + +void test_verif_twfw() +{ +	scale_test("twfw.o", BPF_PROG_TYPE_CGROUP_SKB, false); +} diff --git a/tools/testing/selftests/bpf/prog_tests/btf.c b/tools/testing/selftests/bpf/prog_tests/btf.c index 9c85d7d27409..ac596cb06e40 100644 --- a/tools/testing/selftests/bpf/prog_tests/btf.c +++ b/tools/testing/selftests/bpf/prog_tests/btf.c @@ -3662,15 +3662,15 @@ static struct btf_raw_test raw_tests[] = {  },  { -	.descr = "tag test #1, struct/member, well-formed", +	.descr = "decl_tag test #1, struct/member, well-formed",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */  		BTF_STRUCT_ENC(0, 2, 8),			/* [2] */  		BTF_MEMBER_ENC(NAME_TBD, 1, 0),  		BTF_MEMBER_ENC(NAME_TBD, 1, 32), -		BTF_TAG_ENC(NAME_TBD, 2, -1), -		BTF_TAG_ENC(NAME_TBD, 2, 0), -		BTF_TAG_ENC(NAME_TBD, 2, 1), +		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1), +		BTF_DECL_TAG_ENC(NAME_TBD, 2, 0), +		BTF_DECL_TAG_ENC(NAME_TBD, 2, 1),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0m1\0m2\0tag1\0tag2\0tag3"), @@ -3683,15 +3683,15 @@ static struct btf_raw_test raw_tests[] = {  	.max_entries = 1,  },  { -	.descr = "tag test #2, union/member, well-formed", +	.descr = "decl_tag test #2, union/member, well-formed",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */  		BTF_UNION_ENC(NAME_TBD, 2, 4),			/* [2] */  		BTF_MEMBER_ENC(NAME_TBD, 1, 0),  		BTF_MEMBER_ENC(NAME_TBD, 1, 0), -		BTF_TAG_ENC(NAME_TBD, 2, -1), -		BTF_TAG_ENC(NAME_TBD, 2, 0), -		BTF_TAG_ENC(NAME_TBD, 2, 1), +		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1), +		BTF_DECL_TAG_ENC(NAME_TBD, 2, 0), +		BTF_DECL_TAG_ENC(NAME_TBD, 2, 1),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"), @@ -3704,13 +3704,13 @@ static struct btf_raw_test raw_tests[] = {  	.max_entries = 1,  },  { -	.descr = "tag test #3, variable, well-formed", +	.descr = "decl_tag test #3, variable, well-formed",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */  		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */  		BTF_VAR_ENC(NAME_TBD, 1, 1),			/* [3] */ -		BTF_TAG_ENC(NAME_TBD, 2, -1), -		BTF_TAG_ENC(NAME_TBD, 3, -1), +		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1), +		BTF_DECL_TAG_ENC(NAME_TBD, 3, -1),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0local\0global\0tag1\0tag2"), @@ -3723,16 +3723,16 @@ static struct btf_raw_test raw_tests[] = {  	.max_entries = 1,  },  { -	.descr = "tag test #4, func/parameter, well-formed", +	.descr = "decl_tag test #4, func/parameter, well-formed",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */  		BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */  			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),  			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),  		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */ -		BTF_TAG_ENC(NAME_TBD, 3, -1), -		BTF_TAG_ENC(NAME_TBD, 3, 0), -		BTF_TAG_ENC(NAME_TBD, 3, 1), +		BTF_DECL_TAG_ENC(NAME_TBD, 3, -1), +		BTF_DECL_TAG_ENC(NAME_TBD, 3, 0), +		BTF_DECL_TAG_ENC(NAME_TBD, 3, 1),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0arg1\0arg2\0f\0tag1\0tag2\0tag3"), @@ -3745,11 +3745,11 @@ static struct btf_raw_test raw_tests[] = {  	.max_entries = 1,  },  { -	.descr = "tag test #5, invalid value", +	.descr = "decl_tag test #5, invalid value",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */  		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */ -		BTF_TAG_ENC(0, 2, -1), +		BTF_DECL_TAG_ENC(0, 2, -1),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0local\0tag"), @@ -3764,10 +3764,10 @@ static struct btf_raw_test raw_tests[] = {  	.err_str = "Invalid value",  },  { -	.descr = "tag test #6, invalid target type", +	.descr = "decl_tag test #6, invalid target type",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */ -		BTF_TAG_ENC(NAME_TBD, 1, -1), +		BTF_DECL_TAG_ENC(NAME_TBD, 1, -1),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0tag1"), @@ -3782,11 +3782,11 @@ static struct btf_raw_test raw_tests[] = {  	.err_str = "Invalid type",  },  { -	.descr = "tag test #7, invalid vlen", +	.descr = "decl_tag test #7, invalid vlen",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */  		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */ -		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_TAG, 0, 1), 2), (0), +		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 0, 1), 2), (0),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0local\0tag1"), @@ -3801,11 +3801,11 @@ static struct btf_raw_test raw_tests[] = {  	.err_str = "vlen != 0",  },  { -	.descr = "tag test #8, invalid kflag", +	.descr = "decl_tag test #8, invalid kflag",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */  		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */ -		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_TAG, 1, 0), 2), (-1), +		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 1, 0), 2), (-1),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0local\0tag1"), @@ -3820,11 +3820,11 @@ static struct btf_raw_test raw_tests[] = {  	.err_str = "Invalid btf_info kind_flag",  },  { -	.descr = "tag test #9, var, invalid component_idx", +	.descr = "decl_tag test #9, var, invalid component_idx",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */  		BTF_VAR_ENC(NAME_TBD, 1, 0),			/* [2] */ -		BTF_TAG_ENC(NAME_TBD, 2, 0), +		BTF_DECL_TAG_ENC(NAME_TBD, 2, 0),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0local\0tag"), @@ -3839,13 +3839,13 @@ static struct btf_raw_test raw_tests[] = {  	.err_str = "Invalid component_idx",  },  { -	.descr = "tag test #10, struct member, invalid component_idx", +	.descr = "decl_tag test #10, struct member, invalid component_idx",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */  		BTF_STRUCT_ENC(0, 2, 8),			/* [2] */  		BTF_MEMBER_ENC(NAME_TBD, 1, 0),  		BTF_MEMBER_ENC(NAME_TBD, 1, 32), -		BTF_TAG_ENC(NAME_TBD, 2, 2), +		BTF_DECL_TAG_ENC(NAME_TBD, 2, 2),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0m1\0m2\0tag"), @@ -3860,14 +3860,14 @@ static struct btf_raw_test raw_tests[] = {  	.err_str = "Invalid component_idx",  },  { -	.descr = "tag test #11, func parameter, invalid component_idx", +	.descr = "decl_tag test #11, func parameter, invalid component_idx",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */  		BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */  			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),  			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),  		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */ -		BTF_TAG_ENC(NAME_TBD, 3, 2), +		BTF_DECL_TAG_ENC(NAME_TBD, 3, 2),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0arg1\0arg2\0f\0tag"), @@ -3882,14 +3882,14 @@ static struct btf_raw_test raw_tests[] = {  	.err_str = "Invalid component_idx",  },  { -	.descr = "tag test #12, < -1 component_idx", +	.descr = "decl_tag test #12, < -1 component_idx",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */  		BTF_FUNC_PROTO_ENC(0, 2),			/* [2] */  			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),  			BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 1),  		BTF_FUNC_ENC(NAME_TBD, 2),			/* [3] */ -		BTF_TAG_ENC(NAME_TBD, 3, -2), +		BTF_DECL_TAG_ENC(NAME_TBD, 3, -2),  		BTF_END_RAW,  	},  	BTF_STR_SEC("\0arg1\0arg2\0f\0tag"), @@ -3903,6 +3903,42 @@ static struct btf_raw_test raw_tests[] = {  	.btf_load_err = true,  	.err_str = "Invalid component_idx",  }, +{ +	.descr = "decl_tag test #13, typedef, well-formed", +	.raw_types = { +		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */ +		BTF_TYPEDEF_ENC(NAME_TBD, 1),			/* [2] */ +		BTF_DECL_TAG_ENC(NAME_TBD, 2, -1), +		BTF_END_RAW, +	}, +	BTF_STR_SEC("\0t\0tag"), +	.map_type = BPF_MAP_TYPE_ARRAY, +	.map_name = "tag_type_check_btf", +	.key_size = sizeof(int), +	.value_size = 4, +	.key_type_id = 1, +	.value_type_id = 1, +	.max_entries = 1, +}, +{ +	.descr = "decl_tag test #14, typedef, invalid component_idx", +	.raw_types = { +		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */ +		BTF_TYPEDEF_ENC(NAME_TBD, 1),			/* [2] */ +		BTF_DECL_TAG_ENC(NAME_TBD, 2, 0), +		BTF_END_RAW, +	}, +	BTF_STR_SEC("\0local\0tag"), +	.map_type = BPF_MAP_TYPE_ARRAY, +	.map_name = "tag_type_check_btf", +	.key_size = sizeof(int), +	.value_size = 4, +	.key_type_id = 1, +	.value_type_id = 1, +	.max_entries = 1, +	.btf_load_err = true, +	.err_str = "Invalid component_idx", +},  }; /* struct btf_raw_test raw_tests[] */ @@ -4511,7 +4547,7 @@ static void do_test_file(unsigned int test_num)  	if (CHECK(err, "obj: %d", err))  		return; -	prog = bpf_program__next(NULL, obj); +	prog = bpf_object__next_program(obj, NULL);  	if (CHECK(!prog, "Cannot find bpf_prog")) {  		err = -1;  		goto done; @@ -6672,9 +6708,9 @@ const struct btf_dedup_test dedup_tests[] = {  			/* const -> [1] int */  			BTF_CONST_ENC(1),						/* [6] */  			/* tag -> [3] struct s */ -			BTF_TAG_ENC(NAME_NTH(2), 3, -1),				/* [7] */ +			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1),				/* [7] */  			/* tag -> [3] struct s, member 1 */ -			BTF_TAG_ENC(NAME_NTH(2), 3, 1),					/* [8] */ +			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, 1),				/* [8] */  			/* full copy of the above */  			BTF_TYPE_INT_ENC(NAME_NTH(1), BTF_INT_SIGNED, 0, 32, 4),	/* [9] */ @@ -6689,8 +6725,8 @@ const struct btf_dedup_test dedup_tests[] = {  			BTF_PTR_ENC(14),						/* [13] */  			BTF_CONST_ENC(9),						/* [14] */  			BTF_TYPE_FLOAT_ENC(NAME_NTH(7), 4),				/* [15] */ -			BTF_TAG_ENC(NAME_NTH(2), 11, -1),				/* [16] */ -			BTF_TAG_ENC(NAME_NTH(2), 11, 1),				/* [17] */ +			BTF_DECL_TAG_ENC(NAME_NTH(2), 11, -1),				/* [16] */ +			BTF_DECL_TAG_ENC(NAME_NTH(2), 11, 1),				/* [17] */  			BTF_END_RAW,  		},  		BTF_STR_SEC("\0int\0s\0next\0a\0b\0c\0float\0d"), @@ -6714,8 +6750,8 @@ const struct btf_dedup_test dedup_tests[] = {  			BTF_PTR_ENC(6),							/* [5] */  			/* const -> [1] int */  			BTF_CONST_ENC(1),						/* [6] */ -			BTF_TAG_ENC(NAME_NTH(2), 3, -1),				/* [7] */ -			BTF_TAG_ENC(NAME_NTH(2), 3, 1),					/* [8] */ +			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1),				/* [7] */ +			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, 1),				/* [8] */  			BTF_TYPE_FLOAT_ENC(NAME_NTH(7), 4),				/* [9] */  			BTF_END_RAW,  		}, @@ -6841,11 +6877,12 @@ const struct btf_dedup_test dedup_tests[] = {  				BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 8),  			BTF_FUNC_ENC(NAME_TBD, 12),					/* [13] func */  			BTF_TYPE_FLOAT_ENC(NAME_TBD, 2),				/* [14] float */ -			BTF_TAG_ENC(NAME_TBD, 13, -1),					/* [15] tag */ -			BTF_TAG_ENC(NAME_TBD, 13, 1),					/* [16] tag */ +			BTF_DECL_TAG_ENC(NAME_TBD, 13, -1),				/* [15] decl_tag */ +			BTF_DECL_TAG_ENC(NAME_TBD, 13, 1),				/* [16] decl_tag */ +			BTF_DECL_TAG_ENC(NAME_TBD, 7, -1),				/* [17] decl_tag */  			BTF_END_RAW,  		}, -		BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P"), +		BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q"),  	},  	.expect = {  		.raw_types = { @@ -6869,11 +6906,12 @@ const struct btf_dedup_test dedup_tests[] = {  				BTF_FUNC_PROTO_ARG_ENC(NAME_TBD, 8),  			BTF_FUNC_ENC(NAME_TBD, 12),					/* [13] func */  			BTF_TYPE_FLOAT_ENC(NAME_TBD, 2),				/* [14] float */ -			BTF_TAG_ENC(NAME_TBD, 13, -1),					/* [15] tag */ -			BTF_TAG_ENC(NAME_TBD, 13, 1),					/* [16] tag */ +			BTF_DECL_TAG_ENC(NAME_TBD, 13, -1),				/* [15] decl_tag */ +			BTF_DECL_TAG_ENC(NAME_TBD, 13, 1),				/* [16] decl_tag */ +			BTF_DECL_TAG_ENC(NAME_TBD, 7, -1),				/* [17] decl_tag */  			BTF_END_RAW,  		}, -		BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P"), +		BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q"),  	},  	.opts = {  		.dont_resolve_fwds = false, @@ -7036,14 +7074,14 @@ const struct btf_dedup_test dedup_tests[] = {  				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(3), 1),  			BTF_FUNC_ENC(NAME_NTH(4), 2),			/* [4] */  			/* tag -> t */ -			BTF_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */ -			BTF_TAG_ENC(NAME_NTH(5), 2, -1),		/* [6] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [6] */  			/* tag -> func */ -			BTF_TAG_ENC(NAME_NTH(5), 4, -1),		/* [7] */ -			BTF_TAG_ENC(NAME_NTH(5), 4, -1),		/* [8] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1),		/* [7] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1),		/* [8] */  			/* tag -> func arg a1 */ -			BTF_TAG_ENC(NAME_NTH(5), 4, 1),			/* [9] */ -			BTF_TAG_ENC(NAME_NTH(5), 4, 1),			/* [10] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1),		/* [9] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1),		/* [10] */  			BTF_END_RAW,  		},  		BTF_STR_SEC("\0t\0a1\0a2\0f\0tag"), @@ -7056,9 +7094,9 @@ const struct btf_dedup_test dedup_tests[] = {  				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),  				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(3), 1),  			BTF_FUNC_ENC(NAME_NTH(4), 2),			/* [4] */ -			BTF_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */ -			BTF_TAG_ENC(NAME_NTH(5), 4, -1),		/* [6] */ -			BTF_TAG_ENC(NAME_NTH(5), 4, 1),			/* [7] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, -1),		/* [6] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 4, 1),		/* [7] */  			BTF_END_RAW,  		},  		BTF_STR_SEC("\0t\0a1\0a2\0f\0tag"), @@ -7084,17 +7122,17 @@ const struct btf_dedup_test dedup_tests[] = {  				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),  			BTF_FUNC_ENC(NAME_NTH(3), 4),			/* [5] */  			/* tag -> f: tag1, tag2 */ -			BTF_TAG_ENC(NAME_NTH(4), 3, -1),		/* [6] */ -			BTF_TAG_ENC(NAME_NTH(5), 3, -1),		/* [7] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1),		/* [6] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, -1),		/* [7] */  			/* tag -> f/a2: tag1, tag2 */ -			BTF_TAG_ENC(NAME_NTH(4), 3, 1),			/* [8] */ -			BTF_TAG_ENC(NAME_NTH(5), 3, 1),			/* [9] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1),		/* [8] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, 1),		/* [9] */  			/* tag -> f: tag1, tag3 */ -			BTF_TAG_ENC(NAME_NTH(4), 5, -1),		/* [10] */ -			BTF_TAG_ENC(NAME_NTH(6), 5, -1),		/* [11] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 5, -1),		/* [10] */ +			BTF_DECL_TAG_ENC(NAME_NTH(6), 5, -1),		/* [11] */  			/* tag -> f/a2: tag1, tag3 */ -			BTF_TAG_ENC(NAME_NTH(4), 5, 1),			/* [12] */ -			BTF_TAG_ENC(NAME_NTH(6), 5, 1),			/* [13] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 5, 1),		/* [12] */ +			BTF_DECL_TAG_ENC(NAME_NTH(6), 5, 1),		/* [13] */  			BTF_END_RAW,  		},  		BTF_STR_SEC("\0a1\0a2\0f\0tag1\0tag2\0tag3"), @@ -7106,12 +7144,12 @@ const struct btf_dedup_test dedup_tests[] = {  				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(1), 1),  				BTF_FUNC_PROTO_ARG_ENC(NAME_NTH(2), 1),  			BTF_FUNC_ENC(NAME_NTH(3), 2),			/* [3] */ -			BTF_TAG_ENC(NAME_NTH(4), 3, -1),		/* [4] */ -			BTF_TAG_ENC(NAME_NTH(5), 3, -1),		/* [5] */ -			BTF_TAG_ENC(NAME_NTH(6), 3, -1),		/* [6] */ -			BTF_TAG_ENC(NAME_NTH(4), 3, 1),			/* [7] */ -			BTF_TAG_ENC(NAME_NTH(5), 3, 1),			/* [8] */ -			BTF_TAG_ENC(NAME_NTH(6), 3, 1),			/* [9] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1),		/* [4] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, -1),		/* [5] */ +			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, -1),		/* [6] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1),		/* [7] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 3, 1),		/* [8] */ +			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, 1),		/* [9] */  			BTF_END_RAW,  		},  		BTF_STR_SEC("\0a1\0a2\0f\0tag1\0tag2\0tag3"), @@ -7133,17 +7171,17 @@ const struct btf_dedup_test dedup_tests[] = {  				BTF_MEMBER_ENC(NAME_NTH(2), 1, 0),  				BTF_MEMBER_ENC(NAME_NTH(3), 1, 32),  			/* tag -> t: tag1, tag2 */ -			BTF_TAG_ENC(NAME_NTH(4), 2, -1),		/* [4] */ -			BTF_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1),		/* [4] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [5] */  			/* tag -> t/m2: tag1, tag2 */ -			BTF_TAG_ENC(NAME_NTH(4), 2, 1),			/* [6] */ -			BTF_TAG_ENC(NAME_NTH(5), 2, 1),			/* [7] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, 1),		/* [6] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, 1),		/* [7] */  			/* tag -> t: tag1, tag3 */ -			BTF_TAG_ENC(NAME_NTH(4), 3, -1),		/* [8] */ -			BTF_TAG_ENC(NAME_NTH(6), 3, -1),		/* [9] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1),		/* [8] */ +			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, -1),		/* [9] */  			/* tag -> t/m2: tag1, tag3 */ -			BTF_TAG_ENC(NAME_NTH(4), 3, 1),			/* [10] */ -			BTF_TAG_ENC(NAME_NTH(6), 3, 1),			/* [11] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, 1),		/* [10] */ +			BTF_DECL_TAG_ENC(NAME_NTH(6), 3, 1),		/* [11] */  			BTF_END_RAW,  		},  		BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"), @@ -7154,12 +7192,12 @@ const struct btf_dedup_test dedup_tests[] = {  			BTF_STRUCT_ENC(NAME_NTH(1), 2, 8),		/* [2] */  				BTF_MEMBER_ENC(NAME_NTH(2), 1, 0),  				BTF_MEMBER_ENC(NAME_NTH(3), 1, 32), -			BTF_TAG_ENC(NAME_NTH(4), 2, -1),		/* [3] */ -			BTF_TAG_ENC(NAME_NTH(5), 2, -1),		/* [4] */ -			BTF_TAG_ENC(NAME_NTH(6), 2, -1),		/* [5] */ -			BTF_TAG_ENC(NAME_NTH(4), 2, 1),			/* [6] */ -			BTF_TAG_ENC(NAME_NTH(5), 2, 1),			/* [7] */ -			BTF_TAG_ENC(NAME_NTH(6), 2, 1),			/* [8] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1),		/* [3] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, -1),		/* [4] */ +			BTF_DECL_TAG_ENC(NAME_NTH(6), 2, -1),		/* [5] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, 1),		/* [6] */ +			BTF_DECL_TAG_ENC(NAME_NTH(5), 2, 1),		/* [7] */ +			BTF_DECL_TAG_ENC(NAME_NTH(6), 2, 1),		/* [8] */  			BTF_END_RAW,  		},  		BTF_STR_SEC("\0t\0m1\0m2\0tag1\0tag2\0tag3"), @@ -7168,6 +7206,39 @@ const struct btf_dedup_test dedup_tests[] = {  		.dont_resolve_fwds = false,  	},  }, +{ +	.descr = "dedup: typedef tags", +	.input = { +		.raw_types = { +			/* int */ +			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */ +			BTF_TYPEDEF_ENC(NAME_NTH(1), 1),		/* [2] */ +			BTF_TYPEDEF_ENC(NAME_NTH(1), 1),		/* [3] */ +			/* tag -> t: tag1, tag2 */ +			BTF_DECL_TAG_ENC(NAME_NTH(2), 2, -1),		/* [4] */ +			BTF_DECL_TAG_ENC(NAME_NTH(3), 2, -1),		/* [5] */ +			/* tag -> t: tag1, tag3 */ +			BTF_DECL_TAG_ENC(NAME_NTH(2), 3, -1),		/* [6] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 3, -1),		/* [7] */ +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0t\0tag1\0tag2\0tag3"), +	}, +	.expect = { +		.raw_types = { +			BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),	/* [1] */ +			BTF_TYPEDEF_ENC(NAME_NTH(1), 1),		/* [2] */ +			BTF_DECL_TAG_ENC(NAME_NTH(2), 2, -1),		/* [3] */ +			BTF_DECL_TAG_ENC(NAME_NTH(3), 2, -1),		/* [4] */ +			BTF_DECL_TAG_ENC(NAME_NTH(4), 2, -1),		/* [5] */ +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0t\0tag1\0tag2\0tag3"), +	}, +	.opts = { +		.dont_resolve_fwds = false, +	}, +},  }; @@ -7202,8 +7273,8 @@ static int btf_type_size(const struct btf_type *t)  		return base_size + sizeof(struct btf_var);  	case BTF_KIND_DATASEC:  		return base_size + vlen * sizeof(struct btf_var_secinfo); -	case BTF_KIND_TAG: -		return base_size + sizeof(struct btf_tag); +	case BTF_KIND_DECL_TAG: +		return base_size + sizeof(struct btf_decl_tag);  	default:  		fprintf(stderr, "Unsupported BTF_KIND:%u\n", kind);  		return -EINVAL; @@ -7274,8 +7345,8 @@ static void do_test_dedup(unsigned int test_num)  		goto done;  	} -	test_btf_data = btf__get_raw_data(test_btf, &test_btf_size); -	expect_btf_data = btf__get_raw_data(expect_btf, &expect_btf_size); +	test_btf_data = btf__raw_data(test_btf, &test_btf_size); +	expect_btf_data = btf__raw_data(expect_btf, &expect_btf_size);  	if (CHECK(test_btf_size != expect_btf_size,  		  "test_btf_size:%u != expect_btf_size:%u",  		  test_btf_size, expect_btf_size)) { @@ -7329,8 +7400,8 @@ static void do_test_dedup(unsigned int test_num)  		expect_str_cur += expect_len + 1;  	} -	test_nr_types = btf__get_nr_types(test_btf); -	expect_nr_types = btf__get_nr_types(expect_btf); +	test_nr_types = btf__type_cnt(test_btf); +	expect_nr_types = btf__type_cnt(expect_btf);  	if (CHECK(test_nr_types != expect_nr_types,  		  "test_nr_types:%u != expect_nr_types:%u",  		  test_nr_types, expect_nr_types)) { @@ -7338,7 +7409,7 @@ static void do_test_dedup(unsigned int test_num)  		goto done;  	} -	for (i = 1; i <= test_nr_types; i++) { +	for (i = 1; i < test_nr_types; i++) {  		const struct btf_type *test_type, *expect_type;  		int test_size, expect_size; diff --git a/tools/testing/selftests/bpf/prog_tests/btf_dump.c b/tools/testing/selftests/bpf/prog_tests/btf_dump.c index 87f9df653e4e..aa76360d8f49 100644 --- a/tools/testing/selftests/bpf/prog_tests/btf_dump.c +++ b/tools/testing/selftests/bpf/prog_tests/btf_dump.c @@ -27,7 +27,7 @@ static struct btf_dump_test_case {  static int btf_dump_all_types(const struct btf *btf,  			      const struct btf_dump_opts *opts)  { -	size_t type_cnt = btf__get_nr_types(btf); +	size_t type_cnt = btf__type_cnt(btf);  	struct btf_dump *d;  	int err = 0, id; @@ -36,7 +36,7 @@ static int btf_dump_all_types(const struct btf *btf,  	if (err)  		return err; -	for (id = 1; id <= type_cnt; id++) { +	for (id = 1; id < type_cnt; id++) {  		err = btf_dump__dump_type(d, id);  		if (err)  			goto done; @@ -133,7 +133,7 @@ static char *dump_buf;  static size_t dump_buf_sz;  static FILE *dump_buf_file; -void test_btf_dump_incremental(void) +static void test_btf_dump_incremental(void)  {  	struct btf *btf = NULL;  	struct btf_dump *d = NULL; @@ -171,7 +171,7 @@ void test_btf_dump_incremental(void)  	err = btf__add_field(btf, "x", 2, 0, 0);  	ASSERT_OK(err, "field_ok"); -	for (i = 1; i <= btf__get_nr_types(btf); i++) { +	for (i = 1; i < btf__type_cnt(btf); i++) {  		err = btf_dump__dump_type(d, i);  		ASSERT_OK(err, "dump_type_ok");  	} @@ -210,7 +210,7 @@ void test_btf_dump_incremental(void)  	err = btf__add_field(btf, "s", 3, 32, 0);  	ASSERT_OK(err, "field_ok"); -	for (i = 1; i <= btf__get_nr_types(btf); i++) { +	for (i = 1; i < btf__type_cnt(btf); i++) {  		err = btf_dump__dump_type(d, i);  		ASSERT_OK(err, "dump_type_ok");  	} @@ -778,8 +778,10 @@ static void test_btf_dump_struct_data(struct btf *btf, struct btf_dump *d,  static void test_btf_dump_var_data(struct btf *btf, struct btf_dump *d,  				   char *str)  { +#if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__)  	TEST_BTF_DUMP_VAR(btf, d, NULL, str, "cpu_number", int, BTF_F_COMPACT,  			  "int cpu_number = (int)100", 100); +#endif  	TEST_BTF_DUMP_VAR(btf, d, NULL, str, "cpu_profile_flip", int, BTF_F_COMPACT,  			  "static int cpu_profile_flip = (int)2", 2);  } diff --git a/tools/testing/selftests/bpf/prog_tests/btf_endian.c b/tools/testing/selftests/bpf/prog_tests/btf_endian.c index 8ab5d3e358dd..8afbf3d0b89a 100644 --- a/tools/testing/selftests/bpf/prog_tests/btf_endian.c +++ b/tools/testing/selftests/bpf/prog_tests/btf_endian.c @@ -7,12 +7,12 @@  #include <bpf/btf.h>  void test_btf_endian() { -#if __BYTE_ORDER == __LITTLE_ENDIAN +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__  	enum btf_endianness endian = BTF_LITTLE_ENDIAN; -#elif __BYTE_ORDER == __BIG_ENDIAN +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__  	enum btf_endianness endian = BTF_BIG_ENDIAN;  #else -#error "Unrecognized __BYTE_ORDER" +#error "Unrecognized __BYTE_ORDER__"  #endif  	enum btf_endianness swap_endian = 1 - endian;  	struct btf *btf = NULL, *swap_btf = NULL; @@ -32,7 +32,7 @@ void test_btf_endian() {  	ASSERT_EQ(btf__endianness(btf), swap_endian, "endian");  	/* Get raw BTF data in non-native endianness... */ -	raw_data = btf__get_raw_data(btf, &raw_sz); +	raw_data = btf__raw_data(btf, &raw_sz);  	if (!ASSERT_OK_PTR(raw_data, "raw_data_inverted"))  		goto err_out; @@ -42,9 +42,9 @@ void test_btf_endian() {  		goto err_out;  	ASSERT_EQ(btf__endianness(swap_btf), swap_endian, "endian"); -	ASSERT_EQ(btf__get_nr_types(swap_btf), btf__get_nr_types(btf), "nr_types"); +	ASSERT_EQ(btf__type_cnt(swap_btf), btf__type_cnt(btf), "nr_types"); -	swap_raw_data = btf__get_raw_data(swap_btf, &swap_raw_sz); +	swap_raw_data = btf__raw_data(swap_btf, &swap_raw_sz);  	if (!ASSERT_OK_PTR(swap_raw_data, "swap_raw_data"))  		goto err_out; @@ -58,7 +58,7 @@ void test_btf_endian() {  	/* swap it back to native endianness */  	btf__set_endianness(swap_btf, endian); -	swap_raw_data = btf__get_raw_data(swap_btf, &swap_raw_sz); +	swap_raw_data = btf__raw_data(swap_btf, &swap_raw_sz);  	if (!ASSERT_OK_PTR(swap_raw_data, "swap_raw_data"))  		goto err_out; @@ -75,7 +75,7 @@ void test_btf_endian() {  	swap_btf = NULL;  	btf__set_endianness(btf, swap_endian); -	raw_data = btf__get_raw_data(btf, &raw_sz); +	raw_data = btf__raw_data(btf, &raw_sz);  	if (!ASSERT_OK_PTR(raw_data, "raw_data_inverted"))  		goto err_out; @@ -85,7 +85,7 @@ void test_btf_endian() {  		goto err_out;  	ASSERT_EQ(btf__endianness(swap_btf), swap_endian, "endian"); -	ASSERT_EQ(btf__get_nr_types(swap_btf), btf__get_nr_types(btf), "nr_types"); +	ASSERT_EQ(btf__type_cnt(swap_btf), btf__type_cnt(btf), "nr_types");  	/* the type should appear as if it was stored in native endianness */  	t = btf__type_by_id(swap_btf, var_id); diff --git a/tools/testing/selftests/bpf/prog_tests/btf_split.c b/tools/testing/selftests/bpf/prog_tests/btf_split.c index ca7c2a91610a..b1ffe61f2aa9 100644 --- a/tools/testing/selftests/bpf/prog_tests/btf_split.c +++ b/tools/testing/selftests/bpf/prog_tests/btf_split.c @@ -72,7 +72,7 @@ void test_btf_split() {  	d = btf_dump__new(btf2, NULL, &opts, btf_dump_printf);  	if (!ASSERT_OK_PTR(d, "btf_dump__new"))  		goto cleanup; -	for (i = 1; i <= btf__get_nr_types(btf2); i++) { +	for (i = 1; i < btf__type_cnt(btf2); i++) {  		err = btf_dump__dump_type(d, i);  		ASSERT_OK(err, "dump_type_ok");  	} diff --git a/tools/testing/selftests/bpf/prog_tests/btf_write.c b/tools/testing/selftests/bpf/prog_tests/btf_write.c index 76548eecce2c..b912eeb0b6b4 100644 --- a/tools/testing/selftests/bpf/prog_tests/btf_write.c +++ b/tools/testing/selftests/bpf/prog_tests/btf_write.c @@ -4,19 +4,15 @@  #include <bpf/btf.h>  #include "btf_helpers.h" -void test_btf_write() { +static void gen_btf(struct btf *btf) +{  	const struct btf_var_secinfo *vi;  	const struct btf_type *t;  	const struct btf_member *m;  	const struct btf_enum *v;  	const struct btf_param *p; -	struct btf *btf;  	int id, err, str_off; -	btf = btf__new_empty(); -	if (!ASSERT_OK_PTR(btf, "new_empty")) -		return; -  	str_off = btf__find_str(btf, "int");  	ASSERT_EQ(str_off, -ENOENT, "int_str_missing_off"); @@ -281,26 +277,159 @@ void test_btf_write() {  		     "[17] DATASEC 'datasec1' size=12 vlen=1\n"  		     "\ttype_id=1 offset=4 size=8", "raw_dump"); -	/* TAG */ -	id = btf__add_tag(btf, "tag1", 16, -1); +	/* DECL_TAG */ +	id = btf__add_decl_tag(btf, "tag1", 16, -1);  	ASSERT_EQ(id, 18, "tag_id");  	t = btf__type_by_id(btf, 18);  	ASSERT_STREQ(btf__str_by_offset(btf, t->name_off), "tag1", "tag_value"); -	ASSERT_EQ(btf_kind(t), BTF_KIND_TAG, "tag_kind"); +	ASSERT_EQ(btf_kind(t), BTF_KIND_DECL_TAG, "tag_kind");  	ASSERT_EQ(t->type, 16, "tag_type"); -	ASSERT_EQ(btf_tag(t)->component_idx, -1, "tag_component_idx"); +	ASSERT_EQ(btf_decl_tag(t)->component_idx, -1, "tag_component_idx");  	ASSERT_STREQ(btf_type_raw_dump(btf, 18), -		     "[18] TAG 'tag1' type_id=16 component_idx=-1", "raw_dump"); +		     "[18] DECL_TAG 'tag1' type_id=16 component_idx=-1", "raw_dump"); -	id = btf__add_tag(btf, "tag2", 14, 1); +	id = btf__add_decl_tag(btf, "tag2", 14, 1);  	ASSERT_EQ(id, 19, "tag_id");  	t = btf__type_by_id(btf, 19);  	ASSERT_STREQ(btf__str_by_offset(btf, t->name_off), "tag2", "tag_value"); -	ASSERT_EQ(btf_kind(t), BTF_KIND_TAG, "tag_kind"); +	ASSERT_EQ(btf_kind(t), BTF_KIND_DECL_TAG, "tag_kind");  	ASSERT_EQ(t->type, 14, "tag_type"); -	ASSERT_EQ(btf_tag(t)->component_idx, 1, "tag_component_idx"); +	ASSERT_EQ(btf_decl_tag(t)->component_idx, 1, "tag_component_idx");  	ASSERT_STREQ(btf_type_raw_dump(btf, 19), -		     "[19] TAG 'tag2' type_id=14 component_idx=1", "raw_dump"); +		     "[19] DECL_TAG 'tag2' type_id=14 component_idx=1", "raw_dump"); +} + +static void test_btf_add() +{ +	struct btf *btf; + +	btf = btf__new_empty(); +	if (!ASSERT_OK_PTR(btf, "new_empty")) +		return; + +	gen_btf(btf); + +	VALIDATE_RAW_BTF( +		btf, +		"[1] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED", +		"[2] PTR '(anon)' type_id=1", +		"[3] CONST '(anon)' type_id=5", +		"[4] VOLATILE '(anon)' type_id=3", +		"[5] RESTRICT '(anon)' type_id=4", +		"[6] ARRAY '(anon)' type_id=2 index_type_id=1 nr_elems=10", +		"[7] STRUCT 's1' size=8 vlen=2\n" +		"\t'f1' type_id=1 bits_offset=0\n" +		"\t'f2' type_id=1 bits_offset=32 bitfield_size=16", +		"[8] UNION 'u1' size=8 vlen=1\n" +		"\t'f1' type_id=1 bits_offset=0 bitfield_size=16", +		"[9] ENUM 'e1' size=4 vlen=2\n" +		"\t'v1' val=1\n" +		"\t'v2' val=2", +		"[10] FWD 'struct_fwd' fwd_kind=struct", +		"[11] FWD 'union_fwd' fwd_kind=union", +		"[12] ENUM 'enum_fwd' size=4 vlen=0", +		"[13] TYPEDEF 'typedef1' type_id=1", +		"[14] FUNC 'func1' type_id=15 linkage=global", +		"[15] FUNC_PROTO '(anon)' ret_type_id=1 vlen=2\n" +		"\t'p1' type_id=1\n" +		"\t'p2' type_id=2", +		"[16] VAR 'var1' type_id=1, linkage=global-alloc", +		"[17] DATASEC 'datasec1' size=12 vlen=1\n" +		"\ttype_id=1 offset=4 size=8", +		"[18] DECL_TAG 'tag1' type_id=16 component_idx=-1", +		"[19] DECL_TAG 'tag2' type_id=14 component_idx=1");  	btf__free(btf);  } + +static void test_btf_add_btf() +{ +	struct btf *btf1 = NULL, *btf2 = NULL; +	int id; + +	btf1 = btf__new_empty(); +	if (!ASSERT_OK_PTR(btf1, "btf1")) +		return; + +	btf2 = btf__new_empty(); +	if (!ASSERT_OK_PTR(btf2, "btf2")) +		goto cleanup; + +	gen_btf(btf1); +	gen_btf(btf2); + +	id = btf__add_btf(btf1, btf2); +	if (!ASSERT_EQ(id, 20, "id")) +		goto cleanup; + +	VALIDATE_RAW_BTF( +		btf1, +		"[1] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED", +		"[2] PTR '(anon)' type_id=1", +		"[3] CONST '(anon)' type_id=5", +		"[4] VOLATILE '(anon)' type_id=3", +		"[5] RESTRICT '(anon)' type_id=4", +		"[6] ARRAY '(anon)' type_id=2 index_type_id=1 nr_elems=10", +		"[7] STRUCT 's1' size=8 vlen=2\n" +		"\t'f1' type_id=1 bits_offset=0\n" +		"\t'f2' type_id=1 bits_offset=32 bitfield_size=16", +		"[8] UNION 'u1' size=8 vlen=1\n" +		"\t'f1' type_id=1 bits_offset=0 bitfield_size=16", +		"[9] ENUM 'e1' size=4 vlen=2\n" +		"\t'v1' val=1\n" +		"\t'v2' val=2", +		"[10] FWD 'struct_fwd' fwd_kind=struct", +		"[11] FWD 'union_fwd' fwd_kind=union", +		"[12] ENUM 'enum_fwd' size=4 vlen=0", +		"[13] TYPEDEF 'typedef1' type_id=1", +		"[14] FUNC 'func1' type_id=15 linkage=global", +		"[15] FUNC_PROTO '(anon)' ret_type_id=1 vlen=2\n" +		"\t'p1' type_id=1\n" +		"\t'p2' type_id=2", +		"[16] VAR 'var1' type_id=1, linkage=global-alloc", +		"[17] DATASEC 'datasec1' size=12 vlen=1\n" +		"\ttype_id=1 offset=4 size=8", +		"[18] DECL_TAG 'tag1' type_id=16 component_idx=-1", +		"[19] DECL_TAG 'tag2' type_id=14 component_idx=1", + +		/* types appended from the second BTF */ +		"[20] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED", +		"[21] PTR '(anon)' type_id=20", +		"[22] CONST '(anon)' type_id=24", +		"[23] VOLATILE '(anon)' type_id=22", +		"[24] RESTRICT '(anon)' type_id=23", +		"[25] ARRAY '(anon)' type_id=21 index_type_id=20 nr_elems=10", +		"[26] STRUCT 's1' size=8 vlen=2\n" +		"\t'f1' type_id=20 bits_offset=0\n" +		"\t'f2' type_id=20 bits_offset=32 bitfield_size=16", +		"[27] UNION 'u1' size=8 vlen=1\n" +		"\t'f1' type_id=20 bits_offset=0 bitfield_size=16", +		"[28] ENUM 'e1' size=4 vlen=2\n" +		"\t'v1' val=1\n" +		"\t'v2' val=2", +		"[29] FWD 'struct_fwd' fwd_kind=struct", +		"[30] FWD 'union_fwd' fwd_kind=union", +		"[31] ENUM 'enum_fwd' size=4 vlen=0", +		"[32] TYPEDEF 'typedef1' type_id=20", +		"[33] FUNC 'func1' type_id=34 linkage=global", +		"[34] FUNC_PROTO '(anon)' ret_type_id=20 vlen=2\n" +		"\t'p1' type_id=20\n" +		"\t'p2' type_id=21", +		"[35] VAR 'var1' type_id=20, linkage=global-alloc", +		"[36] DATASEC 'datasec1' size=12 vlen=1\n" +		"\ttype_id=20 offset=4 size=8", +		"[37] DECL_TAG 'tag1' type_id=35 component_idx=-1", +		"[38] DECL_TAG 'tag2' type_id=33 component_idx=1"); + +cleanup: +	btf__free(btf1); +	btf__free(btf2); +} + +void test_btf_write() +{ +	if (test__start_subtest("btf_add")) +		test_btf_add(); +	if (test__start_subtest("btf_add_btf")) +		test_btf_add_btf(); +} diff --git a/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c b/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c index 876be0ecb654..621c57222191 100644 --- a/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c +++ b/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c @@ -363,7 +363,7 @@ close_bpf_object:  	cg_storage_multi_shared__destroy(obj);  } -void test_cg_storage_multi(void) +void serial_test_cg_storage_multi(void)  {  	int parent_cgroup_fd = -1, child_cgroup_fd = -1; diff --git a/tools/testing/selftests/bpf/prog_tests/cgroup_attach_autodetach.c b/tools/testing/selftests/bpf/prog_tests/cgroup_attach_autodetach.c index 70e94e783070..5de485c7370f 100644 --- a/tools/testing/selftests/bpf/prog_tests/cgroup_attach_autodetach.c +++ b/tools/testing/selftests/bpf/prog_tests/cgroup_attach_autodetach.c @@ -21,7 +21,7 @@ static int prog_load(void)  			       bpf_log_buf, BPF_LOG_BUF_SIZE);  } -void test_cgroup_attach_autodetach(void) +void serial_test_cgroup_attach_autodetach(void)  {  	__u32 duration = 0, prog_cnt = 4, attach_flags;  	int allow_prog[2] = {-1}; diff --git a/tools/testing/selftests/bpf/prog_tests/cgroup_attach_multi.c b/tools/testing/selftests/bpf/prog_tests/cgroup_attach_multi.c index 20bb8831dda6..731bea84d8ed 100644 --- a/tools/testing/selftests/bpf/prog_tests/cgroup_attach_multi.c +++ b/tools/testing/selftests/bpf/prog_tests/cgroup_attach_multi.c @@ -74,7 +74,7 @@ static int prog_load_cnt(int verdict, int val)  	return ret;  } -void test_cgroup_attach_multi(void) +void serial_test_cgroup_attach_multi(void)  {  	__u32 prog_ids[4], prog_cnt = 0, attach_flags, saved_prog_id;  	int cg1 = 0, cg2 = 0, cg3 = 0, cg4 = 0, cg5 = 0, key = 0; diff --git a/tools/testing/selftests/bpf/prog_tests/cgroup_attach_override.c b/tools/testing/selftests/bpf/prog_tests/cgroup_attach_override.c index 9e96f8d87fea..10d3c33821a7 100644 --- a/tools/testing/selftests/bpf/prog_tests/cgroup_attach_override.c +++ b/tools/testing/selftests/bpf/prog_tests/cgroup_attach_override.c @@ -23,7 +23,7 @@ static int prog_load(int verdict)  			       bpf_log_buf, BPF_LOG_BUF_SIZE);  } -void test_cgroup_attach_override(void) +void serial_test_cgroup_attach_override(void)  {  	int drop_prog = -1, allow_prog = -1, foo = -1, bar = -1;  	__u32 duration = 0; diff --git a/tools/testing/selftests/bpf/prog_tests/cgroup_link.c b/tools/testing/selftests/bpf/prog_tests/cgroup_link.c index 9091524131d6..9e6e6aad347c 100644 --- a/tools/testing/selftests/bpf/prog_tests/cgroup_link.c +++ b/tools/testing/selftests/bpf/prog_tests/cgroup_link.c @@ -24,7 +24,7 @@ int ping_and_check(int exp_calls, int exp_alt_calls)  	return 0;  } -void test_cgroup_link(void) +void serial_test_cgroup_link(void)  {  	struct {  		const char *path; diff --git a/tools/testing/selftests/bpf/prog_tests/cgroup_v1v2.c b/tools/testing/selftests/bpf/prog_tests/cgroup_v1v2.c index ab3b9bc5e6d1..9026b42914d3 100644 --- a/tools/testing/selftests/bpf/prog_tests/cgroup_v1v2.c +++ b/tools/testing/selftests/bpf/prog_tests/cgroup_v1v2.c @@ -46,7 +46,7 @@ void test_cgroup_v1v2(void)  {  	struct network_helper_opts opts = {};  	int server_fd, client_fd, cgroup_fd; -	static const int port = 60123; +	static const int port = 60120;  	/* Step 1: Check base connectivity works without any BPF. */  	server_fd = start_server(AF_INET, SOCK_STREAM, NULL, port, 0); diff --git a/tools/testing/selftests/bpf/prog_tests/check_mtu.c b/tools/testing/selftests/bpf/prog_tests/check_mtu.c index 012068f33a0a..f73e6e36b74d 100644 --- a/tools/testing/selftests/bpf/prog_tests/check_mtu.c +++ b/tools/testing/selftests/bpf/prog_tests/check_mtu.c @@ -195,7 +195,7 @@ cleanup:  	test_check_mtu__destroy(skel);  } -void test_check_mtu(void) +void serial_test_check_mtu(void)  {  	__u32 mtu_lo; diff --git a/tools/testing/selftests/bpf/prog_tests/core_autosize.c b/tools/testing/selftests/bpf/prog_tests/core_autosize.c index 3d4b2a358d47..1dfe14ff6aa4 100644 --- a/tools/testing/selftests/bpf/prog_tests/core_autosize.c +++ b/tools/testing/selftests/bpf/prog_tests/core_autosize.c @@ -112,7 +112,7 @@ void test_core_autosize(void)  	if (!ASSERT_OK_PTR(f, "btf_fdopen"))  		goto cleanup; -	raw_data = btf__get_raw_data(btf, &raw_sz); +	raw_data = btf__raw_data(btf, &raw_sz);  	if (!ASSERT_OK_PTR(raw_data, "raw_data"))  		goto cleanup;  	written = fwrite(raw_data, 1, raw_sz, f); @@ -163,7 +163,7 @@ void test_core_autosize(void)  	usleep(1); -	bss_map = bpf_object__find_map_by_name(skel->obj, "test_cor.bss"); +	bss_map = bpf_object__find_map_by_name(skel->obj, ".bss");  	if (!ASSERT_OK_PTR(bss_map, "bss_map_find"))  		goto cleanup; diff --git a/tools/testing/selftests/bpf/prog_tests/core_reloc.c b/tools/testing/selftests/bpf/prog_tests/core_reloc.c index 763302e63a29..55ec85ba7375 100644 --- a/tools/testing/selftests/bpf/prog_tests/core_reloc.c +++ b/tools/testing/selftests/bpf/prog_tests/core_reloc.c @@ -381,7 +381,7 @@ static int setup_type_id_case_local(struct core_reloc_test_case *test)  	exp->local_anon_void_ptr = -1;  	exp->local_anon_arr = -1; -	for (i = 1; i <= btf__get_nr_types(local_btf); i++) +	for (i = 1; i < btf__type_cnt(local_btf); i++)  	{  		t = btf__type_by_id(local_btf, i);  		/* we are interested only in anonymous types */ @@ -867,7 +867,7 @@ void test_core_reloc(void)  			goto cleanup;  		} -		data_map = bpf_object__find_map_by_name(obj, "test_cor.bss"); +		data_map = bpf_object__find_map_by_name(obj, ".bss");  		if (CHECK(!data_map, "find_data_map", "data map not found\n"))  			goto cleanup; diff --git a/tools/testing/selftests/bpf/prog_tests/dummy_st_ops.c b/tools/testing/selftests/bpf/prog_tests/dummy_st_ops.c new file mode 100644 index 000000000000..cbaa44ffb8c6 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/dummy_st_ops.c @@ -0,0 +1,115 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (C) 2021. Huawei Technologies Co., Ltd */ +#include <test_progs.h> +#include "dummy_st_ops.skel.h" + +/* Need to keep consistent with definition in include/linux/bpf.h */ +struct bpf_dummy_ops_state { +	int val; +}; + +static void test_dummy_st_ops_attach(void) +{ +	struct dummy_st_ops *skel; +	struct bpf_link *link; + +	skel = dummy_st_ops__open_and_load(); +	if (!ASSERT_OK_PTR(skel, "dummy_st_ops_load")) +		return; + +	link = bpf_map__attach_struct_ops(skel->maps.dummy_1); +	ASSERT_EQ(libbpf_get_error(link), -EOPNOTSUPP, "dummy_st_ops_attach"); + +	dummy_st_ops__destroy(skel); +} + +static void test_dummy_init_ret_value(void) +{ +	__u64 args[1] = {0}; +	struct bpf_prog_test_run_attr attr = { +		.ctx_size_in = sizeof(args), +		.ctx_in = args, +	}; +	struct dummy_st_ops *skel; +	int fd, err; + +	skel = dummy_st_ops__open_and_load(); +	if (!ASSERT_OK_PTR(skel, "dummy_st_ops_load")) +		return; + +	fd = bpf_program__fd(skel->progs.test_1); +	attr.prog_fd = fd; +	err = bpf_prog_test_run_xattr(&attr); +	ASSERT_OK(err, "test_run"); +	ASSERT_EQ(attr.retval, 0xf2f3f4f5, "test_ret"); + +	dummy_st_ops__destroy(skel); +} + +static void test_dummy_init_ptr_arg(void) +{ +	int exp_retval = 0xbeef; +	struct bpf_dummy_ops_state in_state = { +		.val = exp_retval, +	}; +	__u64 args[1] = {(unsigned long)&in_state}; +	struct bpf_prog_test_run_attr attr = { +		.ctx_size_in = sizeof(args), +		.ctx_in = args, +	}; +	struct dummy_st_ops *skel; +	int fd, err; + +	skel = dummy_st_ops__open_and_load(); +	if (!ASSERT_OK_PTR(skel, "dummy_st_ops_load")) +		return; + +	fd = bpf_program__fd(skel->progs.test_1); +	attr.prog_fd = fd; +	err = bpf_prog_test_run_xattr(&attr); +	ASSERT_OK(err, "test_run"); +	ASSERT_EQ(in_state.val, 0x5a, "test_ptr_ret"); +	ASSERT_EQ(attr.retval, exp_retval, "test_ret"); + +	dummy_st_ops__destroy(skel); +} + +static void test_dummy_multiple_args(void) +{ +	__u64 args[5] = {0, -100, 0x8a5f, 'c', 0x1234567887654321ULL}; +	struct bpf_prog_test_run_attr attr = { +		.ctx_size_in = sizeof(args), +		.ctx_in = args, +	}; +	struct dummy_st_ops *skel; +	int fd, err; +	size_t i; +	char name[8]; + +	skel = dummy_st_ops__open_and_load(); +	if (!ASSERT_OK_PTR(skel, "dummy_st_ops_load")) +		return; + +	fd = bpf_program__fd(skel->progs.test_2); +	attr.prog_fd = fd; +	err = bpf_prog_test_run_xattr(&attr); +	ASSERT_OK(err, "test_run"); +	for (i = 0; i < ARRAY_SIZE(args); i++) { +		snprintf(name, sizeof(name), "arg %zu", i); +		ASSERT_EQ(skel->bss->test_2_args[i], args[i], name); +	} + +	dummy_st_ops__destroy(skel); +} + +void test_dummy_st_ops(void) +{ +	if (test__start_subtest("dummy_st_ops_attach")) +		test_dummy_st_ops_attach(); +	if (test__start_subtest("dummy_init_ret_value")) +		test_dummy_init_ret_value(); +	if (test__start_subtest("dummy_init_ptr_arg")) +		test_dummy_init_ptr_arg(); +	if (test__start_subtest("dummy_multiple_args")) +		test_dummy_multiple_args(); +} diff --git a/tools/testing/selftests/bpf/prog_tests/fentry_fexit.c b/tools/testing/selftests/bpf/prog_tests/fentry_fexit.c index 91154c2ba256..4374ac8a8a91 100644 --- a/tools/testing/selftests/bpf/prog_tests/fentry_fexit.c +++ b/tools/testing/selftests/bpf/prog_tests/fentry_fexit.c @@ -6,23 +6,23 @@  void test_fentry_fexit(void)  { -	struct fentry_test *fentry_skel = NULL; -	struct fexit_test *fexit_skel = NULL; +	struct fentry_test_lskel *fentry_skel = NULL; +	struct fexit_test_lskel *fexit_skel = NULL;  	__u64 *fentry_res, *fexit_res;  	__u32 duration = 0, retval;  	int err, prog_fd, i; -	fentry_skel = fentry_test__open_and_load(); +	fentry_skel = fentry_test_lskel__open_and_load();  	if (CHECK(!fentry_skel, "fentry_skel_load", "fentry skeleton failed\n"))  		goto close_prog; -	fexit_skel = fexit_test__open_and_load(); +	fexit_skel = fexit_test_lskel__open_and_load();  	if (CHECK(!fexit_skel, "fexit_skel_load", "fexit skeleton failed\n"))  		goto close_prog; -	err = fentry_test__attach(fentry_skel); +	err = fentry_test_lskel__attach(fentry_skel);  	if (CHECK(err, "fentry_attach", "fentry attach failed: %d\n", err))  		goto close_prog; -	err = fexit_test__attach(fexit_skel); +	err = fexit_test_lskel__attach(fexit_skel);  	if (CHECK(err, "fexit_attach", "fexit attach failed: %d\n", err))  		goto close_prog; @@ -44,6 +44,6 @@ void test_fentry_fexit(void)  	}  close_prog: -	fentry_test__destroy(fentry_skel); -	fexit_test__destroy(fexit_skel); +	fentry_test_lskel__destroy(fentry_skel); +	fexit_test_lskel__destroy(fexit_skel);  } diff --git a/tools/testing/selftests/bpf/prog_tests/fentry_test.c b/tools/testing/selftests/bpf/prog_tests/fentry_test.c index 174c89e7456e..12921b3850d2 100644 --- a/tools/testing/selftests/bpf/prog_tests/fentry_test.c +++ b/tools/testing/selftests/bpf/prog_tests/fentry_test.c @@ -3,19 +3,19 @@  #include <test_progs.h>  #include "fentry_test.lskel.h" -static int fentry_test(struct fentry_test *fentry_skel) +static int fentry_test(struct fentry_test_lskel *fentry_skel)  {  	int err, prog_fd, i;  	__u32 duration = 0, retval;  	int link_fd;  	__u64 *result; -	err = fentry_test__attach(fentry_skel); +	err = fentry_test_lskel__attach(fentry_skel);  	if (!ASSERT_OK(err, "fentry_attach"))  		return err;  	/* Check that already linked program can't be attached again. */ -	link_fd = fentry_test__test1__attach(fentry_skel); +	link_fd = fentry_test_lskel__test1__attach(fentry_skel);  	if (!ASSERT_LT(link_fd, 0, "fentry_attach_link"))  		return -1; @@ -31,7 +31,7 @@ static int fentry_test(struct fentry_test *fentry_skel)  			return -1;  	} -	fentry_test__detach(fentry_skel); +	fentry_test_lskel__detach(fentry_skel);  	/* zero results for re-attach test */  	memset(fentry_skel->bss, 0, sizeof(*fentry_skel->bss)); @@ -40,10 +40,10 @@ static int fentry_test(struct fentry_test *fentry_skel)  void test_fentry_test(void)  { -	struct fentry_test *fentry_skel = NULL; +	struct fentry_test_lskel *fentry_skel = NULL;  	int err; -	fentry_skel = fentry_test__open_and_load(); +	fentry_skel = fentry_test_lskel__open_and_load();  	if (!ASSERT_OK_PTR(fentry_skel, "fentry_skel_load"))  		goto cleanup; @@ -55,5 +55,5 @@ void test_fentry_test(void)  	ASSERT_OK(err, "fentry_second_attach");  cleanup: -	fentry_test__destroy(fentry_skel); +	fentry_test_lskel__destroy(fentry_skel);  } diff --git a/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c b/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c index c7c1816899bf..9cff14a23bb7 100644 --- a/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c +++ b/tools/testing/selftests/bpf/prog_tests/fexit_bpf2bpf.c @@ -285,7 +285,7 @@ static void test_fmod_ret_freplace(void)  	if (!ASSERT_OK_PTR(freplace_obj, "freplace_obj_open"))  		goto out; -	prog = bpf_program__next(NULL, freplace_obj); +	prog = bpf_object__next_program(freplace_obj, NULL);  	err = bpf_program__set_attach_target(prog, pkt_fd, NULL);  	ASSERT_OK(err, "freplace__set_attach_target"); @@ -302,7 +302,7 @@ static void test_fmod_ret_freplace(void)  		goto out;  	attach_prog_fd = bpf_program__fd(prog); -	prog = bpf_program__next(NULL, fmod_obj); +	prog = bpf_object__next_program(fmod_obj, NULL);  	err = bpf_program__set_attach_target(prog, attach_prog_fd, NULL);  	ASSERT_OK(err, "fmod_ret_set_attach_target"); @@ -352,7 +352,7 @@ static void test_obj_load_failure_common(const char *obj_file,  	if (!ASSERT_OK_PTR(obj, "obj_open"))  		goto close_prog; -	prog = bpf_program__next(NULL, obj); +	prog = bpf_object__next_program(obj, NULL);  	err = bpf_program__set_attach_target(prog, pkt_fd, NULL);  	ASSERT_OK(err, "set_attach_target"); @@ -380,7 +380,8 @@ static void test_func_map_prog_compatibility(void)  				     "./test_attach_probe.o");  } -void test_fexit_bpf2bpf(void) +/* NOTE: affect other tests, must run in serial mode */ +void serial_test_fexit_bpf2bpf(void)  {  	if (test__start_subtest("target_no_callees"))  		test_target_no_callees(); diff --git a/tools/testing/selftests/bpf/prog_tests/fexit_sleep.c b/tools/testing/selftests/bpf/prog_tests/fexit_sleep.c index 4e7f4b42ea29..f949647dbbc2 100644 --- a/tools/testing/selftests/bpf/prog_tests/fexit_sleep.c +++ b/tools/testing/selftests/bpf/prog_tests/fexit_sleep.c @@ -10,7 +10,7 @@  static int do_sleep(void *skel)  { -	struct fexit_sleep *fexit_skel = skel; +	struct fexit_sleep_lskel *fexit_skel = skel;  	struct timespec ts1 = { .tv_nsec = 1 };  	struct timespec ts2 = { .tv_sec = 10 }; @@ -25,16 +25,16 @@ static char child_stack[STACK_SIZE];  void test_fexit_sleep(void)  { -	struct fexit_sleep *fexit_skel = NULL; +	struct fexit_sleep_lskel *fexit_skel = NULL;  	int wstatus, duration = 0;  	pid_t cpid;  	int err, fexit_cnt; -	fexit_skel = fexit_sleep__open_and_load(); +	fexit_skel = fexit_sleep_lskel__open_and_load();  	if (CHECK(!fexit_skel, "fexit_skel_load", "fexit skeleton failed\n"))  		goto cleanup; -	err = fexit_sleep__attach(fexit_skel); +	err = fexit_sleep_lskel__attach(fexit_skel);  	if (CHECK(err, "fexit_attach", "fexit attach failed: %d\n", err))  		goto cleanup; @@ -60,7 +60,7 @@ void test_fexit_sleep(void)  	 */  	close(fexit_skel->progs.nanosleep_fentry.prog_fd);  	close(fexit_skel->progs.nanosleep_fexit.prog_fd); -	fexit_sleep__detach(fexit_skel); +	fexit_sleep_lskel__detach(fexit_skel);  	/* kill the thread to unwind sys_nanosleep stack through the trampoline */  	kill(cpid, 9); @@ -78,5 +78,5 @@ void test_fexit_sleep(void)  		goto cleanup;  cleanup: -	fexit_sleep__destroy(fexit_skel); +	fexit_sleep_lskel__destroy(fexit_skel);  } diff --git a/tools/testing/selftests/bpf/prog_tests/fexit_test.c b/tools/testing/selftests/bpf/prog_tests/fexit_test.c index af3dba726701..d4887d8bb396 100644 --- a/tools/testing/selftests/bpf/prog_tests/fexit_test.c +++ b/tools/testing/selftests/bpf/prog_tests/fexit_test.c @@ -3,19 +3,19 @@  #include <test_progs.h>  #include "fexit_test.lskel.h" -static int fexit_test(struct fexit_test *fexit_skel) +static int fexit_test(struct fexit_test_lskel *fexit_skel)  {  	int err, prog_fd, i;  	__u32 duration = 0, retval;  	int link_fd;  	__u64 *result; -	err = fexit_test__attach(fexit_skel); +	err = fexit_test_lskel__attach(fexit_skel);  	if (!ASSERT_OK(err, "fexit_attach"))  		return err;  	/* Check that already linked program can't be attached again. */ -	link_fd = fexit_test__test1__attach(fexit_skel); +	link_fd = fexit_test_lskel__test1__attach(fexit_skel);  	if (!ASSERT_LT(link_fd, 0, "fexit_attach_link"))  		return -1; @@ -31,7 +31,7 @@ static int fexit_test(struct fexit_test *fexit_skel)  			return -1;  	} -	fexit_test__detach(fexit_skel); +	fexit_test_lskel__detach(fexit_skel);  	/* zero results for re-attach test */  	memset(fexit_skel->bss, 0, sizeof(*fexit_skel->bss)); @@ -40,10 +40,10 @@ static int fexit_test(struct fexit_test *fexit_skel)  void test_fexit_test(void)  { -	struct fexit_test *fexit_skel = NULL; +	struct fexit_test_lskel *fexit_skel = NULL;  	int err; -	fexit_skel = fexit_test__open_and_load(); +	fexit_skel = fexit_test_lskel__open_and_load();  	if (!ASSERT_OK_PTR(fexit_skel, "fexit_skel_load"))  		goto cleanup; @@ -55,5 +55,5 @@ void test_fexit_test(void)  	ASSERT_OK(err, "fexit_second_attach");  cleanup: -	fexit_test__destroy(fexit_skel); +	fexit_test_lskel__destroy(fexit_skel);  } diff --git a/tools/testing/selftests/bpf/prog_tests/flow_dissector_load_bytes.c b/tools/testing/selftests/bpf/prog_tests/flow_dissector_load_bytes.c index 0e8a4d2f023d..6093728497c7 100644 --- a/tools/testing/selftests/bpf/prog_tests/flow_dissector_load_bytes.c +++ b/tools/testing/selftests/bpf/prog_tests/flow_dissector_load_bytes.c @@ -2,7 +2,7 @@  #include <test_progs.h>  #include <network_helpers.h> -void test_flow_dissector_load_bytes(void) +void serial_test_flow_dissector_load_bytes(void)  {  	struct bpf_flow_keys flow_keys;  	__u32 duration = 0, retval, size; diff --git a/tools/testing/selftests/bpf/prog_tests/flow_dissector_reattach.c b/tools/testing/selftests/bpf/prog_tests/flow_dissector_reattach.c index 3931ede5c534..f0c6c226aba8 100644 --- a/tools/testing/selftests/bpf/prog_tests/flow_dissector_reattach.c +++ b/tools/testing/selftests/bpf/prog_tests/flow_dissector_reattach.c @@ -628,7 +628,7 @@ out_close:  	}  } -void test_flow_dissector_reattach(void) +void serial_test_flow_dissector_reattach(void)  {  	int err, new_net, saved_net; diff --git a/tools/testing/selftests/bpf/prog_tests/get_branch_snapshot.c b/tools/testing/selftests/bpf/prog_tests/get_branch_snapshot.c index 67e86f8d8677..3948da12a528 100644 --- a/tools/testing/selftests/bpf/prog_tests/get_branch_snapshot.c +++ b/tools/testing/selftests/bpf/prog_tests/get_branch_snapshot.c @@ -6,6 +6,30 @@  static int *pfd_array;  static int cpu_cnt; +static bool is_hypervisor(void) +{ +	char *line = NULL; +	bool ret = false; +	size_t len; +	FILE *fp; + +	fp = fopen("/proc/cpuinfo", "r"); +	if (!fp) +		return false; + +	while (getline(&line, &len, fp) != -1) { +		if (!strncmp(line, "flags", 5)) { +			if (strstr(line, "hypervisor") != NULL) +				ret = true; +			break; +		} +	} + +	free(line); +	fclose(fp); +	return ret; +} +  static int create_perf_events(void)  {  	struct perf_event_attr attr = {0}; @@ -49,11 +73,17 @@ static void close_perf_events(void)  	free(pfd_array);  } -void test_get_branch_snapshot(void) +void serial_test_get_branch_snapshot(void)  {  	struct get_branch_snapshot *skel = NULL;  	int err; +	/* Skip the test before we fix LBR snapshot for hypervisor. */ +	if (is_hypervisor()) { +		test__skip(); +		return; +	} +  	if (create_perf_events()) {  		test__skip();  /* system doesn't support LBR */  		goto cleanup; @@ -67,9 +97,10 @@ void test_get_branch_snapshot(void)  	if (!ASSERT_OK(err, "kallsyms_find"))  		goto cleanup; -	err = kallsyms_find_next("bpf_testmod_loop_test", &skel->bss->address_high); -	if (!ASSERT_OK(err, "kallsyms_find_next")) -		goto cleanup; +	/* Just a guess for the end of this function, as module functions +	 * in /proc/kallsyms could come in any order. +	 */ +	skel->bss->address_high = skel->bss->address_low + 128;  	err = get_branch_snapshot__attach(skel);  	if (!ASSERT_OK(err, "get_branch_snapshot__attach")) diff --git a/tools/testing/selftests/bpf/prog_tests/global_data.c b/tools/testing/selftests/bpf/prog_tests/global_data.c index 9efa7e50eab2..afd8639f9a94 100644 --- a/tools/testing/selftests/bpf/prog_tests/global_data.c +++ b/tools/testing/selftests/bpf/prog_tests/global_data.c @@ -103,11 +103,18 @@ static void test_global_data_struct(struct bpf_object *obj, __u32 duration)  static void test_global_data_rdonly(struct bpf_object *obj, __u32 duration)  {  	int err = -ENOMEM, map_fd, zero = 0; -	struct bpf_map *map; +	struct bpf_map *map, *map2;  	__u8 *buff;  	map = bpf_object__find_map_by_name(obj, "test_glo.rodata"); -	if (CHECK_FAIL(!map || !bpf_map__is_internal(map))) +	if (!ASSERT_OK_PTR(map, "map")) +		return; +	if (!ASSERT_TRUE(bpf_map__is_internal(map), "is_internal")) +		return; + +	/* ensure we can lookup internal maps by their ELF names */ +	map2 = bpf_object__find_map_by_name(obj, ".rodata"); +	if (!ASSERT_EQ(map, map2, "same_maps"))  		return;  	map_fd = bpf_map__fd(map); diff --git a/tools/testing/selftests/bpf/prog_tests/global_data_init.c b/tools/testing/selftests/bpf/prog_tests/global_data_init.c index ee46b11f1f9a..1db86eab101b 100644 --- a/tools/testing/selftests/bpf/prog_tests/global_data_init.c +++ b/tools/testing/selftests/bpf/prog_tests/global_data_init.c @@ -16,7 +16,7 @@ void test_global_data_init(void)  	if (CHECK_FAIL(err))  		return; -	map = bpf_object__find_map_by_name(obj, "test_glo.rodata"); +	map = bpf_object__find_map_by_name(obj, ".rodata");  	if (CHECK_FAIL(!map || !bpf_map__is_internal(map)))  		goto out; diff --git a/tools/testing/selftests/bpf/prog_tests/kfree_skb.c b/tools/testing/selftests/bpf/prog_tests/kfree_skb.c index ddfb6bf97152..01e51d16c8b8 100644 --- a/tools/testing/selftests/bpf/prog_tests/kfree_skb.c +++ b/tools/testing/selftests/bpf/prog_tests/kfree_skb.c @@ -48,7 +48,8 @@ static void on_sample(void *ctx, int cpu, void *data, __u32 size)  	*(bool *)ctx = true;  } -void test_kfree_skb(void) +/* TODO: fix kernel panic caused by this test in parallel mode */ +void serial_test_kfree_skb(void)  {  	struct __sk_buff skb = {};  	struct bpf_prog_test_run_attr tattr = { @@ -92,7 +93,7 @@ void test_kfree_skb(void)  	if (CHECK(!fexit, "find_prog", "prog eth_type_trans not found\n"))  		goto close_prog; -	global_data = bpf_object__find_map_by_name(obj2, "kfree_sk.bss"); +	global_data = bpf_object__find_map_by_name(obj2, ".bss");  	if (CHECK(!global_data, "find global data", "not found\n"))  		goto close_prog; diff --git a/tools/testing/selftests/bpf/prog_tests/kfunc_call.c b/tools/testing/selftests/bpf/prog_tests/kfunc_call.c index 9611f2bc50df..5c9c0176991b 100644 --- a/tools/testing/selftests/bpf/prog_tests/kfunc_call.c +++ b/tools/testing/selftests/bpf/prog_tests/kfunc_call.c @@ -7,10 +7,10 @@  static void test_main(void)  { -	struct kfunc_call_test *skel; +	struct kfunc_call_test_lskel *skel;  	int prog_fd, retval, err; -	skel = kfunc_call_test__open_and_load(); +	skel = kfunc_call_test_lskel__open_and_load();  	if (!ASSERT_OK_PTR(skel, "skel"))  		return; @@ -26,7 +26,7 @@ static void test_main(void)  	ASSERT_OK(err, "bpf_prog_test_run(test2)");  	ASSERT_EQ(retval, 3, "test2-retval"); -	kfunc_call_test__destroy(skel); +	kfunc_call_test_lskel__destroy(skel);  }  static void test_subprog(void) diff --git a/tools/testing/selftests/bpf/prog_tests/ksyms_btf.c b/tools/testing/selftests/bpf/prog_tests/ksyms_btf.c index cf3acfa5a91d..79f6bd1e50d6 100644 --- a/tools/testing/selftests/bpf/prog_tests/ksyms_btf.c +++ b/tools/testing/selftests/bpf/prog_tests/ksyms_btf.c @@ -7,6 +7,7 @@  #include "test_ksyms_btf.skel.h"  #include "test_ksyms_btf_null_check.skel.h"  #include "test_ksyms_weak.skel.h" +#include "test_ksyms_weak.lskel.h"  static int duration; @@ -89,11 +90,11 @@ static void test_weak_syms(void)  	int err;  	skel = test_ksyms_weak__open_and_load(); -	if (CHECK(!skel, "test_ksyms_weak__open_and_load", "failed\n")) +	if (!ASSERT_OK_PTR(skel, "test_ksyms_weak__open_and_load"))  		return;  	err = test_ksyms_weak__attach(skel); -	if (CHECK(err, "test_ksyms_weak__attach", "skeleton attach failed: %d\n", err)) +	if (!ASSERT_OK(err, "test_ksyms_weak__attach"))  		goto cleanup;  	/* trigger tracepoint */ @@ -109,6 +110,33 @@ cleanup:  	test_ksyms_weak__destroy(skel);  } +static void test_weak_syms_lskel(void) +{ +	struct test_ksyms_weak_lskel *skel; +	struct test_ksyms_weak_lskel__data *data; +	int err; + +	skel = test_ksyms_weak_lskel__open_and_load(); +	if (!ASSERT_OK_PTR(skel, "test_ksyms_weak_lskel__open_and_load")) +		return; + +	err = test_ksyms_weak_lskel__attach(skel); +	if (!ASSERT_OK(err, "test_ksyms_weak_lskel__attach")) +		goto cleanup; + +	/* trigger tracepoint */ +	usleep(1); + +	data = skel->data; +	ASSERT_EQ(data->out__existing_typed, 0, "existing typed ksym"); +	ASSERT_NEQ(data->out__existing_typeless, -1, "existing typeless ksym"); +	ASSERT_EQ(data->out__non_existent_typeless, 0, "nonexistent typeless ksym"); +	ASSERT_EQ(data->out__non_existent_typed, 0, "nonexistent typed ksym"); + +cleanup: +	test_ksyms_weak_lskel__destroy(skel); +} +  void test_ksyms_btf(void)  {  	int percpu_datasec; @@ -136,4 +164,7 @@ void test_ksyms_btf(void)  	if (test__start_subtest("weak_ksyms"))  		test_weak_syms(); + +	if (test__start_subtest("weak_ksyms_lskel")) +		test_weak_syms_lskel();  } diff --git a/tools/testing/selftests/bpf/prog_tests/ksyms_module.c b/tools/testing/selftests/bpf/prog_tests/ksyms_module.c index 2cd5cded543f..d490ad80eccb 100644 --- a/tools/testing/selftests/bpf/prog_tests/ksyms_module.c +++ b/tools/testing/selftests/bpf/prog_tests/ksyms_module.c @@ -2,30 +2,61 @@  /* Copyright (c) 2021 Facebook */  #include <test_progs.h> -#include <bpf/libbpf.h> -#include <bpf/btf.h> +#include <network_helpers.h>  #include "test_ksyms_module.lskel.h" +#include "test_ksyms_module.skel.h" -static int duration; - -void test_ksyms_module(void) +void test_ksyms_module_lskel(void)  { -	struct test_ksyms_module* skel; +	struct test_ksyms_module_lskel *skel; +	int retval;  	int err; -	skel = test_ksyms_module__open_and_load(); -	if (CHECK(!skel, "skel_open", "failed to open skeleton\n")) +	if (!env.has_testmod) { +		test__skip();  		return; +	} -	err = test_ksyms_module__attach(skel); -	if (CHECK(err, "skel_attach", "skeleton attach failed: %d\n", err)) +	skel = test_ksyms_module_lskel__open_and_load(); +	if (!ASSERT_OK_PTR(skel, "test_ksyms_module_lskel__open_and_load")) +		return; +	err = bpf_prog_test_run(skel->progs.load.prog_fd, 1, &pkt_v4, sizeof(pkt_v4), +				NULL, NULL, (__u32 *)&retval, NULL); +	if (!ASSERT_OK(err, "bpf_prog_test_run"))  		goto cleanup; +	ASSERT_EQ(retval, 0, "retval"); +	ASSERT_EQ(skel->bss->out_bpf_testmod_ksym, 42, "bpf_testmod_ksym"); +cleanup: +	test_ksyms_module_lskel__destroy(skel); +} -	usleep(1); +void test_ksyms_module_libbpf(void) +{ +	struct test_ksyms_module *skel; +	int retval, err; -	ASSERT_EQ(skel->bss->triggered, true, "triggered"); -	ASSERT_EQ(skel->bss->out_mod_ksym_global, 123, "global_ksym_val"); +	if (!env.has_testmod) { +		test__skip(); +		return; +	} +	skel = test_ksyms_module__open_and_load(); +	if (!ASSERT_OK_PTR(skel, "test_ksyms_module__open")) +		return; +	err = bpf_prog_test_run(bpf_program__fd(skel->progs.load), 1, &pkt_v4, +				sizeof(pkt_v4), NULL, NULL, (__u32 *)&retval, NULL); +	if (!ASSERT_OK(err, "bpf_prog_test_run")) +		goto cleanup; +	ASSERT_EQ(retval, 0, "retval"); +	ASSERT_EQ(skel->bss->out_bpf_testmod_ksym, 42, "bpf_testmod_ksym");  cleanup:  	test_ksyms_module__destroy(skel);  } + +void test_ksyms_module(void) +{ +	if (test__start_subtest("lskel")) +		test_ksyms_module_lskel(); +	if (test__start_subtest("libbpf")) +		test_ksyms_module_libbpf(); +} diff --git a/tools/testing/selftests/bpf/prog_tests/migrate_reuseport.c b/tools/testing/selftests/bpf/prog_tests/migrate_reuseport.c index 59adb4715394..7589c03fd26b 100644 --- a/tools/testing/selftests/bpf/prog_tests/migrate_reuseport.c +++ b/tools/testing/selftests/bpf/prog_tests/migrate_reuseport.c @@ -541,7 +541,7 @@ close_servers:  	}  } -void test_migrate_reuseport(void) +void serial_test_migrate_reuseport(void)  {  	struct test_migrate_reuseport *skel;  	int i; diff --git a/tools/testing/selftests/bpf/prog_tests/modify_return.c b/tools/testing/selftests/bpf/prog_tests/modify_return.c index 97fec70c600b..b772fe30ce9b 100644 --- a/tools/testing/selftests/bpf/prog_tests/modify_return.c +++ b/tools/testing/selftests/bpf/prog_tests/modify_return.c @@ -53,7 +53,8 @@ cleanup:  	modify_return__destroy(skel);  } -void test_modify_return(void) +/* TODO: conflict with get_func_ip_test */ +void serial_test_modify_return(void)  {  	run_test(0 /* input_retval */,  		 1 /* want_side_effect */, diff --git a/tools/testing/selftests/bpf/prog_tests/module_attach.c b/tools/testing/selftests/bpf/prog_tests/module_attach.c index 1797a6e4d6d8..6d0e50dcf47c 100644 --- a/tools/testing/selftests/bpf/prog_tests/module_attach.c +++ b/tools/testing/selftests/bpf/prog_tests/module_attach.c @@ -2,10 +2,36 @@  /* Copyright (c) 2020 Facebook */  #include <test_progs.h> +#include <stdbool.h>  #include "test_module_attach.skel.h"  static int duration; +static int trigger_module_test_writable(int *val) +{ +	int fd, err; +	char buf[65]; +	ssize_t rd; + +	fd = open(BPF_TESTMOD_TEST_FILE, O_RDONLY); +	err = -errno; +	if (!ASSERT_GE(fd, 0, "testmode_file_open")) +		return err; + +	rd = read(fd, buf, sizeof(buf) - 1); +	err = -errno; +	if (!ASSERT_GT(rd, 0, "testmod_file_rd_val")) { +		close(fd); +		return err; +	} + +	buf[rd] = '\0'; +	*val = strtol(buf, NULL, 0); +	close(fd); + +	return 0; +} +  static int delete_module(const char *name, int flags)  {  	return syscall(__NR_delete_module, name, flags); @@ -19,6 +45,7 @@ void test_module_attach(void)  	struct test_module_attach__bss *bss;  	struct bpf_link *link;  	int err; +	int writable_val = 0;  	skel = test_module_attach__open();  	if (CHECK(!skel, "skel_open", "failed to open skeleton\n")) @@ -51,6 +78,14 @@ void test_module_attach(void)  	ASSERT_EQ(bss->fexit_ret, -EIO, "fexit_tet");  	ASSERT_EQ(bss->fmod_ret_read_sz, READ_SZ, "fmod_ret"); +	bss->raw_tp_writable_bare_early_ret = true; +	bss->raw_tp_writable_bare_out_val = 0xf1f2f3f4; +	ASSERT_OK(trigger_module_test_writable(&writable_val), +		  "trigger_writable"); +	ASSERT_EQ(bss->raw_tp_writable_bare_in_val, 1024, "writable_test_in"); +	ASSERT_EQ(bss->raw_tp_writable_bare_out_val, writable_val, +		  "writable_test_out"); +  	test_module_attach__detach(skel);  	/* attach fentry/fexit and make sure it get's module reference */ diff --git a/tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c b/tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c index 2535788e135f..24d493482ffc 100644 --- a/tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c +++ b/tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c @@ -78,7 +78,8 @@ static void test_ns_current_pid_tgid_new_ns(void)  		return;  } -void test_ns_current_pid_tgid(void) +/* TODO: use a different tracepoint */ +void serial_test_ns_current_pid_tgid(void)  {  	if (test__start_subtest("ns_current_pid_tgid_root_ns"))  		test_current_pid_tgid(NULL); diff --git a/tools/testing/selftests/bpf/prog_tests/perf_buffer.c b/tools/testing/selftests/bpf/prog_tests/perf_buffer.c index 6490e9673002..4e32f3586a75 100644 --- a/tools/testing/selftests/bpf/prog_tests/perf_buffer.c +++ b/tools/testing/selftests/bpf/prog_tests/perf_buffer.c @@ -43,9 +43,10 @@ int trigger_on_cpu(int cpu)  	return 0;  } -void test_perf_buffer(void) +void serial_test_perf_buffer(void)  { -	int err, on_len, nr_on_cpus = 0, nr_cpus, i; +	int err, on_len, nr_on_cpus = 0, nr_cpus, i, j; +	int zero = 0, my_pid = getpid();  	struct perf_buffer_opts pb_opts = {};  	struct test_perf_buffer *skel;  	cpu_set_t cpu_seen; @@ -71,6 +72,10 @@ void test_perf_buffer(void)  	if (CHECK(!skel, "skel_load", "skeleton open/load failed\n"))  		goto out_close; +	err = bpf_map_update_elem(bpf_map__fd(skel->maps.my_pid_map), &zero, &my_pid, 0); +	if (!ASSERT_OK(err, "my_pid_update")) +		goto out_close; +  	/* attach probe */  	err = test_perf_buffer__attach(skel);  	if (CHECK(err, "attach_kprobe", "err %d\n", err)) @@ -107,19 +112,19 @@ void test_perf_buffer(void)  		  "expect %d, seen %d\n", nr_on_cpus, CPU_COUNT(&cpu_seen)))  		goto out_free_pb; -	if (CHECK(perf_buffer__buffer_cnt(pb) != nr_cpus, "buf_cnt", -		  "got %zu, expected %d\n", perf_buffer__buffer_cnt(pb), nr_cpus)) +	if (CHECK(perf_buffer__buffer_cnt(pb) != nr_on_cpus, "buf_cnt", +		  "got %zu, expected %d\n", perf_buffer__buffer_cnt(pb), nr_on_cpus))  		goto out_close; -	for (i = 0; i < nr_cpus; i++) { +	for (i = 0, j = 0; i < nr_cpus; i++) {  		if (i >= on_len || !online[i])  			continue; -		fd = perf_buffer__buffer_fd(pb, i); +		fd = perf_buffer__buffer_fd(pb, j);  		CHECK(fd < 0 || last_fd == fd, "fd_check", "last fd %d == fd %d\n", last_fd, fd);  		last_fd = fd; -		err = perf_buffer__consume_buffer(pb, i); +		err = perf_buffer__consume_buffer(pb, j);  		if (CHECK(err, "drain_buf", "cpu %d, err %d\n", i, err))  			goto out_close; @@ -127,12 +132,13 @@ void test_perf_buffer(void)  		if (trigger_on_cpu(i))  			goto out_close; -		err = perf_buffer__consume_buffer(pb, i); -		if (CHECK(err, "consume_buf", "cpu %d, err %d\n", i, err)) +		err = perf_buffer__consume_buffer(pb, j); +		if (CHECK(err, "consume_buf", "cpu %d, err %d\n", j, err))  			goto out_close;  		if (CHECK(!CPU_ISSET(i, &cpu_seen), "cpu_seen", "cpu %d not seen\n", i))  			goto out_close; +		j++;  	}  out_free_pb: diff --git a/tools/testing/selftests/bpf/prog_tests/perf_link.c b/tools/testing/selftests/bpf/prog_tests/perf_link.c index b1abd0c46607..ede07344f264 100644 --- a/tools/testing/selftests/bpf/prog_tests/perf_link.c +++ b/tools/testing/selftests/bpf/prog_tests/perf_link.c @@ -23,7 +23,8 @@ static void burn_cpu(void)  		++j;  } -void test_perf_link(void) +/* TODO: often fails in concurrent mode */ +void serial_test_perf_link(void)  {  	struct test_perf_link *skel = NULL;  	struct perf_event_attr attr; diff --git a/tools/testing/selftests/bpf/prog_tests/probe_user.c b/tools/testing/selftests/bpf/prog_tests/probe_user.c index 52fe157e2a90..abf890d066eb 100644 --- a/tools/testing/selftests/bpf/prog_tests/probe_user.c +++ b/tools/testing/selftests/bpf/prog_tests/probe_user.c @@ -1,7 +1,8 @@  // SPDX-License-Identifier: GPL-2.0  #include <test_progs.h> -void test_probe_user(void) +/* TODO: corrupts other tests uses connect() */ +void serial_test_probe_user(void)  {  	const char *prog_name = "handle_sys_connect";  	const char *obj_file = "./test_probe_user.o"; diff --git a/tools/testing/selftests/bpf/prog_tests/raw_tp_writable_test_run.c b/tools/testing/selftests/bpf/prog_tests/raw_tp_writable_test_run.c index 5c45424cac5f..ddefa1192e5d 100644 --- a/tools/testing/selftests/bpf/prog_tests/raw_tp_writable_test_run.c +++ b/tools/testing/selftests/bpf/prog_tests/raw_tp_writable_test_run.c @@ -3,7 +3,8 @@  #include <test_progs.h>  #include <linux/nbd.h> -void test_raw_tp_writable_test_run(void) +/* NOTE: conflict with other tests. */ +void serial_test_raw_tp_writable_test_run(void)  {  	__u32 duration = 0;  	char error[4096]; diff --git a/tools/testing/selftests/bpf/prog_tests/rdonly_maps.c b/tools/testing/selftests/bpf/prog_tests/rdonly_maps.c index 5f9eaa3ab584..fd5d2ddfb062 100644 --- a/tools/testing/selftests/bpf/prog_tests/rdonly_maps.c +++ b/tools/testing/selftests/bpf/prog_tests/rdonly_maps.c @@ -37,7 +37,7 @@ void test_rdonly_maps(void)  	if (CHECK(err, "obj_load", "err %d errno %d\n", err, errno))  		goto cleanup; -	bss_map = bpf_object__find_map_by_name(obj, "test_rdo.bss"); +	bss_map = bpf_object__find_map_by_name(obj, ".bss");  	if (CHECK(!bss_map, "find_bss_map", "failed\n"))  		goto cleanup; diff --git a/tools/testing/selftests/bpf/prog_tests/recursion.c b/tools/testing/selftests/bpf/prog_tests/recursion.c index 0e378d63fe18..f3af2627b599 100644 --- a/tools/testing/selftests/bpf/prog_tests/recursion.c +++ b/tools/testing/selftests/bpf/prog_tests/recursion.c @@ -20,18 +20,18 @@ void test_recursion(void)  		goto out;  	ASSERT_EQ(skel->bss->pass1, 0, "pass1 == 0"); -	bpf_map_lookup_elem(bpf_map__fd(skel->maps.hash1), &key, 0); +	bpf_map_delete_elem(bpf_map__fd(skel->maps.hash1), &key);  	ASSERT_EQ(skel->bss->pass1, 1, "pass1 == 1"); -	bpf_map_lookup_elem(bpf_map__fd(skel->maps.hash1), &key, 0); +	bpf_map_delete_elem(bpf_map__fd(skel->maps.hash1), &key);  	ASSERT_EQ(skel->bss->pass1, 2, "pass1 == 2");  	ASSERT_EQ(skel->bss->pass2, 0, "pass2 == 0"); -	bpf_map_lookup_elem(bpf_map__fd(skel->maps.hash2), &key, 0); +	bpf_map_delete_elem(bpf_map__fd(skel->maps.hash2), &key);  	ASSERT_EQ(skel->bss->pass2, 1, "pass2 == 1"); -	bpf_map_lookup_elem(bpf_map__fd(skel->maps.hash2), &key, 0); +	bpf_map_delete_elem(bpf_map__fd(skel->maps.hash2), &key);  	ASSERT_EQ(skel->bss->pass2, 2, "pass2 == 2"); -	err = bpf_obj_get_info_by_fd(bpf_program__fd(skel->progs.on_lookup), +	err = bpf_obj_get_info_by_fd(bpf_program__fd(skel->progs.on_delete),  				     &prog_info, &prog_info_len);  	if (!ASSERT_OK(err, "get_prog_info"))  		goto out; diff --git a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c index f62361306f6d..f4a13d9dd5c8 100644 --- a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c +++ b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c @@ -106,9 +106,9 @@ static int resolve_symbols(void)  		  "Failed to load BTF from btf_data.o\n"))  		return -1; -	nr = btf__get_nr_types(btf); +	nr = btf__type_cnt(btf); -	for (type_id = 1; type_id <= nr; type_id++) { +	for (type_id = 1; type_id < nr; type_id++) {  		if (__resolve_symbol(btf, type_id))  			break;  	} @@ -117,14 +117,14 @@ static int resolve_symbols(void)  	return 0;  } -int test_resolve_btfids(void) +void test_resolve_btfids(void)  {  	__u32 *test_list, *test_lists[] = { test_list_local, test_list_global };  	unsigned int i, j;  	int ret = 0;  	if (resolve_symbols()) -		return -1; +		return;  	/* Check BTF_ID_LIST(test_list_local) and  	 * BTF_ID_LIST_GLOBAL(test_list_global) IDs @@ -138,7 +138,7 @@ int test_resolve_btfids(void)  				    test_symbols[i].name,  				    test_list[i], test_symbols[i].id);  			if (ret) -				return ret; +				return;  		}  	} @@ -161,9 +161,7 @@ int test_resolve_btfids(void)  		if (i > 0) {  			if (!ASSERT_LE(test_set.ids[i - 1], test_set.ids[i], "sort_check")) -				return -1; +				return;  		}  	} - -	return ret;  } diff --git a/tools/testing/selftests/bpf/prog_tests/ringbuf.c b/tools/testing/selftests/bpf/prog_tests/ringbuf.c index 4706cee84360..9a80fe8a6427 100644 --- a/tools/testing/selftests/bpf/prog_tests/ringbuf.c +++ b/tools/testing/selftests/bpf/prog_tests/ringbuf.c @@ -58,7 +58,7 @@ static int process_sample(void *ctx, void *data, size_t len)  	}  } -static struct test_ringbuf *skel; +static struct test_ringbuf_lskel *skel;  static struct ring_buffer *ringbuf;  static void trigger_samples() @@ -90,13 +90,13 @@ void test_ringbuf(void)  	int page_size = getpagesize();  	void *mmap_ptr, *tmp_ptr; -	skel = test_ringbuf__open(); +	skel = test_ringbuf_lskel__open();  	if (CHECK(!skel, "skel_open", "skeleton open failed\n"))  		return;  	skel->maps.ringbuf.max_entries = page_size; -	err = test_ringbuf__load(skel); +	err = test_ringbuf_lskel__load(skel);  	if (CHECK(err != 0, "skel_load", "skeleton load failed\n"))  		goto cleanup; @@ -154,7 +154,7 @@ void test_ringbuf(void)  	if (CHECK(!ringbuf, "ringbuf_create", "failed to create ringbuf\n"))  		goto cleanup; -	err = test_ringbuf__attach(skel); +	err = test_ringbuf_lskel__attach(skel);  	if (CHECK(err, "skel_attach", "skeleton attachment failed: %d\n", err))  		goto cleanup; @@ -292,8 +292,8 @@ void test_ringbuf(void)  	CHECK(skel->bss->discarded != 1, "err_discarded", "exp %ld, got %ld\n",  	      1L, skel->bss->discarded); -	test_ringbuf__detach(skel); +	test_ringbuf_lskel__detach(skel);  cleanup:  	ring_buffer__free(ringbuf); -	test_ringbuf__destroy(skel); +	test_ringbuf_lskel__destroy(skel);  } diff --git a/tools/testing/selftests/bpf/prog_tests/select_reuseport.c b/tools/testing/selftests/bpf/prog_tests/select_reuseport.c index 4efd337d6a3c..3cfc910ab3c1 100644 --- a/tools/testing/selftests/bpf/prog_tests/select_reuseport.c +++ b/tools/testing/selftests/bpf/prog_tests/select_reuseport.c @@ -114,7 +114,7 @@ static int prepare_bpf_obj(void)  	err = bpf_object__load(obj);  	RET_ERR(err, "load bpf_object", "err:%d\n", err); -	prog = bpf_program__next(NULL, obj); +	prog = bpf_object__next_program(obj, NULL);  	RET_ERR(!prog, "get first bpf_program", "!prog\n");  	select_by_skb_data_prog = bpf_program__fd(prog);  	RET_ERR(select_by_skb_data_prog < 0, "get prog fd", @@ -858,7 +858,7 @@ out:  	cleanup();  } -void test_select_reuseport(void) +void serial_test_select_reuseport(void)  {  	saved_tcp_fo = read_int_sysctl(TCP_FO_SYSCTL);  	if (saved_tcp_fo < 0) diff --git a/tools/testing/selftests/bpf/prog_tests/send_signal_sched_switch.c b/tools/testing/selftests/bpf/prog_tests/send_signal_sched_switch.c index 189a34a7addb..15dacfcfaa6d 100644 --- a/tools/testing/selftests/bpf/prog_tests/send_signal_sched_switch.c +++ b/tools/testing/selftests/bpf/prog_tests/send_signal_sched_switch.c @@ -25,7 +25,8 @@ static void *worker(void *p)  	return NULL;  } -void test_send_signal_sched_switch(void) +/* NOTE: cause events loss */ +void serial_test_send_signal_sched_switch(void)  {  	struct test_send_signal_kern *skel;  	pthread_t threads[THREAD_COUNT]; diff --git a/tools/testing/selftests/bpf/prog_tests/signal_pending.c b/tools/testing/selftests/bpf/prog_tests/signal_pending.c index dfcbddcbe4d3..fdfdcff6cbef 100644 --- a/tools/testing/selftests/bpf/prog_tests/signal_pending.c +++ b/tools/testing/selftests/bpf/prog_tests/signal_pending.c @@ -42,7 +42,7 @@ static void test_signal_pending_by_type(enum bpf_prog_type prog_type)  	signal(SIGALRM, SIG_DFL);  } -void test_signal_pending(enum bpf_prog_type prog_type) +void test_signal_pending(void)  {  	test_signal_pending_by_type(BPF_PROG_TYPE_SOCKET_FILTER);  	test_signal_pending_by_type(BPF_PROG_TYPE_FLOW_DISSECTOR); diff --git a/tools/testing/selftests/bpf/prog_tests/sk_lookup.c b/tools/testing/selftests/bpf/prog_tests/sk_lookup.c index aee41547e7f4..6db07401bc49 100644 --- a/tools/testing/selftests/bpf/prog_tests/sk_lookup.c +++ b/tools/testing/selftests/bpf/prog_tests/sk_lookup.c @@ -598,7 +598,7 @@ close:  static void run_lookup_prog(const struct test *t)  { -	int server_fds[MAX_SERVERS] = { -1 }; +	int server_fds[] = { [0 ... MAX_SERVERS - 1] = -1 };  	int client_fd, reuse_conn_fd = -1;  	struct bpf_link *lookup_link;  	int i, err; @@ -1053,7 +1053,7 @@ static void run_sk_assign(struct test_sk_lookup *skel,  			  struct bpf_program *lookup_prog,  			  const char *remote_ip, const char *local_ip)  { -	int server_fds[MAX_SERVERS] = { -1 }; +	int server_fds[] = { [0 ... MAX_SERVERS - 1] = -1 };  	struct bpf_sk_lookup ctx;  	__u64 server_cookie;  	int i, err; diff --git a/tools/testing/selftests/bpf/prog_tests/sk_storage_tracing.c b/tools/testing/selftests/bpf/prog_tests/sk_storage_tracing.c index 2b392590e8ca..547ae53cde74 100644 --- a/tools/testing/selftests/bpf/prog_tests/sk_storage_tracing.c +++ b/tools/testing/selftests/bpf/prog_tests/sk_storage_tracing.c @@ -105,7 +105,7 @@ out:  		close(listen_fd);  } -void test_sk_storage_tracing(void) +void serial_test_sk_storage_tracing(void)  {  	struct test_sk_storage_trace_itself *skel_itself;  	int err; diff --git a/tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c b/tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c new file mode 100644 index 000000000000..3eefdfed1db9 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/skc_to_unix_sock.c @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (c) 2021 Hengqi Chen */ + +#include <test_progs.h> +#include <sys/un.h> +#include "test_skc_to_unix_sock.skel.h" + +static const char *sock_path = "@skc_to_unix_sock"; + +void test_skc_to_unix_sock(void) +{ +	struct test_skc_to_unix_sock *skel; +	struct sockaddr_un sockaddr; +	int err, sockfd = 0; + +	skel = test_skc_to_unix_sock__open(); +	if (!ASSERT_OK_PTR(skel, "could not open BPF object")) +		return; + +	skel->rodata->my_pid = getpid(); + +	err = test_skc_to_unix_sock__load(skel); +	if (!ASSERT_OK(err, "could not load BPF object")) +		goto cleanup; + +	err = test_skc_to_unix_sock__attach(skel); +	if (!ASSERT_OK(err, "could not attach BPF object")) +		goto cleanup; + +	/* trigger unix_listen */ +	sockfd = socket(AF_UNIX, SOCK_STREAM, 0); +	if (!ASSERT_GT(sockfd, 0, "socket failed")) +		goto cleanup; + +	memset(&sockaddr, 0, sizeof(sockaddr)); +	sockaddr.sun_family = AF_UNIX; +	strncpy(sockaddr.sun_path, sock_path, strlen(sock_path)); +	sockaddr.sun_path[0] = '\0'; + +	err = bind(sockfd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)); +	if (!ASSERT_OK(err, "bind failed")) +		goto cleanup; + +	err = listen(sockfd, 1); +	if (!ASSERT_OK(err, "listen failed")) +		goto cleanup; + +	ASSERT_EQ(strcmp(skel->bss->path, sock_path), 0, "bpf_skc_to_unix_sock failed"); + +cleanup: +	if (sockfd) +		close(sockfd); +	test_skc_to_unix_sock__destroy(skel); +} diff --git a/tools/testing/selftests/bpf/prog_tests/skeleton.c b/tools/testing/selftests/bpf/prog_tests/skeleton.c index fe1e204a65c6..180afd632f4c 100644 --- a/tools/testing/selftests/bpf/prog_tests/skeleton.c +++ b/tools/testing/selftests/bpf/prog_tests/skeleton.c @@ -16,10 +16,13 @@ void test_skeleton(void)  	struct test_skeleton* skel;  	struct test_skeleton__bss *bss;  	struct test_skeleton__data *data; +	struct test_skeleton__data_dyn *data_dyn;  	struct test_skeleton__rodata *rodata; +	struct test_skeleton__rodata_dyn *rodata_dyn;  	struct test_skeleton__kconfig *kcfg;  	const void *elf_bytes;  	size_t elf_bytes_sz = 0; +	int i;  	skel = test_skeleton__open();  	if (CHECK(!skel, "skel_open", "failed to open skeleton\n")) @@ -30,7 +33,12 @@ void test_skeleton(void)  	bss = skel->bss;  	data = skel->data; +	data_dyn = skel->data_dyn;  	rodata = skel->rodata; +	rodata_dyn = skel->rodata_dyn; + +	ASSERT_STREQ(bpf_map__name(skel->maps.rodata_dyn), ".rodata.dyn", "rodata_dyn_name"); +	ASSERT_STREQ(bpf_map__name(skel->maps.data_dyn), ".data.dyn", "data_dyn_name");  	/* validate values are pre-initialized correctly */  	CHECK(data->in1 != -1, "in1", "got %d != exp %d\n", data->in1, -1); @@ -46,6 +54,12 @@ void test_skeleton(void)  	CHECK(rodata->in.in6 != 0, "in6", "got %d != exp %d\n", rodata->in.in6, 0);  	CHECK(bss->out6 != 0, "out6", "got %d != exp %d\n", bss->out6, 0); +	ASSERT_EQ(rodata_dyn->in_dynarr_sz, 0, "in_dynarr_sz"); +	for (i = 0; i < 4; i++) +		ASSERT_EQ(rodata_dyn->in_dynarr[i], -(i + 1), "in_dynarr"); +	for (i = 0; i < 4; i++) +		ASSERT_EQ(data_dyn->out_dynarr[i], i + 1, "out_dynarr"); +  	/* validate we can pre-setup global variables, even in .bss */  	data->in1 = 10;  	data->in2 = 11; @@ -53,6 +67,10 @@ void test_skeleton(void)  	bss->in4 = 13;  	rodata->in.in6 = 14; +	rodata_dyn->in_dynarr_sz = 4; +	for (i = 0; i < 4; i++) +		rodata_dyn->in_dynarr[i] = i + 10; +  	err = test_skeleton__load(skel);  	if (CHECK(err, "skel_load", "failed to load skeleton: %d\n", err))  		goto cleanup; @@ -64,6 +82,10 @@ void test_skeleton(void)  	CHECK(bss->in4 != 13, "in4", "got %lld != exp %lld\n", bss->in4, 13LL);  	CHECK(rodata->in.in6 != 14, "in6", "got %d != exp %d\n", rodata->in.in6, 14); +	ASSERT_EQ(rodata_dyn->in_dynarr_sz, 4, "in_dynarr_sz"); +	for (i = 0; i < 4; i++) +		ASSERT_EQ(rodata_dyn->in_dynarr[i], i + 10, "in_dynarr"); +  	/* now set new values and attach to get them into outX variables */  	data->in1 = 1;  	data->in2 = 2; @@ -73,6 +95,8 @@ void test_skeleton(void)  	bss->in5.b = 6;  	kcfg = skel->kconfig; +	skel->data_read_mostly->read_mostly_var = 123; +  	err = test_skeleton__attach(skel);  	if (CHECK(err, "skel_attach", "skeleton attach failed: %d\n", err))  		goto cleanup; @@ -93,6 +117,11 @@ void test_skeleton(void)  	CHECK(bss->kern_ver != kcfg->LINUX_KERNEL_VERSION, "ext2",  	      "got %d != exp %d\n", bss->kern_ver, kcfg->LINUX_KERNEL_VERSION); +	for (i = 0; i < 4; i++) +		ASSERT_EQ(data_dyn->out_dynarr[i], i + 10, "out_dynarr"); + +	ASSERT_EQ(skel->bss->out_mostly_var, 123, "out_mostly_var"); +  	elf_bytes = test_skeleton__elf_bytes(&elf_bytes_sz);  	ASSERT_OK_PTR(elf_bytes, "elf_bytes");  	ASSERT_GE(elf_bytes_sz, 0, "elf_bytes_sz"); diff --git a/tools/testing/selftests/bpf/prog_tests/snprintf.c b/tools/testing/selftests/bpf/prog_tests/snprintf.c index 8fd1b4b29a0e..394ebfc3bbf3 100644 --- a/tools/testing/selftests/bpf/prog_tests/snprintf.c +++ b/tools/testing/selftests/bpf/prog_tests/snprintf.c @@ -33,7 +33,7 @@  #define EXP_NO_BUF_RET 29 -void test_snprintf_positive(void) +static void test_snprintf_positive(void)  {  	char exp_addr_out[] = EXP_ADDR_OUT;  	char exp_sym_out[]  = EXP_SYM_OUT; @@ -103,7 +103,7 @@ static int load_single_snprintf(char *fmt)  	return ret;  } -void test_snprintf_negative(void) +static void test_snprintf_negative(void)  {  	ASSERT_OK(load_single_snprintf("valid %d"), "valid usage"); diff --git a/tools/testing/selftests/bpf/prog_tests/snprintf_btf.c b/tools/testing/selftests/bpf/prog_tests/snprintf_btf.c index 76e1f5fe18fa..dd41b826be30 100644 --- a/tools/testing/selftests/bpf/prog_tests/snprintf_btf.c +++ b/tools/testing/selftests/bpf/prog_tests/snprintf_btf.c @@ -6,7 +6,7 @@  /* Demonstrate that bpf_snprintf_btf succeeds and that various data types   * are formatted correctly.   */ -void test_snprintf_btf(void) +void serial_test_snprintf_btf(void)  {  	struct netif_receive_skb *skel;  	struct netif_receive_skb__bss *bss; diff --git a/tools/testing/selftests/bpf/prog_tests/sock_fields.c b/tools/testing/selftests/bpf/prog_tests/sock_fields.c index 577d619fb07e..fae40db4d81f 100644 --- a/tools/testing/selftests/bpf/prog_tests/sock_fields.c +++ b/tools/testing/selftests/bpf/prog_tests/sock_fields.c @@ -329,7 +329,7 @@ done:  		close(listen_fd);  } -void test_sock_fields(void) +void serial_test_sock_fields(void)  {  	struct bpf_link *egress_link = NULL, *ingress_link = NULL;  	int parent_cg_fd = -1, child_cg_fd = -1; diff --git a/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c b/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c index d88bb65b74cc..2a9cb951bfd6 100644 --- a/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c +++ b/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c @@ -2002,7 +2002,7 @@ static void run_tests(struct test_sockmap_listen *skel, struct bpf_map *map,  	test_udp_unix_redir(skel, map, family);  } -void test_sockmap_listen(void) +void serial_test_sockmap_listen(void)  {  	struct test_sockmap_listen *skel; diff --git a/tools/testing/selftests/bpf/prog_tests/tc_redirect.c b/tools/testing/selftests/bpf/prog_tests/tc_redirect.c index e87bc4466d9a..4b18b73df10b 100644 --- a/tools/testing/selftests/bpf/prog_tests/tc_redirect.c +++ b/tools/testing/selftests/bpf/prog_tests/tc_redirect.c @@ -176,6 +176,18 @@ static int netns_setup_namespaces(const char *verb)  	return 0;  } +static void netns_setup_namespaces_nofail(const char *verb) +{ +	const char * const *ns = namespaces; +	char cmd[128]; + +	while (*ns) { +		snprintf(cmd, sizeof(cmd), "ip netns %s %s > /dev/null 2>&1", verb, *ns); +		system(cmd); +		ns++; +	} +} +  struct netns_setup_result {  	int ifindex_veth_src_fwd;  	int ifindex_veth_dst_fwd; @@ -762,6 +774,8 @@ fail:  static void *test_tc_redirect_run_tests(void *arg)  { +	netns_setup_namespaces_nofail("delete"); +  	RUN_TEST(tc_redirect_peer);  	RUN_TEST(tc_redirect_peer_l3);  	RUN_TEST(tc_redirect_neigh); @@ -769,7 +783,7 @@ static void *test_tc_redirect_run_tests(void *arg)  	return NULL;  } -void test_tc_redirect(void) +void serial_test_tc_redirect(void)  {  	pthread_t test_thread;  	int err; diff --git a/tools/testing/selftests/bpf/prog_tests/tcp_rtt.c b/tools/testing/selftests/bpf/prog_tests/tcp_rtt.c index d207e968e6b1..265b4fe33ec3 100644 --- a/tools/testing/selftests/bpf/prog_tests/tcp_rtt.c +++ b/tools/testing/selftests/bpf/prog_tests/tcp_rtt.c @@ -109,7 +109,7 @@ static int run_test(int cgroup_fd, int server_fd)  		return -1;  	} -	map = bpf_map__next(NULL, obj); +	map = bpf_object__next_map(obj, NULL);  	map_fd = bpf_map__fd(map);  	err = bpf_prog_attach(prog_fd, cgroup_fd, BPF_CGROUP_SOCK_OPS, 0); diff --git a/tools/testing/selftests/bpf/prog_tests/test_ima.c b/tools/testing/selftests/bpf/prog_tests/test_ima.c index 0252f61d611a..97d8a6f84f4a 100644 --- a/tools/testing/selftests/bpf/prog_tests/test_ima.c +++ b/tools/testing/selftests/bpf/prog_tests/test_ima.c @@ -43,7 +43,7 @@ static int process_sample(void *ctx, void *data, size_t len)  void test_test_ima(void)  {  	char measured_dir_template[] = "/tmp/ima_measuredXXXXXX"; -	struct ring_buffer *ringbuf; +	struct ring_buffer *ringbuf = NULL;  	const char *measured_dir;  	char cmd[256]; @@ -85,5 +85,6 @@ close_clean:  	err = system(cmd);  	CHECK(err, "failed to run command", "%s, errno = %d\n", cmd, errno);  close_prog: +	ring_buffer__free(ringbuf);  	ima__destroy(skel);  } diff --git a/tools/testing/selftests/bpf/prog_tests/timer.c b/tools/testing/selftests/bpf/prog_tests/timer.c index 25f40e1b9967..0f4e49e622cd 100644 --- a/tools/testing/selftests/bpf/prog_tests/timer.c +++ b/tools/testing/selftests/bpf/prog_tests/timer.c @@ -39,7 +39,8 @@ static int timer(struct timer *timer_skel)  	return 0;  } -void test_timer(void) +/* TODO: use pid filtering */ +void serial_test_timer(void)  {  	struct timer *timer_skel = NULL;  	int err; diff --git a/tools/testing/selftests/bpf/prog_tests/timer_mim.c b/tools/testing/selftests/bpf/prog_tests/timer_mim.c index ced8f6cf347c..949a0617869d 100644 --- a/tools/testing/selftests/bpf/prog_tests/timer_mim.c +++ b/tools/testing/selftests/bpf/prog_tests/timer_mim.c @@ -52,7 +52,7 @@ static int timer_mim(struct timer_mim *timer_skel)  	return 0;  } -void test_timer_mim(void) +void serial_test_timer_mim(void)  {  	struct timer_mim_reject *timer_reject_skel = NULL;  	libbpf_print_fn_t old_print_fn = NULL; diff --git a/tools/testing/selftests/bpf/prog_tests/tp_attach_query.c b/tools/testing/selftests/bpf/prog_tests/tp_attach_query.c index fb095e5cd9af..8652d0a46c87 100644 --- a/tools/testing/selftests/bpf/prog_tests/tp_attach_query.c +++ b/tools/testing/selftests/bpf/prog_tests/tp_attach_query.c @@ -1,7 +1,7 @@  // SPDX-License-Identifier: GPL-2.0  #include <test_progs.h> -void test_tp_attach_query(void) +void serial_test_tp_attach_query(void)  {  	const int num_progs = 3;  	int i, j, bytes, efd, err, prog_fd[num_progs], pmu_fd[num_progs]; diff --git a/tools/testing/selftests/bpf/prog_tests/trace_printk.c b/tools/testing/selftests/bpf/prog_tests/trace_printk.c index e47835f0a674..cade7f12315f 100644 --- a/tools/testing/selftests/bpf/prog_tests/trace_printk.c +++ b/tools/testing/selftests/bpf/prog_tests/trace_printk.c @@ -8,29 +8,29 @@  #define TRACEBUF	"/sys/kernel/debug/tracing/trace_pipe"  #define SEARCHMSG	"testing,testing" -void test_trace_printk(void) +void serial_test_trace_printk(void)  { +	struct trace_printk_lskel__bss *bss;  	int err = 0, iter = 0, found = 0; -	struct trace_printk__bss *bss; -	struct trace_printk *skel; +	struct trace_printk_lskel *skel;  	char *buf = NULL;  	FILE *fp = NULL;  	size_t buflen; -	skel = trace_printk__open(); +	skel = trace_printk_lskel__open();  	if (!ASSERT_OK_PTR(skel, "trace_printk__open"))  		return;  	ASSERT_EQ(skel->rodata->fmt[0], 'T', "skel->rodata->fmt[0]");  	skel->rodata->fmt[0] = 't'; -	err = trace_printk__load(skel); +	err = trace_printk_lskel__load(skel);  	if (!ASSERT_OK(err, "trace_printk__load"))  		goto cleanup;  	bss = skel->bss; -	err = trace_printk__attach(skel); +	err = trace_printk_lskel__attach(skel);  	if (!ASSERT_OK(err, "trace_printk__attach"))  		goto cleanup; @@ -43,7 +43,7 @@ void test_trace_printk(void)  	/* wait for tracepoint to trigger */  	usleep(1); -	trace_printk__detach(skel); +	trace_printk_lskel__detach(skel);  	if (!ASSERT_GT(bss->trace_printk_ran, 0, "bss->trace_printk_ran"))  		goto cleanup; @@ -65,7 +65,7 @@ void test_trace_printk(void)  		goto cleanup;  cleanup: -	trace_printk__destroy(skel); +	trace_printk_lskel__destroy(skel);  	free(buf);  	if (fp)  		fclose(fp); diff --git a/tools/testing/selftests/bpf/prog_tests/trace_vprintk.c b/tools/testing/selftests/bpf/prog_tests/trace_vprintk.c index 61a24e62e1a0..7a4e313e8558 100644 --- a/tools/testing/selftests/bpf/prog_tests/trace_vprintk.c +++ b/tools/testing/selftests/bpf/prog_tests/trace_vprintk.c @@ -8,22 +8,22 @@  #define TRACEBUF	"/sys/kernel/debug/tracing/trace_pipe"  #define SEARCHMSG	"1,2,3,4,5,6,7,8,9,10" -void test_trace_vprintk(void) +void serial_test_trace_vprintk(void)  { +	struct trace_vprintk_lskel__bss *bss;  	int err = 0, iter = 0, found = 0; -	struct trace_vprintk__bss *bss; -	struct trace_vprintk *skel; +	struct trace_vprintk_lskel *skel;  	char *buf = NULL;  	FILE *fp = NULL;  	size_t buflen; -	skel = trace_vprintk__open_and_load(); +	skel = trace_vprintk_lskel__open_and_load();  	if (!ASSERT_OK_PTR(skel, "trace_vprintk__open_and_load"))  		goto cleanup;  	bss = skel->bss; -	err = trace_vprintk__attach(skel); +	err = trace_vprintk_lskel__attach(skel);  	if (!ASSERT_OK(err, "trace_vprintk__attach"))  		goto cleanup; @@ -36,7 +36,7 @@ void test_trace_vprintk(void)  	/* wait for tracepoint to trigger */  	usleep(1); -	trace_vprintk__detach(skel); +	trace_vprintk_lskel__detach(skel);  	if (!ASSERT_GT(bss->trace_vprintk_ran, 0, "bss->trace_vprintk_ran"))  		goto cleanup; @@ -61,7 +61,7 @@ void test_trace_vprintk(void)  		goto cleanup;  cleanup: -	trace_vprintk__destroy(skel); +	trace_vprintk_lskel__destroy(skel);  	free(buf);  	if (fp)  		fclose(fp); diff --git a/tools/testing/selftests/bpf/prog_tests/trampoline_count.c b/tools/testing/selftests/bpf/prog_tests/trampoline_count.c index d7f5a931d7f3..fc146671b20a 100644 --- a/tools/testing/selftests/bpf/prog_tests/trampoline_count.c +++ b/tools/testing/selftests/bpf/prog_tests/trampoline_count.c @@ -41,7 +41,8 @@ static struct bpf_link *load(struct bpf_object *obj, const char *name)  	return bpf_program__attach_trace(prog);  } -void test_trampoline_count(void) +/* TODO: use different target function to run in concurrent mode */ +void serial_test_trampoline_count(void)  {  	const char *fentry_name = "fentry/__set_task_comm";  	const char *fexit_name = "fexit/__set_task_comm"; diff --git a/tools/testing/selftests/bpf/prog_tests/verif_stats.c b/tools/testing/selftests/bpf/prog_tests/verif_stats.c new file mode 100644 index 000000000000..a47e7c0e1ffd --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/verif_stats.c @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2021 Facebook */ + +#include <test_progs.h> + +#include "trace_vprintk.lskel.h" + +void test_verif_stats(void) +{ +	__u32 len = sizeof(struct bpf_prog_info); +	struct trace_vprintk_lskel *skel; +	struct bpf_prog_info info = {}; +	int err; + +	skel = trace_vprintk_lskel__open_and_load(); +	if (!ASSERT_OK_PTR(skel, "trace_vprintk__open_and_load")) +		goto cleanup; + +	err = bpf_obj_get_info_by_fd(skel->progs.sys_enter.prog_fd, &info, &len); +	if (!ASSERT_OK(err, "bpf_obj_get_info_by_fd")) +		goto cleanup; + +	if (!ASSERT_GT(info.verified_insns, 0, "verified_insns")) +		goto cleanup; + +cleanup: +	trace_vprintk_lskel__destroy(skel); +} diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c b/tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c index d5c98f2cb12f..f529e3c923ae 100644 --- a/tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c +++ b/tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c @@ -2,7 +2,7 @@  #include <test_progs.h>  #include <network_helpers.h> -void test_xdp_adjust_tail_shrink(void) +static void test_xdp_adjust_tail_shrink(void)  {  	const char *file = "./test_xdp_adjust_tail_shrink.o";  	__u32 duration, retval, size, expect_sz; @@ -30,7 +30,7 @@ void test_xdp_adjust_tail_shrink(void)  	bpf_object__close(obj);  } -void test_xdp_adjust_tail_grow(void) +static void test_xdp_adjust_tail_grow(void)  {  	const char *file = "./test_xdp_adjust_tail_grow.o";  	struct bpf_object *obj; @@ -58,7 +58,7 @@ void test_xdp_adjust_tail_grow(void)  	bpf_object__close(obj);  } -void test_xdp_adjust_tail_grow2(void) +static void test_xdp_adjust_tail_grow2(void)  {  	const char *file = "./test_xdp_adjust_tail_grow.o";  	char buf[4096]; /* avoid segfault: large buf to hold grow results */ diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_attach.c b/tools/testing/selftests/bpf/prog_tests/xdp_attach.c index 15ef3531483e..4c4057262cd8 100644 --- a/tools/testing/selftests/bpf/prog_tests/xdp_attach.c +++ b/tools/testing/selftests/bpf/prog_tests/xdp_attach.c @@ -4,7 +4,7 @@  #define IFINDEX_LO 1  #define XDP_FLAGS_REPLACE		(1U << 4) -void test_xdp_attach(void) +void serial_test_xdp_attach(void)  {  	__u32 duration = 0, id1, id2, id0 = 0, len;  	struct bpf_object *obj1, *obj2, *obj3; diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_bonding.c b/tools/testing/selftests/bpf/prog_tests/xdp_bonding.c index ad3ba81b4048..faa22b84f2ee 100644 --- a/tools/testing/selftests/bpf/prog_tests/xdp_bonding.c +++ b/tools/testing/selftests/bpf/prog_tests/xdp_bonding.c @@ -519,7 +519,7 @@ static struct bond_test_case bond_test_cases[] = {  	{ "xdp_bonding_xor_layer34", BOND_MODE_XOR, BOND_XMIT_POLICY_LAYER34, },  }; -void test_xdp_bonding(void) +void serial_test_xdp_bonding(void)  {  	libbpf_print_fn_t old_print_fn;  	struct skeletons skeletons = {}; diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_cpumap_attach.c b/tools/testing/selftests/bpf/prog_tests/xdp_cpumap_attach.c index 8755effd80b0..fd812bd43600 100644 --- a/tools/testing/selftests/bpf/prog_tests/xdp_cpumap_attach.c +++ b/tools/testing/selftests/bpf/prog_tests/xdp_cpumap_attach.c @@ -7,7 +7,7 @@  #define IFINDEX_LO	1 -void test_xdp_cpumap_attach(void) +void serial_test_xdp_cpumap_attach(void)  {  	struct test_xdp_with_cpumap_helpers *skel;  	struct bpf_prog_info info = {}; diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c b/tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c index c72af030ff10..3079d5568f8f 100644 --- a/tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c +++ b/tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c @@ -8,7 +8,7 @@  #define IFINDEX_LO 1 -void test_xdp_with_devmap_helpers(void) +static void test_xdp_with_devmap_helpers(void)  {  	struct test_xdp_with_devmap_helpers *skel;  	struct bpf_prog_info info = {}; @@ -60,7 +60,7 @@ out_close:  	test_xdp_with_devmap_helpers__destroy(skel);  } -void test_neg_xdp_devmap_helpers(void) +static void test_neg_xdp_devmap_helpers(void)  {  	struct test_xdp_devmap_helpers *skel; @@ -72,7 +72,7 @@ void test_neg_xdp_devmap_helpers(void)  } -void test_xdp_devmap_attach(void) +void serial_test_xdp_devmap_attach(void)  {  	if (test__start_subtest("DEVMAP with programs in entries"))  		test_xdp_with_devmap_helpers(); diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_info.c b/tools/testing/selftests/bpf/prog_tests/xdp_info.c index d2d7a283d72f..4e2a4fd56f67 100644 --- a/tools/testing/selftests/bpf/prog_tests/xdp_info.c +++ b/tools/testing/selftests/bpf/prog_tests/xdp_info.c @@ -4,7 +4,7 @@  #define IFINDEX_LO 1 -void test_xdp_info(void) +void serial_test_xdp_info(void)  {  	__u32 len = sizeof(struct bpf_prog_info), duration = 0, prog_id;  	const char *file = "./xdp_dummy.o"; diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_link.c b/tools/testing/selftests/bpf/prog_tests/xdp_link.c index 46eed0a33c23..983ab0b47d30 100644 --- a/tools/testing/selftests/bpf/prog_tests/xdp_link.c +++ b/tools/testing/selftests/bpf/prog_tests/xdp_link.c @@ -6,7 +6,7 @@  #define IFINDEX_LO 1 -void test_xdp_link(void) +void serial_test_xdp_link(void)  {  	__u32 duration = 0, id1, id2, id0 = 0, prog_fd1, prog_fd2, err;  	DECLARE_LIBBPF_OPTS(bpf_xdp_set_link_opts, opts, .old_fd = -1); |