From 7d761b07fcf6d9045f0658b5da2eabb775ec0a27 Mon Sep 17 00:00:00 2001 From: Shijith Thotton Date: Wed, 17 Mar 2021 13:34:20 +0530 Subject: [PATCH] test/event: add unit tests for periodic timer Add tests to arm and cancel periodic timer. Signed-off-by: Shijith Thotton Acked-by: Erik Gabriel Carrillo Acked-by: Jerin Jacob --- app/test/test_event_timer_adapter.c | 138 +++++++++++++++++++++++++--- 1 file changed, 125 insertions(+), 13 deletions(-) diff --git a/app/test/test_event_timer_adapter.c b/app/test/test_event_timer_adapter.c index b536ddef40..c36ab32ac2 100644 --- a/app/test/test_event_timer_adapter.c +++ b/app/test/test_event_timer_adapter.c @@ -283,7 +283,7 @@ test_port_conf_cb(uint16_t id, uint8_t event_dev_id, uint8_t *event_port_id, } static int -_timdev_setup(uint64_t max_tmo_ns, uint64_t bkt_tck_ns) +_timdev_setup(uint64_t max_tmo_ns, uint64_t bkt_tck_ns, uint64_t flags) { struct rte_event_timer_adapter_info info; struct rte_event_timer_adapter_conf config = { @@ -292,7 +292,7 @@ _timdev_setup(uint64_t max_tmo_ns, uint64_t bkt_tck_ns) .timer_tick_ns = bkt_tck_ns, .max_tmo_ns = max_tmo_ns, .nb_timers = MAX_TIMERS * 10, - .flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES, + .flags = flags, }; uint32_t caps = 0; const char *pool_name = "timdev_test_pool"; @@ -301,6 +301,13 @@ _timdev_setup(uint64_t max_tmo_ns, uint64_t bkt_tck_ns) TEST_ASSERT_SUCCESS(rte_event_timer_adapter_caps_get(evdev, &caps), "failed to get adapter capabilities"); + + if (flags & RTE_EVENT_TIMER_ADAPTER_F_PERIODIC && + !(caps & RTE_EVENT_TIMER_ADAPTER_CAP_PERIODIC)) { + printf("Adapter does not support periodic timers\n"); + return TEST_SKIPPED; + } + if (!(caps & RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT)) { timdev = rte_event_timer_adapter_create_ext(&config, test_port_conf_cb, @@ -338,42 +345,72 @@ _timdev_setup(uint64_t max_tmo_ns, uint64_t bkt_tck_ns) static int timdev_setup_usec(void) { + uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES; + return using_services ? /* Max timeout is 10,000us and bucket interval is 100us */ - _timdev_setup(1E7, 1E5) : + _timdev_setup(1E7, 1E5, flags) : /* Max timeout is 100us and bucket interval is 1us */ - _timdev_setup(1E5, 1E3); + _timdev_setup(1E5, 1E3, flags); } static int timdev_setup_usec_multicore(void) { + uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES; + return using_services ? /* Max timeout is 10,000us and bucket interval is 100us */ - _timdev_setup(1E7, 1E5) : + _timdev_setup(1E7, 1E5, flags) : /* Max timeout is 100us and bucket interval is 1us */ - _timdev_setup(1E5, 1E3); + _timdev_setup(1E5, 1E3, flags); } static int timdev_setup_msec(void) { - /* Max timeout is 2 mins, and bucket interval is 100 ms */ - return _timdev_setup(180 * NSECPERSEC, NSECPERSEC / 10); + uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES; + + /* Max timeout is 3 mins, and bucket interval is 100 ms */ + return _timdev_setup(180 * NSECPERSEC, NSECPERSEC / 10, flags); +} + +static int +timdev_setup_msec_periodic(void) +{ + uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES | + RTE_EVENT_TIMER_ADAPTER_F_PERIODIC; + + /* Periodic mode with 100 ms resolution */ + return _timdev_setup(0, NSECPERSEC / 10, flags); } static int timdev_setup_sec(void) { + uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES; + /* Max timeout is 100sec and bucket interval is 1sec */ - return _timdev_setup(1E11, 1E9); + return _timdev_setup(1E11, 1E9, flags); +} + +static int +timdev_setup_sec_periodic(void) +{ + uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES | + RTE_EVENT_TIMER_ADAPTER_F_PERIODIC; + + /* Periodic mode with 1 sec resolution */ + return _timdev_setup(0, NSECPERSEC, flags); } static int timdev_setup_sec_multicore(void) { + uint64_t flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES; + /* Max timeout is 100sec and bucket interval is 1sec */ - return _timdev_setup(1E11, 1E9); + return _timdev_setup(1E11, 1E9, flags); } static void @@ -513,6 +550,19 @@ test_timer_arm(void) return TEST_SUCCESS; } +static inline int +test_timer_arm_periodic(void) +{ + TEST_ASSERT_SUCCESS(_arm_timers(1, MAX_TIMERS), + "Failed to arm timers"); + /* With a resolution of 100ms and wait time of 1sec, + * there will be 10 * MAX_TIMERS periodic timer triggers. + */ + TEST_ASSERT_SUCCESS(_wait_timer_triggers(1, 10 * MAX_TIMERS, 0), + "Timer triggered count doesn't match arm count"); + return TEST_SUCCESS; +} + static int _arm_wrapper(void *arg) { @@ -588,6 +638,20 @@ test_timer_arm_burst(void) return TEST_SUCCESS; } +static inline int +test_timer_arm_burst_periodic(void) +{ + TEST_ASSERT_SUCCESS(_arm_timers_burst(1, MAX_TIMERS), + "Failed to arm timers"); + /* With a resolution of 100ms and wait time of 1sec, + * there will be 10 * MAX_TIMERS periodic timer triggers. + */ + TEST_ASSERT_SUCCESS(_wait_timer_triggers(1, 10 * MAX_TIMERS, 0), + "Timer triggered count doesn't match arm count"); + + return TEST_SUCCESS; +} + static int _arm_wrapper_burst(void *arg) { @@ -612,6 +676,48 @@ test_timer_arm_burst_multicore(void) return TEST_SUCCESS; } +static inline int +test_timer_cancel_periodic(void) +{ + uint64_t i; + struct rte_event_timer *ev_tim; + const struct rte_event_timer tim = { + .ev.op = RTE_EVENT_OP_NEW, + .ev.queue_id = 0, + .ev.sched_type = RTE_SCHED_TYPE_ATOMIC, + .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL, + .ev.event_type = RTE_EVENT_TYPE_TIMER, + .state = RTE_EVENT_TIMER_NOT_ARMED, + .timeout_ticks = CALC_TICKS(1), + }; + + for (i = 0; i < MAX_TIMERS; i++) { + TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool, + (void **)&ev_tim), + "mempool alloc failed"); + *ev_tim = tim; + ev_tim->ev.event_ptr = ev_tim; + + TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim, + 1), 1, "Failed to arm timer %d", + rte_errno); + + rte_delay_us(100 + (i % 5000)); + + TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(timdev, + &ev_tim, 1), 1, + "Failed to cancel event timer %d", rte_errno); + rte_mempool_put(eventdev_test_mempool, ev_tim); + } + + + TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS, + MAX_TIMERS), + "Timer triggered count doesn't match arm, cancel count"); + + return TEST_SUCCESS; +} + static inline int test_timer_cancel(void) { @@ -1028,9 +1134,9 @@ adapter_lookup(void) static int adapter_start(void) { - TEST_ASSERT_SUCCESS(_timdev_setup(180 * NSECPERSEC, - NSECPERSEC / 10), - "Failed to start adapter"); + TEST_ASSERT_SUCCESS(_timdev_setup(180 * NSECPERSEC, NSECPERSEC / 10, + RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES), + "Failed to start adapter"); TEST_ASSERT_EQUAL(rte_event_timer_adapter_start(timdev), -EALREADY, "Timer adapter started without call to stop."); @@ -1786,10 +1892,16 @@ static struct unit_test_suite event_timer_adptr_functional_testsuite = { test_timer_state), TEST_CASE_ST(timdev_setup_usec, timdev_teardown, test_timer_arm), + TEST_CASE_ST(timdev_setup_msec_periodic, timdev_teardown, + test_timer_arm_periodic), TEST_CASE_ST(timdev_setup_usec, timdev_teardown, test_timer_arm_burst), + TEST_CASE_ST(timdev_setup_msec_periodic, timdev_teardown, + test_timer_arm_burst_periodic), TEST_CASE_ST(timdev_setup_sec, timdev_teardown, test_timer_cancel), + TEST_CASE_ST(timdev_setup_sec_periodic, timdev_teardown, + test_timer_cancel_periodic), TEST_CASE_ST(timdev_setup_sec, timdev_teardown, test_timer_cancel_random), TEST_CASE_ST(timdev_setup_usec_multicore, timdev_teardown, -- 2.20.1