# to indicate whether it can run in no-huge mode.
fast_tests = [
['acl_autotest', true],
- ['alarm_autotest', false],
['atomic_autotest', false],
['bitops_autotest', true],
['byteorder_autotest', true],
['cmdline_autotest', true],
['common_autotest', true],
['cpuflags_autotest', true],
- ['cycles_autotest', true],
['debug_autotest', true],
['eal_flags_c_opt_autotest', false],
['eal_flags_main_opt_autotest', false],
['user_delay_us', true],
['version_autotest', true],
['crc_autotest', true],
- ['delay_us_sleep_autotest', true],
['distributor_autotest', false],
['eventdev_common_autotest', true],
['fbarray_autotest', true],
#include <stdint.h>
#include <rte_common.h>
-#include <rte_cycles.h>
-#include <rte_interrupts.h>
-#include <rte_atomic.h>
#include <rte_alarm.h>
#include "test.h"
-#define US_PER_MS 1000
-
-#define RTE_TEST_ALARM_TIMEOUT 10 /* ms */
-#define RTE_TEST_CHECK_PERIOD 3 /* ms */
-#define RTE_TEST_MAX_REPEAT 20
-
static volatile int flag;
static void
printf("Callback setting flag - OK. [cb_arg = %p]\n", cb_arg);
}
-static rte_atomic32_t cb_count;
-
-static void
-test_multi_cb(void *arg)
-{
- rte_atomic32_inc(&cb_count);
- printf("In %s - arg = %p\n", __func__, arg);
-}
-
-static volatile int recursive_error = 0;
-
-static void
-test_remove_in_callback(void *arg)
-{
- printf("In %s - arg = %p\n", __func__, arg);
- if (rte_eal_alarm_cancel(test_remove_in_callback, arg) ||
- rte_eal_alarm_cancel(test_remove_in_callback, (void *)-1)) {
- printf("Error - cancelling callback from within function succeeded!\n");
- recursive_error = 1;
- }
- flag = (int)((uintptr_t)arg);
-}
-
-static volatile int flag_2;
-
-static void
-test_remove_in_callback_2(void *arg)
-{
- if (rte_eal_alarm_cancel(test_remove_in_callback_2, arg) || rte_eal_alarm_cancel(test_remove_in_callback_2, (void *)-1)) {
- printf("Error - cancelling callback of test_remove_in_callback_2\n");
- return;
- }
- flag_2 = 1;
-}
-
-static int
-test_multi_alarms(void)
-{
- int rm_count = 0;
- int count = 0;
- cb_count.cnt = 0;
-
- printf("Expect 6 callbacks in order...\n");
- /* add two alarms in order */
- rte_eal_alarm_set(10 * US_PER_MS, test_multi_cb, (void *)1);
- rte_eal_alarm_set(20 * US_PER_MS, test_multi_cb, (void *)2);
-
- /* now add in reverse order */
- rte_eal_alarm_set(60 * US_PER_MS, test_multi_cb, (void *)6);
- rte_eal_alarm_set(50 * US_PER_MS, test_multi_cb, (void *)5);
- rte_eal_alarm_set(40 * US_PER_MS, test_multi_cb, (void *)4);
- rte_eal_alarm_set(30 * US_PER_MS, test_multi_cb, (void *)3);
-
- /* wait for expiry */
- rte_delay_ms(65);
- if (cb_count.cnt != 6) {
- printf("Missing callbacks\n");
- /* remove any callbacks that might remain */
- rte_eal_alarm_cancel(test_multi_cb, (void *)-1);
- return -1;
- }
-
- cb_count.cnt = 0;
- printf("Expect only callbacks with args 1 and 3...\n");
- /* Add 3 flags, then delete one */
- rte_eal_alarm_set(30 * US_PER_MS, test_multi_cb, (void *)3);
- rte_eal_alarm_set(20 * US_PER_MS, test_multi_cb, (void *)2);
- rte_eal_alarm_set(10 * US_PER_MS, test_multi_cb, (void *)1);
- rm_count = rte_eal_alarm_cancel(test_multi_cb, (void *)2);
-
- rte_delay_ms(35);
- if (cb_count.cnt != 2 || rm_count != 1) {
- printf("Error: invalid flags count or alarm removal failure"
- " - flags value = %d, expected = %d\n",
- (int)cb_count.cnt, 2);
- /* remove any callbacks that might remain */
- rte_eal_alarm_cancel(test_multi_cb, (void *)-1);
- return -1;
- }
-
- printf("Testing adding and then removing multiple alarms\n");
- /* finally test that no callbacks are called if we delete them all*/
- rte_eal_alarm_set(10 * US_PER_MS, test_multi_cb, (void *)1);
- rte_eal_alarm_set(10 * US_PER_MS, test_multi_cb, (void *)2);
- rte_eal_alarm_set(10 * US_PER_MS, test_multi_cb, (void *)3);
- rm_count = rte_eal_alarm_cancel(test_alarm_callback, (void *)-1);
- if (rm_count != 0) {
- printf("Error removing non-existant alarm succeeded\n");
- rte_eal_alarm_cancel(test_multi_cb, (void *) -1);
- return -1;
- }
- rm_count = rte_eal_alarm_cancel(test_multi_cb, (void *) -1);
- if (rm_count != 3) {
- printf("Error removing all pending alarm callbacks\n");
- return -1;
- }
-
- /* Test that we cannot cancel an alarm from within the callback itself
- * Also test that we can cancel head-of-line callbacks ok.*/
- flag = 0;
- recursive_error = 0;
- rte_eal_alarm_set(10 * US_PER_MS, test_remove_in_callback, (void *)1);
- rte_eal_alarm_set(20 * US_PER_MS, test_remove_in_callback, (void *)2);
- rm_count = rte_eal_alarm_cancel(test_remove_in_callback, (void *)1);
- if (rm_count != 1) {
- printf("Error cancelling head-of-list callback\n");
- return -1;
- }
- rte_delay_ms(15);
- if (flag != 0) {
- printf("Error, cancelling head-of-list leads to premature callback\n");
- return -1;
- }
-
- while (flag != 2 && count++ < RTE_TEST_MAX_REPEAT)
- rte_delay_ms(10);
-
- if (flag != 2) {
- printf("Error - expected callback not called\n");
- rte_eal_alarm_cancel(test_remove_in_callback, (void *)-1);
- return -1;
- }
- if (recursive_error == 1)
- return -1;
-
- /* Check if it can cancel all for the same callback */
- printf("Testing canceling all for the same callback\n");
- flag_2 = 0;
- rte_eal_alarm_set(10 * US_PER_MS, test_remove_in_callback, (void *)1);
- rte_eal_alarm_set(20 * US_PER_MS, test_remove_in_callback_2, (void *)2);
- rte_eal_alarm_set(30 * US_PER_MS, test_remove_in_callback_2, (void *)3);
- rte_eal_alarm_set(40 * US_PER_MS, test_remove_in_callback, (void *)4);
- rm_count = rte_eal_alarm_cancel(test_remove_in_callback_2, (void *)-1);
- if (rm_count != 2) {
- printf("Error, cannot cancel all for the same callback\n");
- return -1;
- }
- rm_count = rte_eal_alarm_cancel(test_remove_in_callback, (void *)-1);
- if (rm_count != 2) {
- printf("Error, cannot cancel all for the same callback\n");
- return -1;
- }
-
- return 0;
-}
-
static int
test_alarm(void)
{
- int count = 0;
#ifdef RTE_EXEC_ENV_FREEBSD
printf("The alarm API is not supported on FreeBSD\n");
return 0;
#endif
- /* check if the callback will be called */
- printf("check if the callback will be called\n");
- flag = 0;
- if (rte_eal_alarm_set(RTE_TEST_ALARM_TIMEOUT * US_PER_MS,
- test_alarm_callback, NULL) < 0) {
- printf("fail to set alarm callback\n");
- return -1;
- }
- while (flag == 0 && count++ < RTE_TEST_MAX_REPEAT)
- rte_delay_ms(RTE_TEST_CHECK_PERIOD);
-
- if (flag == 0){
- printf("Callback not called\n");
- return -1;
- }
/* check if it will fail to set alarm with wrong us value */
printf("check if it will fail to set alarm with wrong ms values\n");
/* check if it will fail to set alarm with null callback parameter */
printf("check if it will fail to set alarm with null callback parameter\n");
- if (rte_eal_alarm_set(RTE_TEST_ALARM_TIMEOUT, NULL, NULL) >= 0) {
+ if (rte_eal_alarm_set(10 /* ms */, NULL, NULL) >= 0) {
printf("should not be successful to set alarm with null callback parameter\n");
return -1;
}
return -1;
}
- if (test_multi_alarms() != 0)
- return -1;
-
return 0;
}
#include "test.h"
-#define N 10000
-
-/*
- * Cycles test
- * ===========
- *
- * - Loop N times and check that the timer always increments and
- * never decrements during this loop.
- *
- * - Wait one second using rte_usleep() and check that the increment
- * of cycles is correct with regard to the frequency of the timer.
- */
-
-static int
-check_wait_one_second(void)
-{
- uint64_t cycles, prev_cycles;
- uint64_t hz = rte_get_timer_hz();
- uint64_t max_inc = (hz / 100); /* 10 ms max between 2 reads */
-
- /* check that waiting 1 second is precise */
- prev_cycles = rte_get_timer_cycles();
- rte_delay_us(1000000);
- cycles = rte_get_timer_cycles();
-
- if ((uint64_t)(cycles - prev_cycles) > (hz + max_inc)) {
- printf("delay_us is not accurate: too long\n");
- return -1;
- }
- if ((uint64_t)(cycles - prev_cycles) < (hz - max_inc)) {
- printf("delay_us is not accurate: too short\n");
- return -1;
- }
-
- return 0;
-}
-
-static int
-test_cycles(void)
-{
- unsigned i;
- uint64_t start_cycles, cycles, prev_cycles;
- uint64_t hz = rte_get_timer_hz();
- uint64_t max_inc = (hz / 100); /* 10 ms max between 2 reads */
-
- /* check that the timer is always incrementing */
- start_cycles = rte_get_timer_cycles();
- prev_cycles = start_cycles;
- for (i=0; i<N; i++) {
- cycles = rte_get_timer_cycles();
- if ((uint64_t)(cycles - prev_cycles) > max_inc) {
- printf("increment too high or going backwards\n");
- return -1;
- }
- prev_cycles = cycles;
- }
-
- return check_wait_one_second();
-}
-
-REGISTER_TEST_COMMAND(cycles_autotest, test_cycles);
-
-/*
- * One second precision test with rte_delay_us_sleep.
- */
-
-static int
-test_delay_us_sleep(void)
-{
- int rv;
-
- rte_delay_us_callback_register(rte_delay_us_sleep);
- rv = check_wait_one_second();
- /* restore original delay function */
- rte_delay_us_callback_register(rte_delay_us_block);
-
- return rv;
-}
-
-REGISTER_TEST_COMMAND(delay_us_sleep_autotest, test_delay_us_sleep);
-
/*
* rte_delay_us_callback test
*