1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017 Cavium, Inc
3 * Copyright(c) 2017-2018 Intel Corporation.
8 #include <rte_atomic.h>
9 #include <rte_common.h>
10 #include <rte_cycles.h>
11 #include <rte_debug.h>
13 #include <rte_ethdev.h>
14 #include <rte_eventdev.h>
15 #include <rte_event_timer_adapter.h>
16 #include <rte_mempool.h>
17 #include <rte_launch.h>
18 #include <rte_lcore.h>
19 #include <rte_per_lcore.h>
20 #include <rte_random.h>
21 #include <rte_bus_vdev.h>
22 #include <rte_service.h>
27 /* 4K timers corresponds to sw evdev max inflight events */
28 #define MAX_TIMERS (4 * 1024)
31 #define NSECPERSEC 1E9
33 /* Both the app lcore and adapter ports are linked to this queue */
34 #define TEST_QUEUE_ID 0
35 /* Port the application dequeues from */
36 #define TEST_PORT_ID 0
37 #define TEST_ADAPTER_ID 0
39 /* Handle log statements in same manner as test macros */
40 #define LOG_DBG(...) RTE_LOG(DEBUG, EAL, __VA_ARGS__)
43 static struct rte_event_timer_adapter *timdev;
44 static struct rte_mempool *eventdev_test_mempool;
45 static struct rte_ring *timer_producer_ring;
46 static uint64_t global_bkt_tck_ns;
47 static uint64_t global_info_bkt_tck_ns;
48 static volatile uint8_t arm_done;
50 #define CALC_TICKS(tks) \
51 ceil((double)(tks * global_bkt_tck_ns) / global_info_bkt_tck_ns)
54 static bool using_services;
55 static uint32_t test_lcore1;
56 static uint32_t test_lcore2;
57 static uint32_t test_lcore3;
58 static uint32_t sw_evdev_slcore;
59 static uint32_t sw_adptr_slcore;
62 devconf_set_default_sane_values(struct rte_event_dev_config *dev_conf,
63 struct rte_event_dev_info *info)
65 memset(dev_conf, 0, sizeof(struct rte_event_dev_config));
66 dev_conf->dequeue_timeout_ns = info->min_dequeue_timeout_ns;
67 dev_conf->nb_event_ports = 1;
68 dev_conf->nb_event_queues = 1;
69 dev_conf->nb_event_queue_flows = info->max_event_queue_flows;
70 dev_conf->nb_event_port_dequeue_depth =
71 info->max_event_port_dequeue_depth;
72 dev_conf->nb_event_port_enqueue_depth =
73 info->max_event_port_enqueue_depth;
74 dev_conf->nb_event_port_enqueue_depth =
75 info->max_event_port_enqueue_depth;
76 dev_conf->nb_events_limit =
84 struct rte_event_dev_config dev_conf;
85 struct rte_event_dev_info info;
88 ret = rte_event_dev_info_get(evdev, &info);
89 TEST_ASSERT_SUCCESS(ret, "Failed to get event dev info");
90 TEST_ASSERT(info.max_num_events < 0 ||
91 info.max_num_events >= (int32_t)MAX_TIMERS,
92 "ERROR max_num_events=%d < max_events=%d",
93 info.max_num_events, MAX_TIMERS);
95 devconf_set_default_sane_values(&dev_conf, &info);
96 ret = rte_event_dev_configure(evdev, &dev_conf);
97 TEST_ASSERT_SUCCESS(ret, "Failed to configure eventdev");
99 ret = rte_event_queue_setup(evdev, 0, NULL);
100 TEST_ASSERT_SUCCESS(ret, "Failed to setup queue=%d", 0);
102 /* Configure event port */
103 ret = rte_event_port_setup(evdev, 0, NULL);
104 TEST_ASSERT_SUCCESS(ret, "Failed to setup port=%d", 0);
105 ret = rte_event_port_link(evdev, 0, NULL, NULL, 0);
106 TEST_ASSERT(ret >= 0, "Failed to link all queues port=%d", 0);
108 /* If this is a software event device, map and start its service */
109 if (rte_event_dev_service_id_get(evdev, &service_id) == 0) {
110 TEST_ASSERT_SUCCESS(rte_service_lcore_add(sw_evdev_slcore),
111 "Failed to add service core");
112 TEST_ASSERT_SUCCESS(rte_service_lcore_start(
114 "Failed to start service core");
115 TEST_ASSERT_SUCCESS(rte_service_map_lcore_set(
116 service_id, sw_evdev_slcore, 1),
117 "Failed to map evdev service");
118 TEST_ASSERT_SUCCESS(rte_service_runstate_set(
120 "Failed to start evdev service");
123 ret = rte_event_dev_start(evdev);
124 TEST_ASSERT_SUCCESS(ret, "Failed to start device");
130 testsuite_setup(void)
132 /* Some of the multithreaded tests require 3 other lcores to run */
133 unsigned int required_lcore_count = 4;
136 /* To make it easier to map services later if needed, just reset
137 * service core state.
139 (void) rte_service_lcore_reset_all();
141 if (!rte_event_dev_count()) {
142 /* If there is no hardware eventdev, or no software vdev was
143 * specified on the command line, create an instance of
146 LOG_DBG("Failed to find a valid event device... testing with"
147 " event_sw device\n");
148 TEST_ASSERT_SUCCESS(rte_vdev_init("event_sw0", NULL),
149 "Error creating eventdev");
150 evdev = rte_event_dev_get_dev_id("event_sw0");
153 if (rte_event_dev_service_id_get(evdev, &service_id) == 0) {
154 /* A software event device will use a software event timer
155 * adapter as well. 2 more cores required to convert to
158 required_lcore_count += 2;
159 using_services = true;
162 if (rte_lcore_count() < required_lcore_count) {
163 printf("Not enough cores for event_timer_adapter_test, expecting at least %u\n",
164 required_lcore_count);
168 /* Assign lcores for various tasks */
169 test_lcore1 = rte_get_next_lcore(-1, 1, 0);
170 test_lcore2 = rte_get_next_lcore(test_lcore1, 1, 0);
171 test_lcore3 = rte_get_next_lcore(test_lcore2, 1, 0);
172 if (using_services) {
173 sw_evdev_slcore = rte_get_next_lcore(test_lcore3, 1, 0);
174 sw_adptr_slcore = rte_get_next_lcore(sw_evdev_slcore, 1, 0);
177 return eventdev_setup();
181 testsuite_teardown(void)
183 rte_event_dev_stop(evdev);
184 rte_event_dev_close(evdev);
188 setup_adapter_service(struct rte_event_timer_adapter *adptr)
190 uint32_t adapter_service_id;
193 /* retrieve service ids */
194 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_service_id_get(adptr,
195 &adapter_service_id), "Failed to get event timer "
196 "adapter service id");
197 /* add a service core and start it */
198 ret = rte_service_lcore_add(sw_adptr_slcore);
199 TEST_ASSERT(ret == 0 || ret == -EALREADY,
200 "Failed to add service core");
201 ret = rte_service_lcore_start(sw_adptr_slcore);
202 TEST_ASSERT(ret == 0 || ret == -EALREADY,
203 "Failed to start service core");
205 /* map services to it */
206 TEST_ASSERT_SUCCESS(rte_service_map_lcore_set(adapter_service_id,
208 "Failed to map adapter service");
210 /* set services to running */
211 TEST_ASSERT_SUCCESS(rte_service_runstate_set(adapter_service_id, 1),
212 "Failed to start event timer adapter service");
218 test_port_conf_cb(uint16_t id, uint8_t event_dev_id, uint8_t *event_port_id,
221 struct rte_event_dev_config dev_conf;
222 struct rte_event_dev_info info;
223 struct rte_event_port_conf *port_conf, def_port_conf = {0};
225 static int port_allocated;
226 static uint8_t port_id;
229 if (port_allocated) {
230 *event_port_id = port_id;
236 ret = rte_event_dev_attr_get(event_dev_id, RTE_EVENT_DEV_ATTR_STARTED,
242 rte_event_dev_stop(event_dev_id);
244 ret = rte_event_dev_info_get(evdev, &info);
248 devconf_set_default_sane_values(&dev_conf, &info);
250 port_id = dev_conf.nb_event_ports;
251 dev_conf.nb_event_ports++;
253 ret = rte_event_dev_configure(event_dev_id, &dev_conf);
256 rte_event_dev_start(event_dev_id);
260 if (conf_arg != NULL)
261 port_conf = conf_arg;
263 port_conf = &def_port_conf;
264 ret = rte_event_port_default_conf_get(event_dev_id, port_id,
270 ret = rte_event_port_setup(event_dev_id, port_id, port_conf);
274 *event_port_id = port_id;
277 rte_event_dev_start(event_dev_id);
279 /* Reuse this port number next time this is called */
286 _timdev_setup(uint64_t max_tmo_ns, uint64_t bkt_tck_ns)
288 struct rte_event_timer_adapter_info info;
289 struct rte_event_timer_adapter_conf config = {
290 .event_dev_id = evdev,
291 .timer_adapter_id = TEST_ADAPTER_ID,
292 .timer_tick_ns = bkt_tck_ns,
293 .max_tmo_ns = max_tmo_ns,
294 .nb_timers = MAX_TIMERS * 10,
295 .flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES,
298 const char *pool_name = "timdev_test_pool";
300 global_bkt_tck_ns = bkt_tck_ns;
302 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_caps_get(evdev, &caps),
303 "failed to get adapter capabilities");
304 if (!(caps & RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT)) {
305 timdev = rte_event_timer_adapter_create_ext(&config,
308 setup_adapter_service(timdev);
309 using_services = true;
311 timdev = rte_event_timer_adapter_create(&config);
313 TEST_ASSERT_NOT_NULL(timdev,
314 "failed to create event timer ring");
316 TEST_ASSERT_EQUAL(rte_event_timer_adapter_start(timdev), 0,
317 "failed to Start event timer adapter");
319 /* Create event timer mempool */
320 eventdev_test_mempool = rte_mempool_create(pool_name,
322 sizeof(struct rte_event_timer), /* element size*/
324 0, NULL, NULL, NULL, NULL,
326 if (!eventdev_test_mempool) {
327 printf("ERROR creating mempool\n");
331 rte_event_timer_adapter_get_info(timdev, &info);
333 global_info_bkt_tck_ns = info.min_resolution_ns;
339 timdev_setup_usec(void)
341 return using_services ?
342 /* Max timeout is 10,000us and bucket interval is 100us */
343 _timdev_setup(1E7, 1E5) :
344 /* Max timeout is 100us and bucket interval is 1us */
345 _timdev_setup(1E5, 1E3);
349 timdev_setup_usec_multicore(void)
351 return using_services ?
352 /* Max timeout is 10,000us and bucket interval is 100us */
353 _timdev_setup(1E7, 1E5) :
354 /* Max timeout is 100us and bucket interval is 1us */
355 _timdev_setup(1E5, 1E3);
359 timdev_setup_msec(void)
361 /* Max timeout is 2 mins, and bucket interval is 100 ms */
362 return _timdev_setup(180 * NSECPERSEC, NSECPERSEC / 10);
366 timdev_setup_sec(void)
368 /* Max timeout is 100sec and bucket interval is 1sec */
369 return _timdev_setup(1E11, 1E9);
373 timdev_setup_sec_multicore(void)
375 /* Max timeout is 100sec and bucket interval is 1sec */
376 return _timdev_setup(1E11, 1E9);
380 timdev_teardown(void)
382 rte_event_timer_adapter_stop(timdev);
383 rte_event_timer_adapter_free(timdev);
385 rte_mempool_free(eventdev_test_mempool);
389 test_timer_state(void)
391 struct rte_event_timer *ev_tim;
393 const struct rte_event_timer tim = {
394 .ev.op = RTE_EVENT_OP_NEW,
396 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
397 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
398 .ev.event_type = RTE_EVENT_TYPE_TIMER,
399 .state = RTE_EVENT_TIMER_NOT_ARMED,
403 rte_mempool_get(eventdev_test_mempool, (void **)&ev_tim);
405 ev_tim->ev.event_ptr = ev_tim;
406 ev_tim->timeout_ticks = CALC_TICKS(120);
408 TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim, 1), 0,
409 "Armed timer exceeding max_timeout.");
410 TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_ERROR_TOOLATE,
411 "Improper timer state set expected %d returned %d",
412 RTE_EVENT_TIMER_ERROR_TOOLATE, ev_tim->state);
414 ev_tim->state = RTE_EVENT_TIMER_NOT_ARMED;
415 ev_tim->timeout_ticks = CALC_TICKS(10);
417 TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim, 1), 1,
418 "Failed to arm timer with proper timeout.");
419 TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_ARMED,
420 "Improper timer state set expected %d returned %d",
421 RTE_EVENT_TIMER_ARMED, ev_tim->state);
426 rte_delay_us(1000 + 200);
427 TEST_ASSERT_EQUAL(rte_event_dequeue_burst(evdev, 0, &ev, 1, 0), 1,
428 "Armed timer failed to trigger.");
430 ev_tim->state = RTE_EVENT_TIMER_NOT_ARMED;
431 ev_tim->timeout_ticks = CALC_TICKS(90);
432 TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim, 1), 1,
433 "Failed to arm timer with proper timeout.");
434 TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(timdev, &ev_tim, 1),
435 1, "Failed to cancel armed timer");
436 TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_CANCELED,
437 "Improper timer state set expected %d returned %d",
438 RTE_EVENT_TIMER_CANCELED, ev_tim->state);
440 rte_mempool_put(eventdev_test_mempool, (void *)ev_tim);
446 _arm_timers(uint64_t timeout_tcks, uint64_t timers)
449 struct rte_event_timer *ev_tim;
450 const struct rte_event_timer tim = {
451 .ev.op = RTE_EVENT_OP_NEW,
453 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
454 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
455 .ev.event_type = RTE_EVENT_TYPE_TIMER,
456 .state = RTE_EVENT_TIMER_NOT_ARMED,
457 .timeout_ticks = CALC_TICKS(timeout_tcks),
460 for (i = 0; i < timers; i++) {
462 TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
464 "mempool alloc failed");
466 ev_tim->ev.event_ptr = ev_tim;
468 TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
469 1), 1, "Failed to arm timer %d",
477 _wait_timer_triggers(uint64_t wait_sec, uint64_t arm_count,
478 uint64_t cancel_count)
482 uint64_t wait_start, max_wait;
485 max_wait = rte_get_timer_hz() * wait_sec;
486 wait_start = rte_get_timer_cycles();
488 if (rte_get_timer_cycles() - wait_start > max_wait) {
489 if (events + cancel_count != arm_count)
490 TEST_ASSERT_SUCCESS(max_wait,
491 "Max time limit for timers exceeded.");
495 valid_event = rte_event_dequeue_burst(evdev, 0, &ev, 1, 0);
499 rte_mempool_put(eventdev_test_mempool, ev.event_ptr);
509 TEST_ASSERT_SUCCESS(_arm_timers(20, MAX_TIMERS),
510 "Failed to arm timers");
511 TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS, 0),
512 "Timer triggered count doesn't match arm count");
517 _arm_wrapper(void *arg)
521 TEST_ASSERT_SUCCESS(_arm_timers(20, MAX_TIMERS),
522 "Failed to arm timers");
528 test_timer_arm_multicore(void)
531 uint32_t lcore_1 = rte_get_next_lcore(-1, 1, 0);
532 uint32_t lcore_2 = rte_get_next_lcore(lcore_1, 1, 0);
534 rte_eal_remote_launch(_arm_wrapper, NULL, lcore_1);
535 rte_eal_remote_launch(_arm_wrapper, NULL, lcore_2);
537 rte_eal_mp_wait_lcore();
538 TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS * 2, 0),
539 "Timer triggered count doesn't match arm count");
546 _arm_timers_burst(uint64_t timeout_tcks, uint64_t timers)
550 struct rte_event_timer *ev_tim[MAX_BURST];
551 const struct rte_event_timer tim = {
552 .ev.op = RTE_EVENT_OP_NEW,
554 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
555 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
556 .ev.event_type = RTE_EVENT_TYPE_TIMER,
557 .state = RTE_EVENT_TIMER_NOT_ARMED,
558 .timeout_ticks = CALC_TICKS(timeout_tcks),
561 for (i = 0; i < timers / MAX_BURST; i++) {
562 TEST_ASSERT_SUCCESS(rte_mempool_get_bulk(
563 eventdev_test_mempool,
564 (void **)ev_tim, MAX_BURST),
565 "mempool alloc failed");
567 for (j = 0; j < MAX_BURST; j++) {
569 ev_tim[j]->ev.event_ptr = ev_tim[j];
572 TEST_ASSERT_EQUAL(rte_event_timer_arm_tmo_tick_burst(timdev,
573 ev_tim, tim.timeout_ticks, MAX_BURST),
574 MAX_BURST, "Failed to arm timer %d", rte_errno);
581 test_timer_arm_burst(void)
583 TEST_ASSERT_SUCCESS(_arm_timers_burst(20, MAX_TIMERS),
584 "Failed to arm timers");
585 TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS, 0),
586 "Timer triggered count doesn't match arm count");
592 _arm_wrapper_burst(void *arg)
596 TEST_ASSERT_SUCCESS(_arm_timers_burst(20, MAX_TIMERS),
597 "Failed to arm timers");
603 test_timer_arm_burst_multicore(void)
605 rte_eal_remote_launch(_arm_wrapper_burst, NULL, test_lcore1);
606 rte_eal_remote_launch(_arm_wrapper_burst, NULL, test_lcore2);
608 rte_eal_mp_wait_lcore();
609 TEST_ASSERT_SUCCESS(_wait_timer_triggers(10, MAX_TIMERS * 2, 0),
610 "Timer triggered count doesn't match arm count");
616 test_timer_cancel(void)
619 struct rte_event_timer *ev_tim;
620 const struct rte_event_timer tim = {
621 .ev.op = RTE_EVENT_OP_NEW,
623 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
624 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
625 .ev.event_type = RTE_EVENT_TYPE_TIMER,
626 .state = RTE_EVENT_TIMER_NOT_ARMED,
627 .timeout_ticks = CALC_TICKS(20),
630 for (i = 0; i < MAX_TIMERS; i++) {
631 TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
633 "mempool alloc failed");
635 ev_tim->ev.event_ptr = ev_tim;
637 TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
638 1), 1, "Failed to arm timer %d",
641 rte_delay_us(100 + (i % 5000));
643 TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(timdev,
645 "Failed to cancel event timer %d", rte_errno);
646 rte_mempool_put(eventdev_test_mempool, ev_tim);
650 TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS,
652 "Timer triggered count doesn't match arm, cancel count");
658 _cancel_producer(uint64_t timeout_tcks, uint64_t timers)
661 struct rte_event_timer *ev_tim;
662 const struct rte_event_timer tim = {
663 .ev.op = RTE_EVENT_OP_NEW,
665 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
666 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
667 .ev.event_type = RTE_EVENT_TYPE_TIMER,
668 .state = RTE_EVENT_TIMER_NOT_ARMED,
669 .timeout_ticks = CALC_TICKS(timeout_tcks),
672 for (i = 0; i < timers; i++) {
673 TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
675 "mempool alloc failed");
678 ev_tim->ev.event_ptr = ev_tim;
680 TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
681 1), 1, "Failed to arm timer %d",
684 TEST_ASSERT_EQUAL(ev_tim->state, RTE_EVENT_TIMER_ARMED,
685 "Failed to arm event timer");
687 while (rte_ring_enqueue(timer_producer_ring, ev_tim) != 0)
695 _cancel_producer_burst(uint64_t timeout_tcks, uint64_t timers)
700 struct rte_event_timer *ev_tim[MAX_BURST];
701 const struct rte_event_timer tim = {
702 .ev.op = RTE_EVENT_OP_NEW,
704 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
705 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
706 .ev.event_type = RTE_EVENT_TYPE_TIMER,
707 .state = RTE_EVENT_TIMER_NOT_ARMED,
708 .timeout_ticks = CALC_TICKS(timeout_tcks),
712 for (i = 0; i < timers / MAX_BURST; i++) {
713 TEST_ASSERT_SUCCESS(rte_mempool_get_bulk(
714 eventdev_test_mempool,
715 (void **)ev_tim, MAX_BURST),
716 "mempool alloc failed");
718 for (j = 0; j < MAX_BURST; j++) {
720 ev_tim[j]->ev.event_ptr = ev_tim[j];
723 TEST_ASSERT_EQUAL(rte_event_timer_arm_tmo_tick_burst(timdev,
724 ev_tim, tim.timeout_ticks, MAX_BURST),
725 MAX_BURST, "Failed to arm timer %d", rte_errno);
727 for (j = 0; j < MAX_BURST; j++)
728 TEST_ASSERT_EQUAL(ev_tim[j]->state,
729 RTE_EVENT_TIMER_ARMED,
730 "Event timer not armed, state = %d",
733 ret = rte_ring_enqueue_bulk(timer_producer_ring,
734 (void **)ev_tim, MAX_BURST, NULL);
735 TEST_ASSERT_EQUAL(ret, MAX_BURST,
736 "Failed to enqueue event timers to ring");
740 TEST_ASSERT_EQUAL(arm_count, MAX_TIMERS,
741 "Failed to arm expected number of event timers");
747 _cancel_producer_wrapper(void *args)
751 return _cancel_producer(20, MAX_TIMERS);
755 _cancel_producer_burst_wrapper(void *args)
759 return _cancel_producer_burst(100, MAX_TIMERS);
763 _cancel_thread(void *args)
766 struct rte_event_timer *ev_tim = NULL;
767 uint64_t cancel_count = 0;
770 while (!arm_done || rte_ring_count(timer_producer_ring) > 0) {
771 if (rte_ring_dequeue(timer_producer_ring, (void **)&ev_tim))
774 ret = rte_event_timer_cancel_burst(timdev, &ev_tim, 1);
775 TEST_ASSERT_EQUAL(ret, 1, "Failed to cancel timer");
776 rte_mempool_put(eventdev_test_mempool, (void *)ev_tim);
784 _cancel_burst_thread(void *args)
789 struct rte_event_timer *ev_tim[MAX_BURST];
790 uint64_t cancel_count = 0;
791 uint64_t dequeue_count = 0;
793 while (!arm_done || rte_ring_count(timer_producer_ring) > 0) {
794 n = rte_ring_dequeue_burst(timer_producer_ring,
795 (void **)ev_tim, MAX_BURST, NULL);
801 for (i = 0; i < n; i++)
802 TEST_ASSERT_EQUAL(ev_tim[i]->state,
803 RTE_EVENT_TIMER_ARMED,
804 "Event timer not armed, state = %d",
807 ret = rte_event_timer_cancel_burst(timdev, ev_tim, n);
808 TEST_ASSERT_EQUAL(n, ret, "Failed to cancel complete burst of "
810 rte_mempool_put_bulk(eventdev_test_mempool, (void **)ev_tim,
811 RTE_MIN(ret, MAX_BURST));
816 TEST_ASSERT_EQUAL(cancel_count, MAX_TIMERS,
817 "Failed to cancel expected number of timers: "
818 "expected = %d, cancel_count = %"PRIu64", "
819 "dequeue_count = %"PRIu64"\n", MAX_TIMERS,
820 cancel_count, dequeue_count);
826 test_timer_cancel_multicore(void)
829 timer_producer_ring = rte_ring_create("timer_cancel_queue",
830 MAX_TIMERS * 2, rte_socket_id(), 0);
831 TEST_ASSERT_NOT_NULL(timer_producer_ring,
832 "Unable to reserve memory for ring");
834 rte_eal_remote_launch(_cancel_thread, NULL, test_lcore3);
835 rte_eal_remote_launch(_cancel_producer_wrapper, NULL, test_lcore1);
836 rte_eal_remote_launch(_cancel_producer_wrapper, NULL, test_lcore2);
838 rte_eal_wait_lcore(test_lcore1);
839 rte_eal_wait_lcore(test_lcore2);
841 rte_eal_wait_lcore(test_lcore3);
842 rte_ring_free(timer_producer_ring);
844 TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS * 2,
846 "Timer triggered count doesn't match arm count");
852 test_timer_cancel_burst_multicore(void)
855 timer_producer_ring = rte_ring_create("timer_cancel_queue",
856 MAX_TIMERS * 2, rte_socket_id(), 0);
857 TEST_ASSERT_NOT_NULL(timer_producer_ring,
858 "Unable to reserve memory for ring");
860 rte_eal_remote_launch(_cancel_burst_thread, NULL, test_lcore2);
861 rte_eal_remote_launch(_cancel_producer_burst_wrapper, NULL,
864 rte_eal_wait_lcore(test_lcore1);
866 rte_eal_wait_lcore(test_lcore2);
867 rte_ring_free(timer_producer_ring);
869 TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS,
871 "Timer triggered count doesn't match arm count");
877 test_timer_cancel_random(void)
880 uint64_t events_canceled = 0;
881 struct rte_event_timer *ev_tim;
882 const struct rte_event_timer tim = {
883 .ev.op = RTE_EVENT_OP_NEW,
885 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
886 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
887 .ev.event_type = RTE_EVENT_TYPE_TIMER,
888 .state = RTE_EVENT_TIMER_NOT_ARMED,
889 .timeout_ticks = CALC_TICKS(20),
892 for (i = 0; i < MAX_TIMERS; i++) {
894 TEST_ASSERT_SUCCESS(rte_mempool_get(eventdev_test_mempool,
896 "mempool alloc failed");
898 ev_tim->ev.event_ptr = ev_tim;
900 TEST_ASSERT_EQUAL(rte_event_timer_arm_burst(timdev, &ev_tim,
901 1), 1, "Failed to arm timer %d",
904 if (rte_rand() & 1) {
905 rte_delay_us(100 + (i % 5000));
906 TEST_ASSERT_EQUAL(rte_event_timer_cancel_burst(
909 "Failed to cancel event timer %d", rte_errno);
910 rte_mempool_put(eventdev_test_mempool, ev_tim);
915 TEST_ASSERT_SUCCESS(_wait_timer_triggers(30, MAX_TIMERS,
917 "Timer triggered count doesn't match arm, cancel count");
922 /* Check that the adapter can be created correctly */
927 struct rte_event_timer_adapter *adapter, *adapter2;
929 struct rte_event_timer_adapter_conf conf = {
930 .event_dev_id = evdev + 1, // invalid event dev id
931 .timer_adapter_id = adapter_id,
932 .clk_src = RTE_EVENT_TIMER_ADAPTER_CPU_CLK,
933 .timer_tick_ns = NSECPERSEC / 10,
934 .max_tmo_ns = 180 * NSECPERSEC,
935 .nb_timers = MAX_TIMERS,
936 .flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES,
940 /* Test invalid conf */
941 adapter = rte_event_timer_adapter_create(&conf);
942 TEST_ASSERT_NULL(adapter, "Created adapter with invalid "
944 TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Incorrect errno value for "
945 "invalid event device id");
947 /* Test valid conf */
948 conf.event_dev_id = evdev;
949 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_caps_get(evdev, &caps),
950 "failed to get adapter capabilities");
951 if (!(caps & RTE_EVENT_TIMER_ADAPTER_CAP_INTERNAL_PORT))
952 adapter = rte_event_timer_adapter_create_ext(&conf,
956 adapter = rte_event_timer_adapter_create(&conf);
957 TEST_ASSERT_NOT_NULL(adapter, "Failed to create adapter with valid "
960 /* Test existing id */
961 adapter2 = rte_event_timer_adapter_create(&conf);
962 TEST_ASSERT_NULL(adapter2, "Created adapter with in-use id");
963 TEST_ASSERT(rte_errno == EEXIST, "Incorrect errno value for existing "
966 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(adapter),
967 "Failed to free adapter");
969 rte_mempool_free(eventdev_test_mempool);
975 /* Test that adapter can be freed correctly. */
979 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stop(timdev),
980 "Failed to stop adapter");
982 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(timdev),
983 "Failed to free valid adapter");
985 /* Test free of already freed adapter */
986 TEST_ASSERT_FAIL(rte_event_timer_adapter_free(timdev),
987 "Freed adapter that was already freed");
989 /* Test free of null adapter */
991 TEST_ASSERT_FAIL(rte_event_timer_adapter_free(timdev),
992 "Freed null adapter");
994 rte_mempool_free(eventdev_test_mempool);
999 /* Test that adapter info can be retrieved and is correct. */
1001 adapter_get_info(void)
1003 struct rte_event_timer_adapter_info info;
1005 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_get_info(timdev, &info),
1006 "Failed to get adapter info");
1009 TEST_ASSERT_EQUAL(info.event_dev_port_id, 1,
1010 "Expected port id = 1, got port id = %d",
1011 info.event_dev_port_id);
1013 return TEST_SUCCESS;
1016 /* Test adapter lookup via adapter ID. */
1018 adapter_lookup(void)
1020 struct rte_event_timer_adapter *adapter;
1022 adapter = rte_event_timer_adapter_lookup(TEST_ADAPTER_ID);
1023 TEST_ASSERT_NOT_NULL(adapter, "Failed to lookup adapter");
1025 return TEST_SUCCESS;
1031 TEST_ASSERT_SUCCESS(_timdev_setup(180 * NSECPERSEC,
1033 "Failed to start adapter");
1034 TEST_ASSERT_EQUAL(rte_event_timer_adapter_start(timdev), -EALREADY,
1035 "Timer adapter started without call to stop.");
1037 return TEST_SUCCESS;
1040 /* Test that adapter stops correctly. */
1044 struct rte_event_timer_adapter *l_adapter = NULL;
1046 /* Test adapter stop */
1047 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stop(timdev),
1048 "Failed to stop event adapter");
1050 TEST_ASSERT_FAIL(rte_event_timer_adapter_stop(l_adapter),
1051 "Erroneously stopped null event adapter");
1053 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(timdev),
1054 "Failed to free adapter");
1056 rte_mempool_free(eventdev_test_mempool);
1058 return TEST_SUCCESS;
1061 /* Test increment and reset of ev_enq_count stat */
1063 stat_inc_reset_ev_enq(void)
1066 int num_evtims = MAX_TIMERS;
1067 struct rte_event_timer *evtims[num_evtims];
1068 struct rte_event evs[BATCH_SIZE];
1069 struct rte_event_timer_adapter_stats stats;
1070 const struct rte_event_timer init_tim = {
1071 .ev.op = RTE_EVENT_OP_NEW,
1072 .ev.queue_id = TEST_QUEUE_ID,
1073 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1074 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1075 .ev.event_type = RTE_EVENT_TYPE_TIMER,
1076 .state = RTE_EVENT_TIMER_NOT_ARMED,
1077 .timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1080 ret = rte_mempool_get_bulk(eventdev_test_mempool, (void **)evtims,
1082 TEST_ASSERT_EQUAL(ret, 0, "Failed to get array of timer objs: ret = %d",
1085 for (i = 0; i < num_evtims; i++) {
1086 *evtims[i] = init_tim;
1087 evtims[i]->ev.event_ptr = evtims[i];
1090 ret = rte_event_timer_adapter_stats_get(timdev, &stats);
1091 TEST_ASSERT_EQUAL(ret, 0, "Failed to get stats");
1092 TEST_ASSERT_EQUAL((int)stats.ev_enq_count, 0, "Stats not clear at "
1095 /* Test with the max value for the adapter */
1096 ret = rte_event_timer_arm_burst(timdev, evtims, num_evtims);
1097 TEST_ASSERT_EQUAL(ret, num_evtims,
1098 "Failed to arm all event timers: attempted = %d, "
1099 "succeeded = %d, rte_errno = %s",
1100 num_evtims, ret, rte_strerror(rte_errno));
1104 #define MAX_TRIES num_evtims
1109 sum += rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs,
1111 if (sum >= num_evtims || ++tries >= MAX_TRIES)
1117 TEST_ASSERT_EQUAL(sum, num_evtims, "Expected %d timer expiry events, "
1118 "got %d", num_evtims, sum);
1120 TEST_ASSERT(tries < MAX_TRIES, "Exceeded max tries");
1124 /* Make sure the eventdev is still empty */
1125 n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs),
1128 TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected number of timer expiry "
1129 "events from event device");
1131 /* Check stats again */
1132 ret = rte_event_timer_adapter_stats_get(timdev, &stats);
1133 TEST_ASSERT_EQUAL(ret, 0, "Failed to get stats");
1134 TEST_ASSERT_EQUAL((int)stats.ev_enq_count, num_evtims,
1135 "Expected enqueue stat = %d; got %d", num_evtims,
1136 (int)stats.ev_enq_count);
1138 /* Reset and check again */
1139 ret = rte_event_timer_adapter_stats_reset(timdev);
1140 TEST_ASSERT_EQUAL(ret, 0, "Failed to reset stats");
1142 ret = rte_event_timer_adapter_stats_get(timdev, &stats);
1143 TEST_ASSERT_EQUAL(ret, 0, "Failed to get stats");
1144 TEST_ASSERT_EQUAL((int)stats.ev_enq_count, 0,
1145 "Expected enqueue stat = %d; got %d", 0,
1146 (int)stats.ev_enq_count);
1148 rte_mempool_put_bulk(eventdev_test_mempool, (void **)evtims,
1151 return TEST_SUCCESS;
1154 /* Test various cases in arming timers */
1156 event_timer_arm(void)
1160 struct rte_event_timer_adapter *adapter = timdev;
1161 struct rte_event_timer *evtim = NULL;
1162 struct rte_event evs[BATCH_SIZE];
1163 const struct rte_event_timer init_tim = {
1164 .ev.op = RTE_EVENT_OP_NEW,
1165 .ev.queue_id = TEST_QUEUE_ID,
1166 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1167 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1168 .ev.event_type = RTE_EVENT_TYPE_TIMER,
1169 .state = RTE_EVENT_TIMER_NOT_ARMED,
1170 .timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1173 rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1174 if (evtim == NULL) {
1175 /* Failed to get an event timer object */
1179 /* Set up a timer */
1181 evtim->ev.event_ptr = evtim;
1183 /* Test single timer arm succeeds */
1184 ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1185 TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1186 rte_strerror(rte_errno));
1187 TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED, "Event timer "
1188 "in incorrect state");
1190 /* Test arm of armed timer fails */
1191 ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1192 TEST_ASSERT_EQUAL(ret, 0, "expected return value from "
1193 "rte_event_timer_arm_burst: 0, got: %d", ret);
1194 TEST_ASSERT_EQUAL(rte_errno, EALREADY, "Unexpected rte_errno value "
1195 "after arming already armed timer");
1197 /* Let timer expire */
1200 n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1201 TEST_ASSERT_EQUAL(n, 1, "Failed to dequeue expected number of expiry "
1202 "events from event device");
1204 rte_mempool_put(eventdev_test_mempool, evtim);
1206 return TEST_SUCCESS;
1209 /* This test checks that repeated references to the same event timer in the
1210 * arm request work as expected; only the first one through should succeed.
1213 event_timer_arm_double(void)
1217 struct rte_event_timer_adapter *adapter = timdev;
1218 struct rte_event_timer *evtim = NULL;
1219 struct rte_event evs[BATCH_SIZE];
1220 const struct rte_event_timer init_tim = {
1221 .ev.op = RTE_EVENT_OP_NEW,
1222 .ev.queue_id = TEST_QUEUE_ID,
1223 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1224 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1225 .ev.event_type = RTE_EVENT_TYPE_TIMER,
1226 .state = RTE_EVENT_TIMER_NOT_ARMED,
1227 .timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1230 rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1231 if (evtim == NULL) {
1232 /* Failed to get an event timer object */
1236 /* Set up a timer */
1238 evtim->ev.event_ptr = evtim;
1240 struct rte_event_timer *evtim_arr[] = {evtim, evtim};
1241 ret = rte_event_timer_arm_burst(adapter, evtim_arr, RTE_DIM(evtim_arr));
1242 TEST_ASSERT_EQUAL(ret, 1, "Unexpected return value from "
1243 "rte_event_timer_arm_burst");
1244 TEST_ASSERT_EQUAL(rte_errno, EALREADY, "Unexpected rte_errno value "
1245 "after double-arm");
1247 /* Let timer expire */
1250 n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1251 TEST_ASSERT_EQUAL(n, 1, "Dequeued incorrect number of expiry events - "
1252 "expected: 1, actual: %d", n);
1254 rte_mempool_put(eventdev_test_mempool, evtim);
1256 return TEST_SUCCESS;
1259 /* Test the timer expiry event is generated at the expected time. */
1261 event_timer_arm_expiry(void)
1265 struct rte_event_timer_adapter *adapter = timdev;
1266 struct rte_event_timer *evtim = NULL;
1267 struct rte_event_timer *evtim2 = NULL;
1268 struct rte_event evs[BATCH_SIZE];
1269 const struct rte_event_timer init_tim = {
1270 .ev.op = RTE_EVENT_OP_NEW,
1271 .ev.queue_id = TEST_QUEUE_ID,
1272 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1273 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1274 .ev.event_type = RTE_EVENT_TYPE_TIMER,
1275 .state = RTE_EVENT_TIMER_NOT_ARMED,
1278 rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1279 if (evtim == NULL) {
1280 /* Failed to get an event timer object */
1284 /* Set up an event timer */
1286 evtim->timeout_ticks = CALC_TICKS(30), // expire in 3 secs
1287 evtim->ev.event_ptr = evtim;
1289 ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1290 TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s",
1291 rte_strerror(rte_errno));
1292 TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED, "Event "
1293 "timer in incorrect state");
1297 n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1298 TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected timer expiry event");
1300 /* Delay 100 ms to account for the adapter tick window - should let us
1305 n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1306 TEST_ASSERT_EQUAL(n, 1, "Dequeued incorrect number (%d) of timer "
1307 "expiry events", n);
1308 TEST_ASSERT_EQUAL(evs[0].event_type, RTE_EVENT_TYPE_TIMER,
1309 "Dequeued unexpected type of event");
1311 /* Check that we recover the original event timer and then free it */
1312 evtim2 = evs[0].event_ptr;
1313 TEST_ASSERT_EQUAL(evtim, evtim2,
1314 "Failed to recover pointer to original event timer");
1315 rte_mempool_put(eventdev_test_mempool, evtim2);
1317 return TEST_SUCCESS;
1320 /* Check that rearming a timer works as expected. */
1322 event_timer_arm_rearm(void)
1326 struct rte_event_timer *evtim = NULL;
1327 struct rte_event_timer *evtim2 = NULL;
1328 struct rte_event evs[BATCH_SIZE];
1329 const struct rte_event_timer init_tim = {
1330 .ev.op = RTE_EVENT_OP_NEW,
1331 .ev.queue_id = TEST_QUEUE_ID,
1332 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1333 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1334 .ev.event_type = RTE_EVENT_TYPE_TIMER,
1335 .state = RTE_EVENT_TIMER_NOT_ARMED,
1338 rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1339 if (evtim == NULL) {
1340 /* Failed to get an event timer object */
1344 /* Set up a timer */
1346 evtim->timeout_ticks = CALC_TICKS(1); // expire in 0.1 sec
1347 evtim->ev.event_ptr = evtim;
1350 ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1351 TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1352 rte_strerror(rte_errno));
1354 /* Add 100ms to account for the adapter tick window */
1355 rte_delay_ms(100 + 100);
1357 n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1358 TEST_ASSERT_EQUAL(n, 1, "Failed to dequeue expected number of expiry "
1359 "events from event device");
1361 /* Recover the timer through the event that was dequeued. */
1362 evtim2 = evs[0].event_ptr;
1363 TEST_ASSERT_EQUAL(evtim, evtim2,
1364 "Failed to recover pointer to original event timer");
1366 /* Need to reset state in case implementation can't do it */
1367 evtim2->state = RTE_EVENT_TIMER_NOT_ARMED;
1370 ret = rte_event_timer_arm_burst(timdev, &evtim2, 1);
1371 TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1372 rte_strerror(rte_errno));
1374 /* Add 100ms to account for the adapter tick window */
1375 rte_delay_ms(100 + 100);
1377 n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1378 TEST_ASSERT_EQUAL(n, 1, "Failed to dequeue expected number of expiry "
1379 "events from event device");
1382 evtim2 = evs[0].event_ptr;
1383 TEST_ASSERT_EQUAL(evtim, evtim2,
1384 "Failed to recover pointer to original event timer");
1385 rte_mempool_put(eventdev_test_mempool, evtim2);
1387 return TEST_SUCCESS;
1390 /* Check that the adapter handles the max specified number of timers as
1394 event_timer_arm_max(void)
1397 int num_evtims = MAX_TIMERS;
1398 struct rte_event_timer *evtims[num_evtims];
1399 struct rte_event evs[BATCH_SIZE];
1400 const struct rte_event_timer init_tim = {
1401 .ev.op = RTE_EVENT_OP_NEW,
1402 .ev.queue_id = TEST_QUEUE_ID,
1403 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1404 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1405 .ev.event_type = RTE_EVENT_TYPE_TIMER,
1406 .state = RTE_EVENT_TIMER_NOT_ARMED,
1407 .timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1410 ret = rte_mempool_get_bulk(eventdev_test_mempool, (void **)evtims,
1412 TEST_ASSERT_EQUAL(ret, 0, "Failed to get array of timer objs: ret = %d",
1415 for (i = 0; i < num_evtims; i++) {
1416 *evtims[i] = init_tim;
1417 evtims[i]->ev.event_ptr = evtims[i];
1420 /* Test with the max value for the adapter */
1421 ret = rte_event_timer_arm_burst(timdev, evtims, num_evtims);
1422 TEST_ASSERT_EQUAL(ret, num_evtims,
1423 "Failed to arm all event timers: attempted = %d, "
1424 "succeeded = %d, rte_errno = %s",
1425 num_evtims, ret, rte_strerror(rte_errno));
1429 #define MAX_TRIES num_evtims
1434 sum += rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs,
1436 if (sum >= num_evtims || ++tries >= MAX_TRIES)
1442 TEST_ASSERT_EQUAL(sum, num_evtims, "Expected %d timer expiry events, "
1443 "got %d", num_evtims, sum);
1445 TEST_ASSERT(tries < MAX_TRIES, "Exceeded max tries");
1449 /* Make sure the eventdev is still empty */
1450 n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs),
1453 TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected number of timer expiry "
1454 "events from event device");
1456 rte_mempool_put_bulk(eventdev_test_mempool, (void **)evtims,
1459 return TEST_SUCCESS;
1462 /* Check that creating an event timer with incorrect event sched type fails. */
1464 event_timer_arm_invalid_sched_type(void)
1467 struct rte_event_timer *evtim = NULL;
1468 const struct rte_event_timer init_tim = {
1469 .ev.op = RTE_EVENT_OP_NEW,
1470 .ev.queue_id = TEST_QUEUE_ID,
1471 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1472 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1473 .ev.event_type = RTE_EVENT_TYPE_TIMER,
1474 .state = RTE_EVENT_TIMER_NOT_ARMED,
1475 .timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1478 if (!using_services)
1481 rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1482 if (evtim == NULL) {
1483 /* Failed to get an event timer object */
1488 evtim->ev.event_ptr = evtim;
1489 evtim->ev.sched_type = RTE_SCHED_TYPE_PARALLEL; // bad sched type
1491 ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1492 TEST_ASSERT_EQUAL(ret, 0, "Expected to fail timer arm with invalid "
1493 "sched type, but didn't");
1494 TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after"
1495 " arm fail with invalid queue");
1497 rte_mempool_put(eventdev_test_mempool, &evtim);
1499 return TEST_SUCCESS;
1502 /* Check that creating an event timer with a timeout value that is too small or
1506 event_timer_arm_invalid_timeout(void)
1509 struct rte_event_timer *evtim = NULL;
1510 const struct rte_event_timer init_tim = {
1511 .ev.op = RTE_EVENT_OP_NEW,
1512 .ev.queue_id = TEST_QUEUE_ID,
1513 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1514 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1515 .ev.event_type = RTE_EVENT_TYPE_TIMER,
1516 .state = RTE_EVENT_TIMER_NOT_ARMED,
1517 .timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1520 rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1521 if (evtim == NULL) {
1522 /* Failed to get an event timer object */
1527 evtim->ev.event_ptr = evtim;
1528 evtim->timeout_ticks = 0; // timeout too small
1530 ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1531 TEST_ASSERT_EQUAL(ret, 0, "Expected to fail timer arm with invalid "
1532 "timeout, but didn't");
1533 TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after"
1534 " arm fail with invalid timeout");
1535 TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ERROR_TOOEARLY,
1536 "Unexpected event timer state");
1539 evtim->ev.event_ptr = evtim;
1540 evtim->timeout_ticks = CALC_TICKS(1801); // timeout too big
1542 ret = rte_event_timer_arm_burst(timdev, &evtim, 1);
1543 TEST_ASSERT_EQUAL(ret, 0, "Expected to fail timer arm with invalid "
1544 "timeout, but didn't");
1545 TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after"
1546 " arm fail with invalid timeout");
1547 TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ERROR_TOOLATE,
1548 "Unexpected event timer state");
1550 rte_mempool_put(eventdev_test_mempool, evtim);
1552 return TEST_SUCCESS;
1556 event_timer_cancel(void)
1560 struct rte_event_timer_adapter *adapter = timdev;
1561 struct rte_event_timer *evtim = NULL;
1562 struct rte_event evs[BATCH_SIZE];
1563 const struct rte_event_timer init_tim = {
1564 .ev.op = RTE_EVENT_OP_NEW,
1565 .ev.queue_id = TEST_QUEUE_ID,
1566 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1567 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1568 .ev.event_type = RTE_EVENT_TYPE_TIMER,
1569 .state = RTE_EVENT_TIMER_NOT_ARMED,
1572 rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1573 if (evtim == NULL) {
1574 /* Failed to get an event timer object */
1578 /* Check that cancelling an uninited timer fails */
1579 ret = rte_event_timer_cancel_burst(adapter, &evtim, 1);
1580 TEST_ASSERT_EQUAL(ret, 0, "Succeeded unexpectedly in canceling "
1582 TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after "
1583 "cancelling uninited timer");
1585 /* Set up a timer */
1587 evtim->ev.event_ptr = evtim;
1588 evtim->timeout_ticks = CALC_TICKS(30); // expire in 3 sec
1590 /* Check that cancelling an inited but unarmed timer fails */
1591 ret = rte_event_timer_cancel_burst(adapter, &evtim, 1);
1592 TEST_ASSERT_EQUAL(ret, 0, "Succeeded unexpectedly in canceling "
1594 TEST_ASSERT_EQUAL(rte_errno, EINVAL, "Unexpected rte_errno value after "
1595 "cancelling unarmed timer");
1597 ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1598 TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1599 rte_strerror(rte_errno));
1600 TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED,
1601 "evtim in incorrect state");
1606 ret = rte_event_timer_cancel_burst(adapter, &evtim, 1);
1607 TEST_ASSERT_EQUAL(ret, 1, "Failed to cancel event_timer: %s\n",
1608 rte_strerror(rte_errno));
1609 TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_CANCELED,
1610 "evtim in incorrect state");
1614 /* Make sure that no expiry event was generated */
1615 n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1616 TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected timer expiry event\n");
1618 rte_mempool_put(eventdev_test_mempool, evtim);
1620 return TEST_SUCCESS;
1624 event_timer_cancel_double(void)
1628 struct rte_event_timer_adapter *adapter = timdev;
1629 struct rte_event_timer *evtim = NULL;
1630 struct rte_event evs[BATCH_SIZE];
1631 const struct rte_event_timer init_tim = {
1632 .ev.op = RTE_EVENT_OP_NEW,
1633 .ev.queue_id = TEST_QUEUE_ID,
1634 .ev.sched_type = RTE_SCHED_TYPE_ATOMIC,
1635 .ev.priority = RTE_EVENT_DEV_PRIORITY_NORMAL,
1636 .ev.event_type = RTE_EVENT_TYPE_TIMER,
1637 .state = RTE_EVENT_TIMER_NOT_ARMED,
1638 .timeout_ticks = CALC_TICKS(5), // expire in .5 sec
1641 rte_mempool_get(eventdev_test_mempool, (void **)&evtim);
1642 if (evtim == NULL) {
1643 /* Failed to get an event timer object */
1647 /* Set up a timer */
1649 evtim->ev.event_ptr = evtim;
1650 evtim->timeout_ticks = CALC_TICKS(30); // expire in 3 sec
1652 ret = rte_event_timer_arm_burst(adapter, &evtim, 1);
1653 TEST_ASSERT_EQUAL(ret, 1, "Failed to arm event timer: %s\n",
1654 rte_strerror(rte_errno));
1655 TEST_ASSERT_EQUAL(evtim->state, RTE_EVENT_TIMER_ARMED,
1656 "timer in unexpected state");
1658 /* Now, test that referencing the same timer twice in the same call
1661 struct rte_event_timer *evtim_arr[] = {evtim, evtim};
1662 ret = rte_event_timer_cancel_burst(adapter, evtim_arr,
1663 RTE_DIM(evtim_arr));
1665 /* Two requests to cancel same timer, only one should succeed */
1666 TEST_ASSERT_EQUAL(ret, 1, "Succeeded unexpectedly in canceling timer "
1669 TEST_ASSERT_EQUAL(rte_errno, EALREADY, "Unexpected rte_errno value "
1670 "after double-cancel: rte_errno = %d", rte_errno);
1674 /* Still make sure that no expiry event was generated */
1675 n = rte_event_dequeue_burst(evdev, TEST_PORT_ID, evs, RTE_DIM(evs), 0);
1676 TEST_ASSERT_EQUAL(n, 0, "Dequeued unexpected timer expiry event\n");
1678 rte_mempool_put(eventdev_test_mempool, evtim);
1680 return TEST_SUCCESS;
1683 /* Check that event timer adapter tick resolution works as expected by testing
1684 * the number of adapter ticks that occur within a particular time interval.
1687 adapter_tick_resolution(void)
1689 struct rte_event_timer_adapter_stats stats;
1690 uint64_t adapter_tick_count;
1692 /* Only run this test in the software driver case */
1693 if (!using_services)
1696 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stats_reset(timdev),
1697 "Failed to reset stats");
1699 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stats_get(timdev,
1700 &stats), "Failed to get adapter stats");
1701 TEST_ASSERT_EQUAL(stats.adapter_tick_count, 0, "Adapter tick count "
1704 /* Delay 1 second; should let at least 10 ticks occur with the default
1705 * adapter configuration used by this test.
1709 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_stats_get(timdev,
1710 &stats), "Failed to get adapter stats");
1712 adapter_tick_count = stats.adapter_tick_count;
1713 TEST_ASSERT(adapter_tick_count >= 10 && adapter_tick_count <= 12,
1714 "Expected 10-12 adapter ticks, got %"PRIu64"\n",
1715 adapter_tick_count);
1717 return TEST_SUCCESS;
1721 adapter_create_max(void)
1724 uint32_t svc_start_count, svc_end_count;
1725 struct rte_event_timer_adapter *adapters[
1726 RTE_EVENT_TIMER_ADAPTER_NUM_MAX + 1];
1728 struct rte_event_timer_adapter_conf conf = {
1729 .event_dev_id = evdev,
1730 // timer_adapter_id set in loop
1731 .clk_src = RTE_EVENT_TIMER_ADAPTER_CPU_CLK,
1732 .timer_tick_ns = NSECPERSEC / 10,
1733 .max_tmo_ns = 180 * NSECPERSEC,
1734 .nb_timers = MAX_TIMERS,
1735 .flags = RTE_EVENT_TIMER_ADAPTER_F_ADJUST_RES,
1738 if (!using_services)
1741 svc_start_count = rte_service_get_count();
1743 /* This test expects that there are sufficient service IDs available
1744 * to be allocated. I.e., RTE_EVENT_TIMER_ADAPTER_NUM_MAX may need to
1745 * be less than RTE_SERVICE_NUM_MAX if anything else uses a service
1746 * (the SW event device, for example).
1748 for (i = 0; i < RTE_EVENT_TIMER_ADAPTER_NUM_MAX; i++) {
1749 conf.timer_adapter_id = i;
1750 adapters[i] = rte_event_timer_adapter_create_ext(&conf,
1751 test_port_conf_cb, NULL);
1752 TEST_ASSERT_NOT_NULL(adapters[i], "Failed to create adapter "
1756 conf.timer_adapter_id = i;
1757 adapters[i] = rte_event_timer_adapter_create(&conf);
1758 TEST_ASSERT_NULL(adapters[i], "Created too many adapters");
1760 /* Check that at least RTE_EVENT_TIMER_ADAPTER_NUM_MAX services
1763 svc_end_count = rte_service_get_count();
1764 TEST_ASSERT_EQUAL(svc_end_count - svc_start_count,
1765 RTE_EVENT_TIMER_ADAPTER_NUM_MAX,
1766 "Failed to create expected number of services");
1768 for (i = 0; i < RTE_EVENT_TIMER_ADAPTER_NUM_MAX; i++)
1769 TEST_ASSERT_SUCCESS(rte_event_timer_adapter_free(adapters[i]),
1770 "Failed to free adapter %d", i);
1772 /* Check that service count is back to where it was at start */
1773 svc_end_count = rte_service_get_count();
1774 TEST_ASSERT_EQUAL(svc_start_count, svc_end_count, "Failed to release "
1775 "correct number of services");
1777 return TEST_SUCCESS;
1780 static struct unit_test_suite event_timer_adptr_functional_testsuite = {
1781 .suite_name = "event timer functional test suite",
1782 .setup = testsuite_setup,
1783 .teardown = testsuite_teardown,
1784 .unit_test_cases = {
1785 TEST_CASE_ST(timdev_setup_usec, timdev_teardown,
1787 TEST_CASE_ST(timdev_setup_usec, timdev_teardown,
1789 TEST_CASE_ST(timdev_setup_usec, timdev_teardown,
1790 test_timer_arm_burst),
1791 TEST_CASE_ST(timdev_setup_sec, timdev_teardown,
1793 TEST_CASE_ST(timdev_setup_sec, timdev_teardown,
1794 test_timer_cancel_random),
1795 TEST_CASE_ST(timdev_setup_usec_multicore, timdev_teardown,
1796 test_timer_arm_multicore),
1797 TEST_CASE_ST(timdev_setup_usec_multicore, timdev_teardown,
1798 test_timer_arm_burst_multicore),
1799 TEST_CASE_ST(timdev_setup_sec_multicore, timdev_teardown,
1800 test_timer_cancel_multicore),
1801 TEST_CASE_ST(timdev_setup_sec_multicore, timdev_teardown,
1802 test_timer_cancel_burst_multicore),
1803 TEST_CASE(adapter_create),
1804 TEST_CASE_ST(timdev_setup_msec, NULL, adapter_free),
1805 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1807 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1809 TEST_CASE_ST(NULL, timdev_teardown,
1811 TEST_CASE_ST(timdev_setup_msec, NULL,
1813 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1814 stat_inc_reset_ev_enq),
1815 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1817 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1818 event_timer_arm_double),
1819 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1820 event_timer_arm_expiry),
1821 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1822 event_timer_arm_rearm),
1823 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1824 event_timer_arm_max),
1825 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1826 event_timer_arm_invalid_sched_type),
1827 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1828 event_timer_arm_invalid_timeout),
1829 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1830 event_timer_cancel),
1831 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1832 event_timer_cancel_double),
1833 TEST_CASE_ST(timdev_setup_msec, timdev_teardown,
1834 adapter_tick_resolution),
1835 TEST_CASE(adapter_create_max),
1836 TEST_CASES_END() /**< NULL terminate unit test array */
1841 test_event_timer_adapter_func(void)
1843 return unit_test_suite_runner(&event_timer_adptr_functional_testsuite);
1846 REGISTER_TEST_COMMAND(event_timer_adapter_test, test_event_timer_adapter_func);