aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Khoronzhuk <ivan.khoronzhuk@linaro.org>2016-01-21 17:26:14 +0200
committerIvan Khoronzhuk <ivan.khoronzhuk@linaro.org>2016-01-21 17:26:14 +0200
commitd20483de8f0e46cd1892cf3b18f302f910f68e36 (patch)
treeca50ddba3ef1f862a79a880bba1d522208f20fe6
parent41a0e90cf821254be7cf0d528b5c86cc08d22999 (diff)
parent4c823eb5161d4f1b51ee47e963a1a9b0575d3e1a (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
-rw-r--r--example/generator/odp_generator.c4
-rw-r--r--example/ipsec/odp_ipsec.c6
-rw-r--r--example/ipsec/odp_ipsec_fwd_db.c4
-rw-r--r--example/ipsec/odp_ipsec_sa_db.c4
-rw-r--r--example/ipsec/odp_ipsec_sp_db.c4
-rw-r--r--example/ipsec/odp_ipsec_stream.c4
-rw-r--r--platform/linux-generic/Makefile.am1
-rw-r--r--platform/linux-generic/arch/linux/odp_cpu_cycles.c2
-rw-r--r--platform/linux-generic/include/odp/plat/time_types.h2
-rw-r--r--platform/linux-generic/include/odp_internal.h24
-rw-r--r--platform/linux-generic/include/odp_posix_extensions.h36
-rw-r--r--platform/linux-generic/odp_cpumask.c5
-rw-r--r--platform/linux-generic/odp_cpumask_task.c5
-rw-r--r--platform/linux-generic/odp_init.c239
-rw-r--r--platform/linux-generic/odp_shared_memory.c3
-rw-r--r--platform/linux-generic/odp_system_info.c13
-rw-r--r--platform/linux-generic/odp_thread.c6
-rw-r--r--platform/linux-generic/odp_thrmask.c4
-rw-r--r--platform/linux-generic/odp_time.c9
-rw-r--r--platform/linux-generic/odp_timer.c9
-rw-r--r--platform/linux-generic/pktio/loop.c4
-rw-r--r--platform/linux-generic/pktio/netmap.c4
-rw-r--r--platform/linux-generic/pktio/pcap.c4
-rw-r--r--platform/linux-generic/pktio/pktio_common.c4
-rw-r--r--platform/linux-generic/pktio/socket.c4
-rw-r--r--platform/linux-generic/pktio/socket_mmap.c5
-rw-r--r--platform/linux-generic/pktio/tap.c4
-rw-r--r--test/performance/odp_l2fwd.c8
-rw-r--r--test/performance/odp_pktio_perf.c12
-rw-r--r--test/performance/odp_scheduling.c3
-rw-r--r--test/validation/pktio/pktio.c2
-rw-r--r--test/validation/system/system.c125
-rw-r--r--test/validation/system/system.h4
-rw-r--r--test/validation/timer/timer.c5
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(&params);
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", &params);
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"