xref: /openbmc/linux/tools/testing/selftests/bpf/prog_tests/timer_mim.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
161f71e74SAlexei Starovoitov // SPDX-License-Identifier: GPL-2.0
261f71e74SAlexei Starovoitov /* Copyright (c) 2021 Facebook */
361f71e74SAlexei Starovoitov #include <test_progs.h>
461f71e74SAlexei Starovoitov #include "timer_mim.skel.h"
561f71e74SAlexei Starovoitov #include "timer_mim_reject.skel.h"
661f71e74SAlexei Starovoitov 
timer_mim(struct timer_mim * timer_skel)761f71e74SAlexei Starovoitov static int timer_mim(struct timer_mim *timer_skel)
861f71e74SAlexei Starovoitov {
961f71e74SAlexei Starovoitov 	__u64 cnt1, cnt2;
1061f71e74SAlexei Starovoitov 	int err, prog_fd, key1 = 1;
1104fcb5f9SDelyan Kratunov 	LIBBPF_OPTS(bpf_test_run_opts, topts);
1261f71e74SAlexei Starovoitov 
1361f71e74SAlexei Starovoitov 	err = timer_mim__attach(timer_skel);
1461f71e74SAlexei Starovoitov 	if (!ASSERT_OK(err, "timer_attach"))
1561f71e74SAlexei Starovoitov 		return err;
1661f71e74SAlexei Starovoitov 
1761f71e74SAlexei Starovoitov 	prog_fd = bpf_program__fd(timer_skel->progs.test1);
1804fcb5f9SDelyan Kratunov 	err = bpf_prog_test_run_opts(prog_fd, &topts);
1961f71e74SAlexei Starovoitov 	ASSERT_OK(err, "test_run");
2004fcb5f9SDelyan Kratunov 	ASSERT_EQ(topts.retval, 0, "test_run");
2161f71e74SAlexei Starovoitov 	timer_mim__detach(timer_skel);
2261f71e74SAlexei Starovoitov 
2361f71e74SAlexei Starovoitov 	/* check that timer_cb[12] are incrementing 'cnt' */
2461f71e74SAlexei Starovoitov 	cnt1 = READ_ONCE(timer_skel->bss->cnt);
25a6258837SYucong Sun 	for (int i = 0; i < 100; i++) {
2661f71e74SAlexei Starovoitov 		cnt2 = READ_ONCE(timer_skel->bss->cnt);
27a6258837SYucong Sun 		if (cnt2 != cnt1)
28a6258837SYucong Sun 			break;
29a6258837SYucong Sun 		usleep(200); /* 100 times more than interval */
30a6258837SYucong Sun 	}
3161f71e74SAlexei Starovoitov 	ASSERT_GT(cnt2, cnt1, "cnt");
3261f71e74SAlexei Starovoitov 
3361f71e74SAlexei Starovoitov 	ASSERT_EQ(timer_skel->bss->err, 0, "err");
3461f71e74SAlexei Starovoitov 	/* check that code paths completed */
3561f71e74SAlexei Starovoitov 	ASSERT_EQ(timer_skel->bss->ok, 1 | 2, "ok");
3661f71e74SAlexei Starovoitov 
3761f71e74SAlexei Starovoitov 	close(bpf_map__fd(timer_skel->maps.inner_htab));
38*b2531d4bSAndrii Nakryiko 	err = bpf_map__delete_elem(timer_skel->maps.outer_arr, &key1, sizeof(key1), 0);
3961f71e74SAlexei Starovoitov 	ASSERT_EQ(err, 0, "delete inner map");
4061f71e74SAlexei Starovoitov 
4161f71e74SAlexei Starovoitov 	/* check that timer_cb[12] are no longer running */
4261f71e74SAlexei Starovoitov 	cnt1 = READ_ONCE(timer_skel->bss->cnt);
43a6258837SYucong Sun 	for (int i = 0; i < 100; i++) {
44a6258837SYucong Sun 		usleep(200); /* 100 times more than interval */
4561f71e74SAlexei Starovoitov 		cnt2 = READ_ONCE(timer_skel->bss->cnt);
46a6258837SYucong Sun 		if (cnt2 == cnt1)
47a6258837SYucong Sun 			break;
48a6258837SYucong Sun 	}
4961f71e74SAlexei Starovoitov 	ASSERT_EQ(cnt2, cnt1, "cnt");
5061f71e74SAlexei Starovoitov 
5161f71e74SAlexei Starovoitov 	return 0;
5261f71e74SAlexei Starovoitov }
5361f71e74SAlexei Starovoitov 
serial_test_timer_mim(void)54d3f7b166SYucong Sun void serial_test_timer_mim(void)
5561f71e74SAlexei Starovoitov {
5661f71e74SAlexei Starovoitov 	struct timer_mim_reject *timer_reject_skel = NULL;
5761f71e74SAlexei Starovoitov 	libbpf_print_fn_t old_print_fn = NULL;
5861f71e74SAlexei Starovoitov 	struct timer_mim *timer_skel = NULL;
5961f71e74SAlexei Starovoitov 	int err;
6061f71e74SAlexei Starovoitov 
6161f71e74SAlexei Starovoitov 	old_print_fn = libbpf_set_print(NULL);
6261f71e74SAlexei Starovoitov 	timer_reject_skel = timer_mim_reject__open_and_load();
6361f71e74SAlexei Starovoitov 	libbpf_set_print(old_print_fn);
6461f71e74SAlexei Starovoitov 	if (!ASSERT_ERR_PTR(timer_reject_skel, "timer_reject_skel_load"))
6561f71e74SAlexei Starovoitov 		goto cleanup;
6661f71e74SAlexei Starovoitov 
6761f71e74SAlexei Starovoitov 	timer_skel = timer_mim__open_and_load();
6861f71e74SAlexei Starovoitov 	if (!ASSERT_OK_PTR(timer_skel, "timer_skel_load"))
6961f71e74SAlexei Starovoitov 		goto cleanup;
7061f71e74SAlexei Starovoitov 
7161f71e74SAlexei Starovoitov 	err = timer_mim(timer_skel);
7261f71e74SAlexei Starovoitov 	ASSERT_OK(err, "timer_mim");
7361f71e74SAlexei Starovoitov cleanup:
7461f71e74SAlexei Starovoitov 	timer_mim__destroy(timer_skel);
7561f71e74SAlexei Starovoitov 	timer_mim_reject__destroy(timer_reject_skel);
7661f71e74SAlexei Starovoitov }
77