tools/testing/selftests/bpf/prog_tests/tailcalls.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/prog_tests/tailcalls.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/bpf/prog_tests/tailcalls.c
Extension
.c
Size
55912 bytes
Lines
1971
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

if (!ASSERT_OK(err, "bpf_map__pin")) {
			tailcall_poke__destroy(test);
			break;
		}

		bpf_program__set_autoload(test->progs.test, true);
		bpf_program__set_autoload(test->progs.call1, false);
		bpf_program__set_autoload(test->progs.call2, false);

		err = tailcall_poke__load(test);
		tailcall_poke__destroy(test);
		if (!ASSERT_OK(err, "tailcall_poke__load"))
			break;
	}

	poke_thread_exit = 1;
	ASSERT_OK(pthread_join(thread, NULL), "pthread_join");

out:
	bpf_map__unpin(call->maps.jmp_table, JMP_TABLE);
	tailcall_poke__destroy(call);
}

static void test_tailcall_hierarchy_count(const char *which, bool test_fentry,
					  bool test_fexit,
					  bool test_fentry_entry)
{
	int err, map_fd, prog_fd, main_data_fd, fentry_data_fd = 0, fexit_data_fd = 0, i, val;
	struct bpf_object *obj = NULL, *fentry_obj = NULL, *fexit_obj = NULL;
	struct bpf_link *fentry_link = NULL, *fexit_link = NULL;
	struct bpf_program *prog, *fentry_prog;
	struct bpf_map *prog_array, *data_map;
	int fentry_prog_fd;
	char buff[128] = {};

	LIBBPF_OPTS(bpf_test_run_opts, topts,
		.data_in = buff,
		.data_size_in = sizeof(buff),
		.repeat = 1,
	);

	err = bpf_prog_test_load(which, BPF_PROG_TYPE_SCHED_CLS, &obj,
				 &prog_fd);
	if (!ASSERT_OK(err, "load obj"))
		return;

	prog = bpf_object__find_program_by_name(obj, "entry");
	if (!ASSERT_OK_PTR(prog, "find entry prog"))
		goto out;

	prog_fd = bpf_program__fd(prog);
	if (!ASSERT_GE(prog_fd, 0, "prog_fd"))
		goto out;

	if (test_fentry_entry) {
		fentry_obj = bpf_object__open_file("tailcall_bpf2bpf_hierarchy_fentry.bpf.o",
						   NULL);
		if (!ASSERT_OK_PTR(fentry_obj, "open fentry_obj file"))
			goto out;

		fentry_prog = bpf_object__find_program_by_name(fentry_obj,
							       "fentry");
		if (!ASSERT_OK_PTR(prog, "find fentry prog"))
			goto out;

		err = bpf_program__set_attach_target(fentry_prog, prog_fd,
						     "entry");
		if (!ASSERT_OK(err, "set_attach_target entry"))
			goto out;

		err = bpf_object__load(fentry_obj);
		if (!ASSERT_OK(err, "load fentry_obj"))
			goto out;

		fentry_link = bpf_program__attach_trace(fentry_prog);
		if (!ASSERT_OK_PTR(fentry_link, "attach_trace"))
			goto out;

		fentry_prog_fd = bpf_program__fd(fentry_prog);
		if (!ASSERT_GE(fentry_prog_fd, 0, "fentry_prog_fd"))
			goto out;

		prog_array = bpf_object__find_map_by_name(fentry_obj, "jmp_table");
		if (!ASSERT_OK_PTR(prog_array, "find jmp_table"))
			goto out;

		map_fd = bpf_map__fd(prog_array);
		if (!ASSERT_GE(map_fd, 0, "map_fd"))
			goto out;

Annotation

Implementation Notes