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