aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2023-06-09 11:11:10 +0300
committerMatias Elo <matias.elo@nokia.com>2023-08-17 13:22:51 +0300
commit7a200d709b64e743c002dd9737cd71f54ccc54ac (patch)
tree937164d89e7b8679a42f0e3705e19243baaf0147
parentcf8d53ba3f8eca93934790cb5d5d97414a5df539 (diff)
linux-dpdk: time: refactor implementation
Simplify and optimize performance of time implementation by supporting only DPDK time API. Signed-off-by: Matias Elo <matias.elo@nokia.com> Reviewed-by: Tuomas Taipale <tuomas.taipale@nokia.com>
-rw-r--r--platform/linux-dpdk/Makefile.am21
l---------platform/linux-dpdk/arch/aarch64/odp/api/abi/cpu_time.h1
l---------platform/linux-dpdk/arch/aarch64/odp_global_time.c1
l---------platform/linux-dpdk/arch/default/odp/api/abi/cpu_time.h1
l---------platform/linux-dpdk/arch/default/odp_global_time.c1
l---------platform/linux-dpdk/arch/x86/odp/api/abi/cpu_time.h1
-rw-r--r--platform/linux-dpdk/arch/x86/odp/api/abi/time_cpu.h18
l---------platform/linux-dpdk/arch/x86/odp_global_time.c1
-rw-r--r--platform/linux-dpdk/include/odp/api/plat/time_inlines.h180
-rw-r--r--platform/linux-dpdk/odp_time.c285
10 files changed, 139 insertions, 371 deletions
diff --git a/platform/linux-dpdk/Makefile.am b/platform/linux-dpdk/Makefile.am
index a11ccd193..ad608c4e1 100644
--- a/platform/linux-dpdk/Makefile.am
+++ b/platform/linux-dpdk/Makefile.am
@@ -286,12 +286,10 @@ endif
if ARCH_IS_ARM
__LIB__libodp_dpdk_la_SOURCES += arch/default/odp_atomic.c \
arch/default/odp_cpu_cycles.c \
- arch/default/odp_global_time.c \
arch/default/odp_hash_crc32.c \
arch/default/odp_random.c \
arch/arm/odp_sysinfo_parse.c
-odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_time.h \
- arch/default/odp/api/abi/hash_crc32.h
+odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/hash_crc32.h
if !ODP_ABI_COMPAT
odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/atomic_generic.h \
arch/default/odp/api/abi/atomic_inlines.h \
@@ -314,12 +312,10 @@ if ARCH_IS_AARCH64
__LIB__libodp_dpdk_la_SOURCES += arch/aarch64/odp_atomic.c \
arch/default/odp_cpu_cycles.c \
arch/aarch64/cpu_flags.c \
- arch/aarch64/odp_global_time.c \
arch/default/odp_hash_crc32.c \
arch/default/odp_random.c \
arch/aarch64/odp_sysinfo_parse.c
-odpapiabiarchinclude_HEADERS += arch/aarch64/odp/api/abi/cpu_time.h \
- arch/aarch64/odp/api/abi/hash_crc32.h
+odpapiabiarchinclude_HEADERS += arch/aarch64/odp/api/abi/hash_crc32.h
if !ODP_ABI_COMPAT
odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/atomic_generic.h \
arch/aarch64/odp/api/abi/atomic_inlines.h \
@@ -339,12 +335,10 @@ endif
if ARCH_IS_DEFAULT
__LIB__libodp_dpdk_la_SOURCES += arch/default/odp_atomic.c \
arch/default/odp_cpu_cycles.c \
- arch/default/odp_global_time.c \
arch/default/odp_hash_crc32.c \
arch/default/odp_random.c \
arch/default/odp_sysinfo_parse.c
-odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_time.h \
- arch/default/odp/api/abi/hash_crc32.h
+odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/hash_crc32.h
if !ODP_ABI_COMPAT
odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/atomic_generic.h \
arch/default/odp/api/abi/atomic_inlines.h \
@@ -361,12 +355,10 @@ endif
if ARCH_IS_POWERPC
__LIB__libodp_dpdk_la_SOURCES += arch/default/odp_atomic.c \
arch/default/odp_cpu_cycles.c \
- arch/default/odp_global_time.c \
arch/default/odp_hash_crc32.c \
arch/default/odp_random.c \
arch/powerpc/odp_sysinfo_parse.c
-odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_time.h \
- arch/default/odp/api/abi/hash_crc32.h
+odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/hash_crc32.h
if !ODP_ABI_COMPAT
odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/atomic_generic.h \
arch/default/odp/api/abi/atomic_inlines.h \
@@ -384,13 +376,12 @@ if ARCH_IS_X86
__LIB__libodp_dpdk_la_SOURCES += arch/default/odp_atomic.c \
arch/x86/cpu_flags.c \
arch/x86/odp_cpu_cycles.c \
- arch/x86/odp_global_time.c \
arch/default/odp_hash_crc32.c \
arch/default/odp_random.c \
arch/x86/odp_sysinfo_parse.c
odpapiabiarchinclude_HEADERS += arch/x86/odp/api/abi/cpu_rdtsc.h \
- arch/x86/odp/api/abi/cpu_time.h \
- arch/x86/odp/api/abi/hash_crc32.h
+ arch/x86/odp/api/abi/hash_crc32.h \
+ arch/x86/odp/api/abi/time_cpu.h
if !ODP_ABI_COMPAT
odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/atomic_generic.h \
arch/default/odp/api/abi/atomic_inlines.h \
diff --git a/platform/linux-dpdk/arch/aarch64/odp/api/abi/cpu_time.h b/platform/linux-dpdk/arch/aarch64/odp/api/abi/cpu_time.h
deleted file mode 120000
index 52719241f..000000000
--- a/platform/linux-dpdk/arch/aarch64/odp/api/abi/cpu_time.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../../linux-generic/arch/aarch64/odp/api/abi/cpu_time.h \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/aarch64/odp_global_time.c b/platform/linux-dpdk/arch/aarch64/odp_global_time.c
deleted file mode 120000
index 1b7fa3c24..000000000
--- a/platform/linux-dpdk/arch/aarch64/odp_global_time.c
+++ /dev/null
@@ -1 +0,0 @@
-../../../linux-generic/arch/aarch64/odp_global_time.c \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/default/odp/api/abi/cpu_time.h b/platform/linux-dpdk/arch/default/odp/api/abi/cpu_time.h
deleted file mode 120000
index 941d6ccca..000000000
--- a/platform/linux-dpdk/arch/default/odp/api/abi/cpu_time.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../../linux-generic/arch/default/odp/api/abi/cpu_time.h \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/default/odp_global_time.c b/platform/linux-dpdk/arch/default/odp_global_time.c
deleted file mode 120000
index 3f54b1478..000000000
--- a/platform/linux-dpdk/arch/default/odp_global_time.c
+++ /dev/null
@@ -1 +0,0 @@
-../../../linux-generic/arch/default/odp_global_time.c \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/x86/odp/api/abi/cpu_time.h b/platform/linux-dpdk/arch/x86/odp/api/abi/cpu_time.h
deleted file mode 120000
index 2fb280b8c..000000000
--- a/platform/linux-dpdk/arch/x86/odp/api/abi/cpu_time.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../../linux-generic/arch/x86/odp/api/abi/cpu_time.h \ No newline at end of file
diff --git a/platform/linux-dpdk/arch/x86/odp/api/abi/time_cpu.h b/platform/linux-dpdk/arch/x86/odp/api/abi/time_cpu.h
new file mode 100644
index 000000000..cc313cff1
--- /dev/null
+++ b/platform/linux-dpdk/arch/x86/odp/api/abi/time_cpu.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 Nokia
+ */
+
+#ifndef ODP_ARCH_TIME_CPU_H_
+#define ODP_ARCH_TIME_CPU_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int _odp_time_cpu_global_freq_is_const(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/platform/linux-dpdk/arch/x86/odp_global_time.c b/platform/linux-dpdk/arch/x86/odp_global_time.c
deleted file mode 120000
index 33a50e23e..000000000
--- a/platform/linux-dpdk/arch/x86/odp_global_time.c
+++ /dev/null
@@ -1 +0,0 @@
-../../../linux-generic/arch/x86/odp_global_time.c \ No newline at end of file
diff --git a/platform/linux-dpdk/include/odp/api/plat/time_inlines.h b/platform/linux-dpdk/include/odp/api/plat/time_inlines.h
index 4b1320300..8e4eec59c 100644
--- a/platform/linux-dpdk/include/odp/api/plat/time_inlines.h
+++ b/platform/linux-dpdk/include/odp/api/plat/time_inlines.h
@@ -12,125 +12,116 @@
#include <odp/api/hints.h>
#include <odp/api/time_types.h>
-#include <odp/api/abi/cpu_time.h>
+#include <rte_config.h>
+#include <rte_atomic.h>
+#include <rte_cycles.h>
#include <stdint.h>
/** @cond _ODP_HIDE_FROM_DOXYGEN_ */
-#define _ODP_TIMESPEC_SIZE 16
-#define _ODP_TIME_GIGA_HZ 1000000000ULL
-
-typedef odp_time_t (*time_cur_fn)(void);
-typedef odp_time_t (*time_cur_strict_fn)(void);
-typedef uint64_t (*time_res_fn)(void);
-
-typedef struct time_handler_ {
- time_cur_fn time_cur;
- time_cur_strict_fn time_cur_strict;
- time_res_fn time_res;
-
-} time_handler_t;
-
typedef struct _odp_time_global_t {
- /* Storage space for struct timespec. Posix headers are not included
- * here to avoid application exposure. */
- uint8_t timespec[_ODP_TIMESPEC_SIZE] ODP_ALIGNED(_ODP_TIMESPEC_SIZE);
-
- int use_hw;
- uint64_t hw_start;
- uint64_t hw_freq_hz;
- /* DPDK specific */
- time_handler_t handler;
+ uint64_t start_cycles;
+ uint64_t freq_hz;
} _odp_time_global_t;
extern _odp_time_global_t _odp_time_glob;
-odp_time_t _odp_timespec_cur(void);
-
-static inline odp_time_t _odp_time_cur_gen(void)
+static inline odp_time_t _odp_time_cur(void)
{
- if (_odp_time_glob.use_hw) {
- odp_time_t time;
+ odp_time_t time;
- time.count = _odp_cpu_global_time() - _odp_time_glob.hw_start;
- return time;
- }
+ time.u64 = rte_get_timer_cycles() - _odp_time_glob.start_cycles;
- return _odp_timespec_cur();
+ return time;
}
-static inline odp_time_t _odp_time_cur_gen_strict(void)
+static inline odp_time_t _odp_time_cur_strict(void)
{
- if (_odp_time_glob.use_hw) {
- odp_time_t time;
-
- time.count = _odp_cpu_global_time_strict() - _odp_time_glob.hw_start;
- return time;
- }
+ odp_time_t time;
- return _odp_timespec_cur();
-}
+ rte_mb();
+ time.u64 = rte_get_timer_cycles() - _odp_time_glob.start_cycles;
-static inline odp_time_t _odp_time_cur(void)
-{
- return _odp_time_glob.handler.time_cur();
-}
-
-static inline odp_time_t _odp_time_cur_strict(void)
-{
- return _odp_time_glob.handler.time_cur_strict();
+ return time;
}
-static inline uint64_t _odp_time_hw_to_ns(odp_time_t time)
+static inline uint64_t _odp_time_to_ns(odp_time_t time)
{
uint64_t nsec;
- uint64_t freq_hz = _odp_time_glob.hw_freq_hz;
uint64_t count = time.count;
uint64_t sec = 0;
+ const uint64_t freq_hz = _odp_time_glob.freq_hz;
+ const uint64_t giga_hz = 1000000000;
if (count >= freq_hz) {
sec = count / freq_hz;
count = count - sec * freq_hz;
}
- nsec = (_ODP_TIME_GIGA_HZ * count) / freq_hz;
+ nsec = (giga_hz * count) / freq_hz;
- return (sec * _ODP_TIME_GIGA_HZ) + nsec;
+ return (sec * giga_hz) + nsec;
}
-static inline uint64_t _odp_time_convert_to_ns(odp_time_t time)
+static inline odp_time_t _odp_time_from_ns(uint64_t ns)
{
- if (_odp_time_glob.use_hw)
- return _odp_time_hw_to_ns(time);
+ odp_time_t time;
+ uint64_t count;
+ uint64_t sec = 0;
+ const uint64_t freq_hz = _odp_time_glob.freq_hz;
+
+ if (ns >= ODP_TIME_SEC_IN_NS) {
+ sec = ns / ODP_TIME_SEC_IN_NS;
+ ns = ns - sec * ODP_TIME_SEC_IN_NS;
+ }
- return time.nsec;
+ count = sec * freq_hz;
+ count += (ns * freq_hz) / ODP_TIME_SEC_IN_NS;
+
+ time.count = count;
+
+ return time;
}
#ifndef _ODP_NO_INLINE
/* Inline functions by default */
#define _ODP_INLINE static inline
- #define odp_time_local __odp_time_local
- #define odp_time_global __odp_time_global
- #define odp_time_to_ns __odp_time_to_ns
- #define odp_time_local_ns __odp_time_local_ns
- #define odp_time_global_ns __odp_time_global_ns
-
- #define odp_time_local_strict __odp_time_local_strict
- #define odp_time_global_strict __odp_time_global_strict
- #define odp_time_local_strict_ns __odp_time_local_strict_ns
- #define odp_time_global_strict_ns __odp_time_global_strict_ns
-
- #define odp_time_cmp __odp_time_cmp
- #define odp_time_diff __odp_time_diff
- #define odp_time_diff_ns __odp_time_diff_ns
- #define odp_time_sum __odp_time_sum
+ #define odp_time_local_res __odp_time_local_res
+ #define odp_time_global_res __odp_time_global_res
+ #define odp_time_local __odp_time_local
+ #define odp_time_global __odp_time_global
+ #define odp_time_local_strict __odp_time_local_strict
+ #define odp_time_global_strict __odp_time_global_strict
+ #define odp_time_local_ns __odp_time_local_ns
+ #define odp_time_global_ns __odp_time_global_ns
+ #define odp_time_local_from_ns __odp_time_local_from_ns
+ #define odp_time_global_from_ns __odp_time_global_from_ns
+ #define odp_time_local_strict_ns __odp_time_local_strict_ns
+ #define odp_time_global_strict_ns __odp_time_global_strict_ns
+ #define odp_time_to_ns __odp_time_to_ns
+ #define odp_time_cmp __odp_time_cmp
+ #define odp_time_diff __odp_time_diff
+ #define odp_time_diff_ns __odp_time_diff_ns
+ #define odp_time_sum __odp_time_sum
+ #define odp_time_wait_ns __odp_time_wait_ns
+ #define odp_time_wait_until __odp_time_wait_until
#else
#define _ODP_INLINE
#endif
+_ODP_INLINE uint64_t odp_time_local_res(void)
+{
+ return _odp_time_glob.freq_hz;
+}
+
+_ODP_INLINE uint64_t odp_time_global_res(void)
+{
+ return _odp_time_glob.freq_hz;
+}
+
_ODP_INLINE odp_time_t odp_time_local(void)
{
return _odp_time_cur();
@@ -153,27 +144,37 @@ _ODP_INLINE odp_time_t odp_time_global_strict(void)
_ODP_INLINE uint64_t odp_time_local_ns(void)
{
- return _odp_time_convert_to_ns(_odp_time_cur());
+ return _odp_time_to_ns(_odp_time_cur());
}
_ODP_INLINE uint64_t odp_time_global_ns(void)
{
- return _odp_time_convert_to_ns(_odp_time_cur());
+ return _odp_time_to_ns(_odp_time_cur());
+}
+
+_ODP_INLINE odp_time_t odp_time_local_from_ns(uint64_t ns)
+{
+ return _odp_time_from_ns(ns);
+}
+
+_ODP_INLINE odp_time_t odp_time_global_from_ns(uint64_t ns)
+{
+ return _odp_time_from_ns(ns);
}
_ODP_INLINE uint64_t odp_time_local_strict_ns(void)
{
- return _odp_time_convert_to_ns(_odp_time_cur_strict());
+ return _odp_time_to_ns(_odp_time_cur_strict());
}
_ODP_INLINE uint64_t odp_time_global_strict_ns(void)
{
- return _odp_time_convert_to_ns(_odp_time_cur_strict());
+ return _odp_time_to_ns(_odp_time_cur_strict());
}
_ODP_INLINE uint64_t odp_time_to_ns(odp_time_t time)
{
- return _odp_time_convert_to_ns(time);
+ return _odp_time_to_ns(time);
}
_ODP_INLINE int odp_time_cmp(odp_time_t t2, odp_time_t t1)
@@ -214,6 +215,29 @@ _ODP_INLINE odp_time_t odp_time_sum(odp_time_t t1, odp_time_t t2)
return time;
}
+static inline void _odp_time_wait_until(odp_time_t time)
+{
+ odp_time_t cur;
+
+ do {
+ cur = _odp_time_cur();
+ } while (odp_time_cmp(time, cur) > 0);
+}
+
+_ODP_INLINE void odp_time_wait_ns(uint64_t ns)
+{
+ const odp_time_t cur = _odp_time_cur();
+ const odp_time_t wait = _odp_time_from_ns(ns);
+ const odp_time_t end_time = odp_time_sum(cur, wait);
+
+ _odp_time_wait_until(end_time);
+}
+
+_ODP_INLINE void odp_time_wait_until(odp_time_t time)
+{
+ _odp_time_wait_until(time);
+}
+
/** @endcond */
#endif
diff --git a/platform/linux-dpdk/odp_time.c b/platform/linux-dpdk/odp_time.c
index fbbc9358d..2fc25eb96 100644
--- a/platform/linux-dpdk/odp_time.c
+++ b/platform/linux-dpdk/odp_time.c
@@ -1,302 +1,43 @@
/* Copyright (c) 2013-2018, Linaro Limited
- * Copyright (c) 2021-2022, Nokia
+ * Copyright (c) 2021-2023, Nokia
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
-#include <odp_posix_extensions.h>
-
-#include <time.h>
-#include <string.h>
-#include <inttypes.h>
+#include <odp/api/plat/time_inlines.h>
-#include <odp/api/time.h>
-#include <odp/api/hints.h>
#include <odp_debug_internal.h>
#include <odp_init_internal.h>
-#include <odp/api/plat/time_inlines.h>
#include <rte_config.h>
-#include <rte_atomic.h>
#include <rte_cycles.h>
-ODP_STATIC_ASSERT(_ODP_TIMESPEC_SIZE >= (sizeof(struct timespec)),
- "_ODP_TIMESPEC_SIZE too small");
+#include <string.h>
#include <odp/visibility_begin.h>
_odp_time_global_t _odp_time_glob;
-/*
- * Posix timespec based functions
- */
-
-static inline uint64_t time_spec_diff_nsec(struct timespec *t2,
- struct timespec *t1)
-{
- struct timespec diff;
- uint64_t nsec;
-
- diff.tv_sec = t2->tv_sec - t1->tv_sec;
- diff.tv_nsec = t2->tv_nsec - t1->tv_nsec;
-
- if (diff.tv_nsec < 0) {
- diff.tv_nsec += ODP_TIME_SEC_IN_NS;
- diff.tv_sec -= 1;
- }
-
- nsec = (diff.tv_sec * ODP_TIME_SEC_IN_NS) + diff.tv_nsec;
-
- return nsec;
-}
-
-odp_time_t _odp_timespec_cur(void)
-{
- int ret;
- odp_time_t time;
- struct timespec sys_time;
- struct timespec *start_time;
-
- start_time = (struct timespec *)(uintptr_t)&_odp_time_glob.timespec;
-
- ret = clock_gettime(CLOCK_MONOTONIC_RAW, &sys_time);
- if (odp_unlikely(ret != 0))
- _ODP_ABORT("clock_gettime failed\n");
-
- time.nsec = time_spec_diff_nsec(&sys_time, start_time);
-
- return time;
-}
-
#include <odp/visibility_end.h>
-static inline uint64_t time_spec_res(void)
-{
- int ret;
- struct timespec tres;
-
- ret = clock_getres(CLOCK_MONOTONIC_RAW, &tres);
- if (odp_unlikely(ret != 0))
- _ODP_ABORT("clock_getres failed\n");
-
- return ODP_TIME_SEC_IN_NS / (uint64_t)tres.tv_nsec;
-}
-
-static inline odp_time_t time_spec_from_ns(uint64_t ns)
-{
- odp_time_t time;
-
- time.nsec = ns;
-
- return time;
-}
-
-/*
- * HW time counter based functions
- */
-
-static inline uint64_t time_hw_res(void)
-{
- return _odp_time_glob.hw_freq_hz;
-}
-
-static inline odp_time_t time_hw_from_ns(uint64_t ns)
-{
- odp_time_t time;
- uint64_t count;
- uint64_t freq_hz = _odp_time_glob.hw_freq_hz;
- uint64_t sec = 0;
-
- if (ns >= ODP_TIME_SEC_IN_NS) {
- sec = ns / ODP_TIME_SEC_IN_NS;
- ns = ns - sec * ODP_TIME_SEC_IN_NS;
- }
-
- count = sec * freq_hz;
- count += (ns * freq_hz) / ODP_TIME_SEC_IN_NS;
-
- time.count = count;
-
- return time;
-}
-
-/*
- * Common functions
- */
-
-static inline uint64_t time_res(void)
-{
- if (_odp_time_glob.use_hw)
- return time_hw_res();
-
- return time_spec_res();
-}
-
-static inline odp_time_t time_from_ns(uint64_t ns)
-{
- if (_odp_time_glob.use_hw)
- return time_hw_from_ns(ns);
-
- return time_spec_from_ns(ns);
-}
-
-static inline odp_time_t time_cur_dpdk(void)
-{
- odp_time_t time;
-
- time.u64 = rte_get_timer_cycles() - _odp_time_glob.hw_start;
-
- return time;
-}
-
-static inline odp_time_t time_cur_dpdk_strict(void)
-{
- odp_time_t time;
-
- rte_mb();
- time.u64 = rte_get_timer_cycles() - _odp_time_glob.hw_start;
-
- return time;
-}
-
-static inline uint64_t time_res_dpdk(void)
-{
- return rte_get_timer_hz();
-}
-
-static inline void time_wait_until(odp_time_t time)
-{
- odp_time_t cur;
-
- do {
- cur = _odp_time_cur();
- } while (odp_time_cmp(time, cur) > 0);
-}
-
-odp_time_t odp_time_local_from_ns(uint64_t ns)
-{
- return time_from_ns(ns);
-}
-
-odp_time_t odp_time_global_from_ns(uint64_t ns)
-{
- return time_from_ns(ns);
-}
-
-uint64_t odp_time_local_res(void)
-{
- return _odp_time_glob.handler.time_res();
-}
-
-uint64_t odp_time_global_res(void)
-{
- return _odp_time_glob.handler.time_res();
-}
-
-void odp_time_wait_ns(uint64_t ns)
-{
- odp_time_t cur = _odp_time_cur();
- odp_time_t wait = time_from_ns(ns);
- odp_time_t end_time = odp_time_sum(cur, wait);
-
- time_wait_until(end_time);
-}
-
-void odp_time_wait_until(odp_time_t time)
-{
- time_wait_until(time);
-}
-
-static odp_bool_t is_invariant_tsc_supported(void)
-{
- FILE *file;
- char *line = NULL;
- size_t len = 0;
- odp_bool_t nonstop_tsc = false;
- odp_bool_t constant_tsc = false;
- odp_bool_t ret = false;
-
- file = fopen("/proc/cpuinfo", "rt");
- while (getline(&line, &len, file) != -1) {
- if (strstr(line, "flags") != NULL) {
- if (strstr(line, "constant_tsc") != NULL)
- constant_tsc = true;
- if (strstr(line, "nonstop_tsc") != NULL)
- nonstop_tsc = true;
-
- if (constant_tsc && nonstop_tsc)
- ret = true;
- else
- ret = false;
-
- free(line);
- fclose(file);
- return ret;
- }
- }
- free(line);
- fclose(file);
- return false;
-}
-
-static inline odp_bool_t is_dpdk_timer_cycles_support(void)
+int _odp_time_init_global(void)
{
- if (is_invariant_tsc_supported() == true)
- return true;
+ memset(&_odp_time_glob, 0, sizeof(_odp_time_global_t));
#ifdef RTE_LIBEAL_USE_HPET
- if (rte_eal_hpet_init(1) == 0)
- return true;
+ if (rte_eal_hpet_init(1) != 0)
+ _ODP_WARN("HPET init failed. Using TSC time.\n");
#endif
- return false;
-}
-
-int _odp_time_init_global(void)
-{
- struct timespec *timespec;
- int ret = 0;
- _odp_time_global_t *global = &_odp_time_glob;
-
- memset(global, 0, sizeof(_odp_time_global_t));
-
- if (is_dpdk_timer_cycles_support()) {
- _odp_time_glob.handler.time_cur = time_cur_dpdk;
- _odp_time_glob.handler.time_cur_strict = time_cur_dpdk_strict;
- _odp_time_glob.handler.time_res = time_res_dpdk;
- _odp_time_glob.hw_freq_hz = time_res_dpdk();
- _odp_time_glob.use_hw = 1;
- _odp_time_glob.hw_start = rte_get_timer_cycles();
- if (_odp_time_glob.hw_start == 0)
- return -1;
- else
- return 0;
- }
- _odp_time_glob.handler.time_cur = _odp_time_cur_gen;
- _odp_time_glob.handler.time_cur_strict = _odp_time_cur_gen_strict;
- _odp_time_glob.handler.time_res = time_res;
-
- if (_odp_cpu_has_global_time()) {
- global->use_hw = 1;
- global->hw_freq_hz = _odp_cpu_global_time_freq();
-
- if (global->hw_freq_hz == 0)
- return -1;
-
- _ODP_PRINT("HW time counter freq: %" PRIu64 " hz\n\n", global->hw_freq_hz);
-
- global->hw_start = _odp_cpu_global_time();
- return 0;
+ _odp_time_glob.freq_hz = rte_get_timer_hz();
+ _odp_time_glob.start_cycles = rte_get_timer_cycles();
+ if (_odp_time_glob.start_cycles == 0) {
+ _ODP_ERR("Initializing start cycles failed.\n");
+ return -1;
}
- timespec = (struct timespec *)(uintptr_t)global->timespec;
- timespec->tv_sec = 0;
- timespec->tv_nsec = 0;
-
- ret = clock_gettime(CLOCK_MONOTONIC_RAW, timespec);
-
- return ret;
+ return 0;
}
int _odp_time_term_global(void)