diff options
author | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> | 2016-01-21 17:26:14 +0200 |
---|---|---|
committer | Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org> | 2016-01-21 17:26:14 +0200 |
commit | d20483de8f0e46cd1892cf3b18f302f910f68e36 (patch) | |
tree | ca50ddba3ef1f862a79a880bba1d522208f20fe6 | |
parent | 41a0e90cf821254be7cf0d528b5c86cc08d22999 (diff) | |
parent | 4c823eb5161d4f1b51ee47e963a1a9b0575d3e1a (diff) |
Merge remote-tracking branch 'linaro-odp/master' into new_master
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@linaro.org>
Conflicts:
platform/linux-generic/odp_system_info.c
34 files changed, 434 insertions, 138 deletions
diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c index 757dc540..10643dce 100644 --- a/example/generator/odp_generator.c +++ b/example/generator/odp_generator.c @@ -5,7 +5,9 @@ */ /** enable strtok */ -#define _POSIX_C_SOURCE 200112L +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif #include <time.h> #include <stdlib.h> diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c index fab10359..6426d995 100644 --- a/example/ipsec/odp_ipsec.c +++ b/example/ipsec/odp_ipsec.c @@ -10,9 +10,11 @@ * @example odp_example_ipsec.c ODP basic packet IO cross connect with IPsec test application */ -#define _DEFAULT_SOURCE /* enable strtok */ -#define _POSIX_C_SOURCE 200112L +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + #include <stdlib.h> #include <getopt.h> #include <unistd.h> diff --git a/example/ipsec/odp_ipsec_fwd_db.c b/example/ipsec/odp_ipsec_fwd_db.c index 6604e3a0..59cb6e42 100644 --- a/example/ipsec/odp_ipsec_fwd_db.c +++ b/example/ipsec/odp_ipsec_fwd_db.c @@ -5,7 +5,9 @@ */ /* enable strtok */ -#define _POSIX_C_SOURCE 200112L +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif #include <stdlib.h> #include <string.h> diff --git a/example/ipsec/odp_ipsec_sa_db.c b/example/ipsec/odp_ipsec_sa_db.c index 928c4cb4..8b2d2121 100644 --- a/example/ipsec/odp_ipsec_sa_db.c +++ b/example/ipsec/odp_ipsec_sa_db.c @@ -5,7 +5,9 @@ */ /* enable strtok */ -#define _POSIX_C_SOURCE 200112L +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif #include <stdlib.h> #include <string.h> diff --git a/example/ipsec/odp_ipsec_sp_db.c b/example/ipsec/odp_ipsec_sp_db.c index 2ce8c93c..48874eb0 100644 --- a/example/ipsec/odp_ipsec_sp_db.c +++ b/example/ipsec/odp_ipsec_sp_db.c @@ -5,7 +5,9 @@ */ /* enable strtok */ -#define _POSIX_C_SOURCE 200112L +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif #include <stdlib.h> #include <string.h> diff --git a/example/ipsec/odp_ipsec_stream.c b/example/ipsec/odp_ipsec_stream.c index f750e180..9c2722e9 100644 --- a/example/ipsec/odp_ipsec_stream.c +++ b/example/ipsec/odp_ipsec_stream.c @@ -5,7 +5,9 @@ */ /* enable strtok */ -#define _POSIX_C_SOURCE 200112L +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif #include <stdlib.h> #include <string.h> diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am index 80641935..279e5e29 100644 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@ -100,6 +100,7 @@ noinst_HEADERS = \ ${srcdir}/include/odp_packet_socket.h \ ${srcdir}/include/odp_packet_tap.h \ ${srcdir}/include/odp_pool_internal.h \ + ${srcdir}/include/odp_posix_extensions.h \ ${srcdir}/include/odp_queue_internal.h \ ${srcdir}/include/odp_schedule_internal.h \ ${srcdir}/include/odp_spin_internal.h \ diff --git a/platform/linux-generic/arch/linux/odp_cpu_cycles.c b/platform/linux-generic/arch/linux/odp_cpu_cycles.c index 37a4d94f..7509bf28 100644 --- a/platform/linux-generic/arch/linux/odp_cpu_cycles.c +++ b/platform/linux-generic/arch/linux/odp_cpu_cycles.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#define _POSIX_C_SOURCE 199309L +#include <odp_posix_extensions.h> #include <stdlib.h> #include <time.h> diff --git a/platform/linux-generic/include/odp/plat/time_types.h b/platform/linux-generic/include/odp/plat/time_types.h index 14c35f0b..1b9409b2 100644 --- a/platform/linux-generic/include/odp/plat/time_types.h +++ b/platform/linux-generic/include/odp/plat/time_types.h @@ -23,7 +23,7 @@ extern "C" { /** * @internal Time structure used to isolate linux-generic implementation from - * the linux timespec structure, which is dependent on _POSIX_C_SOURCE level. + * the linux timespec structure, which is dependent on POSIX extension level. */ typedef struct odp_time_t { int64_t tv_sec; /**< @internal Seconds */ diff --git a/platform/linux-generic/include/odp_internal.h b/platform/linux-generic/include/odp_internal.h index f20bd0a8..cd0d35a2 100644 --- a/platform/linux-generic/include/odp_internal.h +++ b/platform/linux-generic/include/odp_internal.h @@ -28,9 +28,29 @@ struct odp_global_data_s { odp_abort_func_t abort_fn; }; +enum init_stage { + NO_INIT = 0, /* No init stages completed */ + TIME_INIT = 1, + SYSINFO_INIT = 2, + SHM_INIT = 3, + THREAD_INIT = 4, + POOL_INIT = 5, + QUEUE_INIT = 6, + SCHED_INIT = 7, + PKTIO_INIT = 8, + TIMER_INIT = 9, + CRYPTO_INIT = 10, + CLASSIFICATION_INIT = 11, + ALL_INIT = 12 /* All init stages completed */ +}; + extern struct odp_global_data_s odp_global_data; +int _odp_term_global(enum init_stage stage); +int _odp_term_local(enum init_stage stage); + int odp_system_info_init(void); +int odp_system_info_term(void); int odp_thread_init_global(void); int odp_thread_init_local(odp_thread_type_t type); @@ -65,9 +85,11 @@ int odp_schedule_init_local(void); int odp_schedule_term_local(void); int odp_timer_init_global(void); +int odp_timer_term_global(void); int odp_timer_disarm_all(void); -int odp_time_global_init(void); +int odp_time_init_global(void); +int odp_time_term_global(void); void _odp_flush_caches(void); diff --git a/platform/linux-generic/include/odp_posix_extensions.h b/platform/linux-generic/include/odp_posix_extensions.h new file mode 100644 index 00000000..4b6e3359 --- /dev/null +++ b/platform/linux-generic/include/odp_posix_extensions.h @@ -0,0 +1,36 @@ +/* Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_POSIX_EXTENSIONS_H +#define ODP_POSIX_EXTENSIONS_H + +/* + * This should be the only file to define POSIX extension levels. When + * extensions are needed it should be included first in each C source file. + * Header files should not include it. + */ + +/* + * Enable POSIX and GNU extensions + * + * This macro defines: + * o _BSD_SOURCE, _SVID_SOURCE, _ATFILE_SOURCE, _LARGEāFILE64_SOURCE, + * _ISOC99_SOURCE, _XOPEN_SOURCE_EXTENDED, _POSIX_SOURCE + * o _POSIX_C_SOURCE with the value: + * * 200809L since glibc v2.10 (== POSIX.1-2008 base specification) + * * 200112L before glibc v2.10 (== POSIX.1-2001 base specification) + * * 199506L before glibc v2.5 + * * 199309L before glibc v2.1 + * o _XOPEN_SOURCE with the value: + * * 700 since glibc v2.10 + * * 600 before glibc v2.10 + * * 500 before glibc v2.2 + */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#endif diff --git a/platform/linux-generic/odp_cpumask.c b/platform/linux-generic/odp_cpumask.c index 5cd6a388..c5c12602 100644 --- a/platform/linux-generic/odp_cpumask.c +++ b/platform/linux-generic/odp_cpumask.c @@ -4,9 +4,8 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif +#include <odp_posix_extensions.h> + #include <sched.h> #include <pthread.h> diff --git a/platform/linux-generic/odp_cpumask_task.c b/platform/linux-generic/odp_cpumask_task.c index 49dbdb78..41f2bc94 100644 --- a/platform/linux-generic/odp_cpumask_task.c +++ b/platform/linux-generic/odp_cpumask_task.c @@ -4,9 +4,8 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif +#include <odp_posix_extensions.h> + #include <sched.h> #include <pthread.h> diff --git a/platform/linux-generic/odp_init.c b/platform/linux-generic/odp_init.c index ea997428..3a990d27 100644 --- a/platform/linux-generic/odp_init.c +++ b/platform/linux-generic/odp_init.c @@ -14,6 +14,7 @@ struct odp_global_data_s odp_global_data; int odp_init_global(const odp_init_t *params, const odp_platform_init_t *platform_params ODP_UNUSED) { + enum init_stage stage = NO_INIT; odp_global_data.log_fn = odp_override_log; odp_global_data.abort_fn = odp_override_abort; @@ -24,105 +25,170 @@ int odp_init_global(const odp_init_t *params, odp_global_data.abort_fn = params->abort_fn; } - if (odp_time_global_init()) { + if (odp_time_init_global()) { ODP_ERR("ODP time init failed.\n"); - return -1; + goto init_failed; } + stage = TIME_INIT; if (odp_system_info_init()) { ODP_ERR("ODP system_info init failed.\n"); - return -1; + goto init_failed; } + stage = SYSINFO_INIT; if (odp_shm_init_global()) { ODP_ERR("ODP shm init failed.\n"); - return -1; + goto init_failed; } + stage = SHM_INIT; if (odp_thread_init_global()) { ODP_ERR("ODP thread init failed.\n"); - return -1; + goto init_failed; } + stage = THREAD_INIT; if (odp_pool_init_global()) { ODP_ERR("ODP pool init failed.\n"); - return -1; + goto init_failed; } + stage = POOL_INIT; if (odp_queue_init_global()) { ODP_ERR("ODP queue init failed.\n"); - return -1; + goto init_failed; } + stage = QUEUE_INIT; if (odp_schedule_init_global()) { ODP_ERR("ODP schedule init failed.\n"); - return -1; + goto init_failed; } + stage = SCHED_INIT; if (odp_pktio_init_global()) { ODP_ERR("ODP packet io init failed.\n"); - return -1; + goto init_failed; } + stage = PKTIO_INIT; if (odp_timer_init_global()) { ODP_ERR("ODP timer init failed.\n"); - return -1; + goto init_failed; } + stage = TIMER_INIT; if (odp_crypto_init_global()) { ODP_ERR("ODP crypto init failed.\n"); - return -1; + goto init_failed; } + stage = CRYPTO_INIT; + if (odp_classification_init_global()) { ODP_ERR("ODP classification init failed.\n"); - return -1; + goto init_failed; } + stage = CLASSIFICATION_INIT; return 0; + +init_failed: + _odp_term_global(stage); + return -1; } int odp_term_global(void) { - int rc = 0; - - if (odp_classification_term_global()) { - ODP_ERR("ODP classificatio term failed.\n"); - rc = -1; - } - - if (odp_crypto_term_global()) { - ODP_ERR("ODP crypto term failed.\n"); - rc = -1; - } - - if (odp_pktio_term_global()) { - ODP_ERR("ODP pktio term failed.\n"); - rc = -1; - } - - if (odp_schedule_term_global()) { - ODP_ERR("ODP schedule term failed.\n"); - rc = -1; - } - - if (odp_queue_term_global()) { - ODP_ERR("ODP queue term failed.\n"); - rc = -1; - } - - if (odp_pool_term_global()) { - ODP_ERR("ODP buffer pool term failed.\n"); - rc = -1; - } + return _odp_term_global(ALL_INIT); +} - if (odp_thread_term_global()) { - ODP_ERR("ODP thread term failed.\n"); - rc = -1; - } +int _odp_term_global(enum init_stage stage) +{ + int rc = 0; - if (odp_shm_term_global()) { - ODP_ERR("ODP shm term failed.\n"); - rc = -1; + switch (stage) { + case ALL_INIT: + + case CLASSIFICATION_INIT: + if (odp_classification_term_global()) { + ODP_ERR("ODP classificatio term failed.\n"); + rc = -1; + } + /* Fall through */ + + case CRYPTO_INIT: + if (odp_crypto_term_global()) { + ODP_ERR("ODP crypto term failed.\n"); + rc = -1; + } + /* Fall through */ + + case TIMER_INIT: + if (odp_timer_term_global()) { + ODP_ERR("ODP timer term failed.\n"); + rc = -1; + } + /* Fall through */ + + case PKTIO_INIT: + if (odp_pktio_term_global()) { + ODP_ERR("ODP pktio term failed.\n"); + rc = -1; + } + /* Fall through */ + + case SCHED_INIT: + if (odp_schedule_term_global()) { + ODP_ERR("ODP schedule term failed.\n"); + rc = -1; + } + /* Fall through */ + + case QUEUE_INIT: + if (odp_queue_term_global()) { + ODP_ERR("ODP queue term failed.\n"); + rc = -1; + } + /* Fall through */ + + case POOL_INIT: + if (odp_pool_term_global()) { + ODP_ERR("ODP buffer pool term failed.\n"); + rc = -1; + } + /* Fall through */ + + case THREAD_INIT: + if (odp_thread_term_global()) { + ODP_ERR("ODP thread term failed.\n"); + rc = -1; + } + /* Fall through */ + + case SHM_INIT: + if (odp_shm_term_global()) { + ODP_ERR("ODP shm term failed.\n"); + rc = -1; + } + /* Fall through */ + + case SYSINFO_INIT: + if (odp_system_info_term()) { + ODP_ERR("ODP system info term failed.\n"); + rc = -1; + } + /* Fall through */ + + case TIME_INIT: + if (odp_time_term_global()) { + ODP_ERR("ODP time term failed.\n"); + rc = -1; + } + /* Fall through */ + + case NO_INIT: + ; } return rc; @@ -130,56 +196,85 @@ int odp_term_global(void) int odp_init_local(odp_thread_type_t thr_type) { + enum init_stage stage = NO_INIT; + if (odp_shm_init_local()) { ODP_ERR("ODP shm local init failed.\n"); - return -1; + goto init_fail; } + stage = SHM_INIT; if (odp_thread_init_local(thr_type)) { ODP_ERR("ODP thread local init failed.\n"); - return -1; + goto init_fail; } + stage = THREAD_INIT; if (odp_pktio_init_local()) { ODP_ERR("ODP packet io local init failed.\n"); - return -1; + goto init_fail; } + stage = PKTIO_INIT; if (odp_pool_init_local()) { ODP_ERR("ODP pool local init failed.\n"); - return -1; + goto init_fail; } + stage = POOL_INIT; if (odp_schedule_init_local()) { ODP_ERR("ODP schedule local init failed.\n"); - return -1; + goto init_fail; } + stage = SCHED_INIT; return 0; + +init_fail: + _odp_term_local(stage); + return -1; } int odp_term_local(void) { + return _odp_term_local(ALL_INIT); +} + +int _odp_term_local(enum init_stage stage) +{ int rc = 0; int rc_thd = 0; - if (odp_schedule_term_local()) { - ODP_ERR("ODP schedule local term failed.\n"); - rc = -1; - } - - if (odp_pool_term_local()) { - ODP_ERR("ODP buffer pool local term failed.\n"); - rc = -1; - } - - rc_thd = odp_thread_term_local(); - if (rc_thd < 0) { - ODP_ERR("ODP thread local term failed.\n"); - rc = -1; - } else { - if (!rc) - rc = rc_thd; + switch (stage) { + case ALL_INIT: + + case SCHED_INIT: + if (odp_schedule_term_local()) { + ODP_ERR("ODP schedule local term failed.\n"); + rc = -1; + } + /* Fall through */ + + case POOL_INIT: + if (odp_pool_term_local()) { + ODP_ERR("ODP buffer pool local term failed.\n"); + rc = -1; + } + /* Fall through */ + + case THREAD_INIT: + rc_thd = odp_thread_term_local(); + if (rc_thd < 0) { + ODP_ERR("ODP thread local term failed.\n"); + rc = -1; + } else { + if (!rc) + rc = rc_thd; + } + /* Fall through */ + + default: + break; } return rc; diff --git a/platform/linux-generic/odp_shared_memory.c b/platform/linux-generic/odp_shared_memory.c index ab48dda4..7847cc97 100644 --- a/platform/linux-generic/odp_shared_memory.c +++ b/platform/linux-generic/odp_shared_memory.c @@ -4,8 +4,7 @@ * SPDX-License-Identifier: BSD-3-Clause */ -/*ftruncate _POSIX_C_SOURCE 200809L */ -#define _POSIX_C_SOURCE 200809L +#include <odp_posix_extensions.h> #include <odp/shared_memory.h> #include <odp_internal.h> diff --git a/platform/linux-generic/odp_system_info.c b/platform/linux-generic/odp_system_info.c index bcdeefe9..1e234f19 100644 --- a/platform/linux-generic/odp_system_info.c +++ b/platform/linux-generic/odp_system_info.c @@ -4,9 +4,8 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif +#include <odp_posix_extensions.h> + #include <odp/system_info.h> #include <odp_internal.h> #include <odp_debug_internal.h> @@ -383,6 +382,14 @@ int odp_system_info_init(void) } /* + * System info termination + */ +int odp_system_info_term(void) +{ + return 0; +} + +/* ************************* * Public access functions ************************* diff --git a/platform/linux-generic/odp_thread.c b/platform/linux-generic/odp_thread.c index 06a5dcd5..4ac1c37e 100644 --- a/platform/linux-generic/odp_thread.c +++ b/platform/linux-generic/odp_thread.c @@ -4,11 +4,9 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif -#include <sched.h> +#include <odp_posix_extensions.h> +#include <sched.h> #include <odp/thread.h> #include <odp/thrmask.h> #include <odp_internal.h> diff --git a/platform/linux-generic/odp_thrmask.c b/platform/linux-generic/odp_thrmask.c index 154ae81b..4545a823 100644 --- a/platform/linux-generic/odp_thrmask.c +++ b/platform/linux-generic/odp_thrmask.c @@ -4,10 +4,6 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - #include <odp/thrmask.h> #include <odp/cpumask.h> diff --git a/platform/linux-generic/odp_time.c b/platform/linux-generic/odp_time.c index 2cb84f2a..ca8a9551 100644 --- a/platform/linux-generic/odp_time.c +++ b/platform/linux-generic/odp_time.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#define _POSIX_C_SOURCE 200809L +#include <odp_posix_extensions.h> #include <time.h> #include <odp/time.h> @@ -192,7 +192,7 @@ uint64_t odp_time_to_u64(odp_time_t time) return time_to_ns(time) / resolution; } -int odp_time_global_init(void) +int odp_time_init_global(void) { int ret; _odp_time_t time; @@ -202,3 +202,8 @@ int odp_time_global_init(void) return ret; } + +int odp_time_term_global(void) +{ + return 0; +} diff --git a/platform/linux-generic/odp_timer.c b/platform/linux-generic/odp_timer.c index 5c1f8ca7..4bab481b 100644 --- a/platform/linux-generic/odp_timer.c +++ b/platform/linux-generic/odp_timer.c @@ -21,8 +21,8 @@ #define TB_SET_PAD(x) (void)(x) #endif -/* For snprint, POSIX timers and sigevent */ -#define _POSIX_C_SOURCE 200112L +#include <odp_posix_extensions.h> + #include <errno.h> #include <stdlib.h> #include <time.h> @@ -894,3 +894,8 @@ int odp_timer_init_global(void) odp_atomic_init_u32(&num_timer_pools, 0); return 0; } + +int odp_timer_term_global(void) +{ + return 0; +} diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c index 47745ad8..d51f0d3f 100644 --- a/platform/linux-generic/pktio/loop.c +++ b/platform/linux-generic/pktio/loop.c @@ -5,10 +5,6 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - #include <odp.h> #include <odp_packet_internal.h> #include <odp_packet_io_internal.h> diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index 11ebd558..774e8137 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -6,9 +6,7 @@ #ifdef ODP_NETMAP -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif +#include <odp_posix_extensions.h> #include <odp_packet_netmap.h> #include <odp_packet_socket.h> diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c index 0817bf59..6511132b 100644 --- a/platform/linux-generic/pktio/pcap.c +++ b/platform/linux-generic/pktio/pcap.c @@ -34,9 +34,7 @@ * The total length of the string is limited by PKTIO_NAME_LEN. */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif +#include <odp_posix_extensions.h> #include <odp.h> #include <odp_packet_internal.h> diff --git a/platform/linux-generic/pktio/pktio_common.c b/platform/linux-generic/pktio/pktio_common.c index 5729db6e..be9db330 100644 --- a/platform/linux-generic/pktio/pktio_common.c +++ b/platform/linux-generic/pktio/pktio_common.c @@ -5,10 +5,6 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - #include <odp_packet_io_internal.h> #include <odp_classification_internal.h> diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index dfdab18d..1417fb42 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -5,9 +5,7 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif +#include <odp_posix_extensions.h> #include <sys/socket.h> #include <stdio.h> diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index fcaaaf63..1d2eb3c9 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -5,9 +5,8 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif +#include <odp_posix_extensions.h> + #include <odp_packet_io_internal.h> #include <sys/socket.h> diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c index 99e15cee..1eb4f56a 100644 --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@ -27,9 +27,7 @@ * The total length of the 'iface' is limited by IF_NAMESIZE. */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif +#include <odp_posix_extensions.h> #include <errno.h> #include <fcntl.h> diff --git a/test/performance/odp_l2fwd.c b/test/performance/odp_l2fwd.c index a85b8309..31f6a708 100644 --- a/test/performance/odp_l2fwd.c +++ b/test/performance/odp_l2fwd.c @@ -11,7 +11,9 @@ */ /** enable strtok */ -#define _POSIX_C_SOURCE 200112L +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif #include <stdlib.h> #include <getopt.h> @@ -33,7 +35,7 @@ /** @def SHM_PKT_POOL_SIZE * @brief Size of the shared memory block */ -#define SHM_PKT_POOL_SIZE (512*2048) +#define SHM_PKT_POOL_SIZE 8192 /** @def SHM_PKT_POOL_BUF_SIZE * @brief Buffer size of the packet pool buffer @@ -535,7 +537,7 @@ int main(int argc, char *argv[]) odp_pool_param_init(¶ms); params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE; params.pkt.len = SHM_PKT_POOL_BUF_SIZE; - params.pkt.num = SHM_PKT_POOL_SIZE/SHM_PKT_POOL_BUF_SIZE; + params.pkt.num = SHM_PKT_POOL_SIZE; params.type = ODP_POOL_PACKET; pool = odp_pool_create("packet pool", ¶ms); diff --git a/test/performance/odp_pktio_perf.c b/test/performance/odp_pktio_perf.c index 4cc1affc..9fdc4cb8 100644 --- a/test/performance/odp_pktio_perf.c +++ b/test/performance/odp_pktio_perf.c @@ -134,6 +134,7 @@ typedef struct { uint64_t pps_curr; /* Current attempted PPS */ uint64_t pps_pass; /* Highest passing PPS */ uint64_t pps_fail; /* Lowest failing PPS */ + int warmup; /* Warmup stage - ignore results */ } test_status_t; /* Thread specific arguments */ @@ -641,7 +642,10 @@ static int run_test_single(odp_cpumask_t *thd_mask_tx, /* wait for receivers */ odph_linux_pthread_join(&thd_tbl[0], num_rx_workers); - return process_results(expected_tx_cnt, status); + if (!status->warmup) + return process_results(expected_tx_cnt, status); + + return 1; } static int run_test(void) @@ -653,6 +657,7 @@ static int run_test(void) .pps_curr = gbl_args->args.pps, .pps_pass = 0, .pps_fail = 0, + .warmup = 1, }; if (setup_txrx_masks(&txmask, &rxmask) != 0) @@ -673,6 +678,10 @@ static int run_test(void) printf("%s ", gbl_args->args.ifaces[i]); printf("\n"); + /* first time just run the test but throw away the results */ + run_test_single(&txmask, &rxmask, &status); + status.warmup = 0; + while (ret > 0) ret = run_test_single(&txmask, &rxmask, &status); @@ -951,7 +960,6 @@ static void parse_args(int argc, char *argv[], test_args_t *args) LOG_ABORT("Failed to alloc iface storage\n"); strcpy(args->if_str, optarg); - for (token = strtok(args->if_str, ","); token != NULL && args->num_ifaces < MAX_NUM_IFACES; token = strtok(NULL, ",")) diff --git a/test/performance/odp_scheduling.c b/test/performance/odp_scheduling.c index fc6ccdc2..8ec89bfe 100644 --- a/test/performance/odp_scheduling.c +++ b/test/performance/odp_scheduling.c @@ -10,9 +10,6 @@ * @example odp_example.c ODP example application */ -/* enable clock_gettime */ -#define _POSIX_C_SOURCE 200112L - #include <string.h> #include <stdlib.h> diff --git a/test/validation/pktio/pktio.c b/test/validation/pktio/pktio.c index b3732bb7..b882429d 100644 --- a/test/validation/pktio/pktio.c +++ b/test/validation/pktio/pktio.c @@ -989,7 +989,7 @@ void pktio_test_send_failure(void) * the initial short packets should be sent successfully */ odp_errno_zero(); ret = odp_pktio_send(pktio_tx, pkt_tbl, TX_BATCH_LEN); - CU_ASSERT(ret == long_pkt_idx); + CU_ASSERT_FATAL(ret == long_pkt_idx); CU_ASSERT(odp_errno() == 0); info_rx.id = pktio_rx; diff --git a/test/validation/system/system.c b/test/validation/system/system.c index 7dc2cc0c..7f54338b 100644 --- a/test/validation/system/system.c +++ b/test/validation/system/system.c @@ -10,6 +10,9 @@ #include "test_debug.h" #include "system.h" +#define DIFF_TRY_NUM 160 +#define RES_TRY_NUM 10 + void system_test_odp_version_numbers(void) { int char_ok = 0; @@ -40,6 +43,124 @@ void system_test_odp_cpu_count(void) CU_ASSERT(0 < cpus); } +void system_test_odp_cpu_cycles(void) +{ + uint64_t c2, c1; + + c1 = odp_cpu_cycles(); + odp_time_wait_ns(100); + c2 = odp_cpu_cycles(); + + CU_ASSERT(c2 != c1); +} + +void system_test_odp_cpu_cycles_max(void) +{ + uint64_t c2, c1; + uint64_t max1, max2; + + max1 = odp_cpu_cycles_max(); + odp_time_wait_ns(100); + max2 = odp_cpu_cycles_max(); + + CU_ASSERT(max1 >= UINT32_MAX / 2); + CU_ASSERT(max1 == max2); + + c1 = odp_cpu_cycles(); + odp_time_wait_ns(1000); + c2 = odp_cpu_cycles(); + + CU_ASSERT(c1 <= max1 && c2 <= max1); +} + +void system_test_odp_cpu_cycles_resolution(void) +{ + int i; + uint64_t res; + uint64_t c2, c1, max; + + max = odp_cpu_cycles_max(); + + res = odp_cpu_cycles_resolution(); + CU_ASSERT(res != 0); + CU_ASSERT(res < max / 1024); + + for (i = 0; i < RES_TRY_NUM; i++) { + c1 = odp_cpu_cycles(); + odp_time_wait_ns(100 * ODP_TIME_MSEC_IN_NS + i); + c2 = odp_cpu_cycles(); + + CU_ASSERT(c1 % res == 0); + CU_ASSERT(c2 % res == 0); + } +} + +void system_test_odp_cpu_cycles_diff(void) +{ + int i; + uint64_t c2, c1, c3, max; + uint64_t tmp, diff, res; + + res = odp_cpu_cycles_resolution(); + max = odp_cpu_cycles_max(); + + /* check resolution for wrap */ + c1 = max - 2 * res; + do + c2 = odp_cpu_cycles(); + while (c1 < c2); + + diff = odp_cpu_cycles_diff(c1, c1); + CU_ASSERT(diff == 0); + + /* wrap */ + tmp = c2 + (max - c1) + res; + diff = odp_cpu_cycles_diff(c2, c1); + CU_ASSERT(diff == tmp); + CU_ASSERT(diff % res == 0); + + /* no wrap, revert args */ + tmp = c1 - c2; + diff = odp_cpu_cycles_diff(c1, c2); + CU_ASSERT(diff == tmp); + CU_ASSERT(diff % res == 0); + + c3 = odp_cpu_cycles(); + for (i = 0; i < DIFF_TRY_NUM; i++) { + c1 = odp_cpu_cycles(); + odp_time_wait_ns(100 * ODP_TIME_MSEC_IN_NS + i); + c2 = odp_cpu_cycles(); + + CU_ASSERT(c2 != c1); + CU_ASSERT(c1 % res == 0); + CU_ASSERT(c2 % res == 0); + CU_ASSERT(c1 <= max && c2 <= max); + + if (c2 > c1) + tmp = c2 - c1; + else + tmp = c2 + (max - c1) + res; + + diff = odp_cpu_cycles_diff(c2, c1); + CU_ASSERT(diff == tmp); + CU_ASSERT(diff % res == 0); + + /* wrap is detected and verified */ + if (c2 < c1) + break; + } + + /* wrap was detected, no need to continue */ + if (i < DIFF_TRY_NUM) + return; + + /* wrap has to be detected if possible */ + CU_ASSERT(max > UINT32_MAX); + CU_ASSERT((max - c3) > UINT32_MAX); + + printf("wrap was not detected..."); +} + void system_test_odp_sys_cache_line_size(void) { uint64_t cache_size; @@ -91,6 +212,10 @@ odp_testinfo_t system_suite[] = { ODP_TEST_INFO(system_test_odp_sys_page_size), ODP_TEST_INFO(system_test_odp_sys_huge_page_size), ODP_TEST_INFO(system_test_odp_sys_cpu_hz), + ODP_TEST_INFO(system_test_odp_cpu_cycles), + ODP_TEST_INFO(system_test_odp_cpu_cycles_max), + ODP_TEST_INFO(system_test_odp_cpu_cycles_resolution), + ODP_TEST_INFO(system_test_odp_cpu_cycles_diff), ODP_TEST_INFO_NULL, }; diff --git a/test/validation/system/system.h b/test/validation/system/system.h index 869aaff4..0c263f2c 100644 --- a/test/validation/system/system.h +++ b/test/validation/system/system.h @@ -17,6 +17,10 @@ void system_test_odp_sys_cpu_model_str(void); void system_test_odp_sys_page_size(void); void system_test_odp_sys_huge_page_size(void); void system_test_odp_sys_cpu_hz(void); +void system_test_odp_cpu_cycles_max(void); +void system_test_odp_cpu_cycles(void); +void system_test_odp_cpu_cycles_diff(void); +void system_test_odp_cpu_cycles_resolution(void); /* test arrays: */ extern odp_testinfo_t system_suite[]; diff --git a/test/validation/timer/timer.c b/test/validation/timer/timer.c index dda5e4ce..5d897002 100644 --- a/test/validation/timer/timer.c +++ b/test/validation/timer/timer.c @@ -9,7 +9,10 @@ */ /* For rand_r and nanosleep */ -#define _POSIX_C_SOURCE 200112L +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + #include <time.h> #include <odp.h> #include "odp_cunit_common.h" |