Commit 10653c0d authored by Mykyta Yatsenko's avatar Mykyta Yatsenko Committed by Andrii Nakryiko
Browse files

selftests/bpf: Refactor timer selftests



Refactor timer selftests, extracting stress test into a separate test.
This makes it easier to debug test failures and allows to extend.

Signed-off-by: default avatarMykyta Yatsenko <yatsenko@meta.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20260201025403.66625-5-alexei.starovoitov@gmail.com
parent a7e172aa
Loading
Loading
Loading
Loading
+36 −19
Original line number Diff line number Diff line
@@ -22,13 +22,35 @@ static void *spin_lock_thread(void *arg)
	pthread_exit(arg);
}

static int timer(struct timer *timer_skel)

static int timer_stress(struct timer *timer_skel)
{
	int i, err, prog_fd;
	int i, err = 1, prog_fd;
	LIBBPF_OPTS(bpf_test_run_opts, topts);
	pthread_t thread_id[NUM_THR];
	void *ret;

	prog_fd = bpf_program__fd(timer_skel->progs.race);
	for (i = 0; i < NUM_THR; i++) {
		err = pthread_create(&thread_id[i], NULL,
				     &spin_lock_thread, &prog_fd);
		if (!ASSERT_OK(err, "pthread_create"))
			break;
	}

	while (i) {
		err = pthread_join(thread_id[--i], &ret);
		if (ASSERT_OK(err, "pthread_join"))
			ASSERT_EQ(ret, (void *)&prog_fd, "pthread_join");
	}
	return err;
}

static int timer(struct timer *timer_skel)
{
	int err, prog_fd;
	LIBBPF_OPTS(bpf_test_run_opts, topts);

	err = timer__attach(timer_skel);
	if (!ASSERT_OK(err, "timer_attach"))
		return err;
@@ -63,25 +85,10 @@ static int timer(struct timer *timer_skel)
	/* check that code paths completed */
	ASSERT_EQ(timer_skel->bss->ok, 1 | 2 | 4, "ok");

	prog_fd = bpf_program__fd(timer_skel->progs.race);
	for (i = 0; i < NUM_THR; i++) {
		err = pthread_create(&thread_id[i], NULL,
				     &spin_lock_thread, &prog_fd);
		if (!ASSERT_OK(err, "pthread_create"))
			break;
	}

	while (i) {
		err = pthread_join(thread_id[--i], &ret);
		if (ASSERT_OK(err, "pthread_join"))
			ASSERT_EQ(ret, (void *)&prog_fd, "pthread_join");
	}

	return 0;
}

/* TODO: use pid filtering */
void serial_test_timer(void)
static void test_timer(int (*timer_test_fn)(struct timer *timer_skel))
{
	struct timer *timer_skel = NULL;
	int err;
@@ -94,13 +101,23 @@ void serial_test_timer(void)
	if (!ASSERT_OK_PTR(timer_skel, "timer_skel_load"))
		return;

	err = timer(timer_skel);
	err = timer_test_fn(timer_skel);
	ASSERT_OK(err, "timer");
	timer__destroy(timer_skel);
}

void serial_test_timer(void)
{
	test_timer(timer);

	RUN_TESTS(timer_failure);
}

void serial_test_timer_stress(void)
{
	test_timer(timer_stress);
}

void test_timer_interrupt(void)
{
	struct timer_interrupt *skel = NULL;