1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 2a9de470cSBruce Richardson * Copyright(c) 2010-2014 Intel Corporation 3a9de470cSBruce Richardson */ 4a9de470cSBruce Richardson 5a9de470cSBruce Richardson #include <stdio.h> 6*31fcb7d7SStephen Hemminger #include <stdbool.h> 7a9de470cSBruce Richardson #include <stdint.h> 8a9de470cSBruce Richardson 9a9de470cSBruce Richardson #include <rte_alarm.h> 10*31fcb7d7SStephen Hemminger #include <rte_atomic.h> 11*31fcb7d7SStephen Hemminger #include <rte_common.h> 12*31fcb7d7SStephen Hemminger #include <rte_cycles.h> 13*31fcb7d7SStephen Hemminger #include <rte_errno.h> 14a9de470cSBruce Richardson 15a9de470cSBruce Richardson #include "test.h" 16a9de470cSBruce Richardson 17*31fcb7d7SStephen Hemminger #ifndef US_PER_SEC 18*31fcb7d7SStephen Hemminger #define US_PER_SEC 1000000u 19*31fcb7d7SStephen Hemminger #endif 20a9de470cSBruce Richardson 21a9de470cSBruce Richardson static void 22a9de470cSBruce Richardson test_alarm_callback(void *cb_arg) 23a9de470cSBruce Richardson { 24*31fcb7d7SStephen Hemminger RTE_ATOMIC(bool) *triggered = cb_arg; 25*31fcb7d7SStephen Hemminger 26*31fcb7d7SStephen Hemminger rte_atomic_store_explicit(triggered, 1, rte_memory_order_release); 27a9de470cSBruce Richardson } 28a9de470cSBruce Richardson 29*31fcb7d7SStephen Hemminger 30a9de470cSBruce Richardson static int 31a9de470cSBruce Richardson test_alarm(void) 32a9de470cSBruce Richardson { 33*31fcb7d7SStephen Hemminger RTE_ATOMIC(bool) triggered = false; 34*31fcb7d7SStephen Hemminger RTE_ATOMIC(bool) later = false; 35*31fcb7d7SStephen Hemminger int ret; 36*31fcb7d7SStephen Hemminger 37*31fcb7d7SStephen Hemminger /* check if it will fail to set alarm with wrong us values */ 38*31fcb7d7SStephen Hemminger TEST_ASSERT_FAIL(rte_eal_alarm_set(0, test_alarm_callback, NULL), 39*31fcb7d7SStephen Hemminger "Expected rte_eal_alarm_set to fail with 0 us value"); 40*31fcb7d7SStephen Hemminger 41*31fcb7d7SStephen Hemminger /* check it if will fail with a very large timeout value */ 42*31fcb7d7SStephen Hemminger TEST_ASSERT_FAIL(rte_eal_alarm_set(UINT64_MAX - 1, test_alarm_callback, NULL), 43*31fcb7d7SStephen Hemminger "Expected rte_eal_alarm_set to fail with (UINT64_MAX-1) us value"); 44a9de470cSBruce Richardson 45a9de470cSBruce Richardson /* check if it will fail to set alarm with null callback parameter */ 46*31fcb7d7SStephen Hemminger TEST_ASSERT_FAIL(rte_eal_alarm_set(US_PER_SEC, NULL, NULL), 47*31fcb7d7SStephen Hemminger "Expected rte_eal_alarm_set to fail with null callback parameter"); 48a9de470cSBruce Richardson 49a9de470cSBruce Richardson /* check if it will fail to remove alarm with null callback parameter */ 50*31fcb7d7SStephen Hemminger TEST_ASSERT_FAIL(rte_eal_alarm_cancel(NULL, NULL), 51*31fcb7d7SStephen Hemminger "Expected rte_eal_alarm_cancel to fail with null callback parameter"); 52*31fcb7d7SStephen Hemminger 53*31fcb7d7SStephen Hemminger /* check if can set a alarm for one second */ 54*31fcb7d7SStephen Hemminger TEST_ASSERT_SUCCESS(rte_eal_alarm_set(US_PER_SEC, test_alarm_callback, &triggered), 55*31fcb7d7SStephen Hemminger "Setting one second alarm failed"); 56*31fcb7d7SStephen Hemminger 57*31fcb7d7SStephen Hemminger /* set a longer alarm that will be canceled. */ 58*31fcb7d7SStephen Hemminger TEST_ASSERT_SUCCESS(rte_eal_alarm_set(10 * US_PER_SEC, test_alarm_callback, &later), 59*31fcb7d7SStephen Hemminger "Setting ten second alarm failed"); 60*31fcb7d7SStephen Hemminger 61*31fcb7d7SStephen Hemminger /* wait for alarm to happen */ 62*31fcb7d7SStephen Hemminger while (rte_atomic_load_explicit(&triggered, rte_memory_order_acquire) == false) 63*31fcb7d7SStephen Hemminger rte_delay_us_sleep(US_PER_SEC / 10); 64*31fcb7d7SStephen Hemminger 65*31fcb7d7SStephen Hemminger TEST_ASSERT(!rte_atomic_load_explicit(&later, rte_memory_order_acquire), 66*31fcb7d7SStephen Hemminger "Only one alarm should have fired."); 67*31fcb7d7SStephen Hemminger 68*31fcb7d7SStephen Hemminger ret = rte_eal_alarm_cancel(test_alarm_callback, &triggered); 69*31fcb7d7SStephen Hemminger TEST_ASSERT(ret == 0 && rte_errno == ENOENT, 70*31fcb7d7SStephen Hemminger "Canceling alarm after run ret %d: %s", ret, rte_strerror(rte_errno)); 71*31fcb7d7SStephen Hemminger 72*31fcb7d7SStephen Hemminger ret = rte_eal_alarm_cancel(test_alarm_callback, &later); 73*31fcb7d7SStephen Hemminger TEST_ASSERT(ret == 1, "Canceling ten second alarm failed %d: %s", 74*31fcb7d7SStephen Hemminger ret, rte_strerror(rte_errno)); 75a9de470cSBruce Richardson 76a9de470cSBruce Richardson return 0; 77a9de470cSBruce Richardson } 78a9de470cSBruce Richardson 79*31fcb7d7SStephen Hemminger REGISTER_FAST_TEST(alarm_autotest, true, true, test_alarm); 80