This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "".
The branch, master has been updated via 06b3650b581bf05ea2f015a02635382fb7c38fda (commit) via 678c2a149a3e7d48c4462fb2e6cc531a3cfed780 (commit) via c6cc6d3a79976bfe96cbb9ff192cf22daffc18c4 (commit) from 2a9d3323537d030c1b3385ed14b496bf9e2b20b3 (commit)
Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below.
- Log ----------------------------------------------------------------- commit 06b3650b581bf05ea2f015a02635382fb7c38fda Author: Petri Savolainen petri.savolainen@linaro.org Date: Wed May 30 12:34:12 2018 +0300
linux-gen: time: use inlined functions internally
Always use inlined time functions internally.
Signed-off-by: Petri Savolainen petri.savolainen@linaro.org Reviewed-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index 5113eba2..4a91c08a 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -27,6 +27,7 @@ #include <odp_debug_internal.h> #include <odp_packet_io_ipc_internal.h> #include <odp/api/time.h> +#include <odp/api/plat/time_inlines.h> #include <odp_pcapng.h>
#include <string.h> diff --git a/platform/linux-generic/odp_schedule_basic.c b/platform/linux-generic/odp_schedule_basic.c index 7311d13a..c81e417c 100644 --- a/platform/linux-generic/odp_schedule_basic.c +++ b/platform/linux-generic/odp_schedule_basic.c @@ -15,6 +15,7 @@ #include <odp/api/thread.h> #include <odp/api/plat/thread_inlines.h> #include <odp/api/time.h> +#include <odp/api/plat/time_inlines.h> #include <odp/api/spinlock.h> #include <odp/api/hints.h> #include <odp/api/cpu.h> diff --git a/platform/linux-generic/odp_schedule_scalable.c b/platform/linux-generic/odp_schedule_scalable.c index 155be5a2..826747ee 100644 --- a/platform/linux-generic/odp_schedule_scalable.c +++ b/platform/linux-generic/odp_schedule_scalable.c @@ -18,6 +18,7 @@ #include <odp/api/plat/thread_inlines.h> #include <odp/api/thrmask.h> #include <odp/api/time.h> +#include <odp/api/plat/time_inlines.h>
#include <odp_config_internal.h> #include <odp_debug_internal.h> diff --git a/platform/linux-generic/odp_schedule_sp.c b/platform/linux-generic/odp_schedule_sp.c index 0f80452d..ac0b35fd 100644 --- a/platform/linux-generic/odp_schedule_sp.c +++ b/platform/linux-generic/odp_schedule_sp.c @@ -11,6 +11,7 @@ #include <odp/api/thread.h> #include <odp/api/plat/thread_inlines.h> #include <odp/api/time.h> +#include <odp/api/plat/time_inlines.h> #include <odp/api/schedule.h> #include <odp/api/shared_memory.h> #include <odp_schedule_if.h> diff --git a/platform/linux-generic/odp_traffic_mngr.c b/platform/linux-generic/odp_traffic_mngr.c index 79ba35b7..bf12a836 100644 --- a/platform/linux-generic/odp_traffic_mngr.c +++ b/platform/linux-generic/odp_traffic_mngr.c @@ -28,6 +28,8 @@ #include <odp_traffic_mngr_internal.h> #include <odp/api/plat/packet_inlines.h> #include <odp/api/plat/byteorder_inlines.h> +#include <odp/api/time.h> +#include <odp/api/plat/time_inlines.h> #include <odp_macros_internal.h> #include <odp_init_internal.h> #include <odp_errno_define.h> diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index 803c514f..8d93b873 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -19,6 +19,8 @@
#include <odp/api/packet.h> #include <odp/api/plat/packet_inlines.h> +#include <odp/api/time.h> +#include <odp/api/plat/time_inlines.h>
#include <odp_packet_io_internal.h> #include <odp_classification_internal.h> diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index 6cabf0ea..86a40229 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -12,6 +12,8 @@
#include <odp/api/packet.h> #include <odp/api/plat/packet_inlines.h> +#include <odp/api/time.h> +#include <odp/api/plat/time_inlines.h>
#include <odp_packet_io_internal.h> #include <odp_packet_netmap.h>
commit 678c2a149a3e7d48c4462fb2e6cc531a3cfed780 Author: Petri Savolainen petri.savolainen@linaro.org Date: Tue May 29 17:16:40 2018 +0300
linux-gen: time: inline diff, sum and cmp
Inline small functions commonly used in time calculations.
Signed-off-by: Petri Savolainen petri.savolainen@linaro.org Reviewed-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/include/odp/api/plat/time_inlines.h b/platform/linux-generic/include/odp/api/plat/time_inlines.h index 1075a395..527490e3 100644 --- a/platform/linux-generic/include/odp/api/plat/time_inlines.h +++ b/platform/linux-generic/include/odp/api/plat/time_inlines.h @@ -9,6 +9,7 @@
#include <stdint.h> #include <odp/api/align.h> +#include <odp/api/hints.h>
#include <odp/api/abi/cpu_time.h>
@@ -48,6 +49,10 @@ static inline odp_time_t _odp_time_cur(void) #define _ODP_INLINE static inline #define odp_time_local __odp_time_local #define odp_time_global __odp_time_global + #define odp_time_cmp __odp_time_cmp + #define odp_time_diff __odp_time_diff + #define odp_time_sum __odp_time_sum + #else #define _ODP_INLINE #endif @@ -62,6 +67,35 @@ _ODP_INLINE odp_time_t odp_time_global(void) return _odp_time_cur(); }
+_ODP_INLINE int odp_time_cmp(odp_time_t t2, odp_time_t t1) +{ + if (odp_likely(t2.u64 > t1.u64)) + return 1; + + if (t2.u64 < t1.u64) + return -1; + + return 0; +} + +_ODP_INLINE odp_time_t odp_time_diff(odp_time_t t2, odp_time_t t1) +{ + odp_time_t time; + + time.u64 = t2.u64 - t1.u64; + + return time; +} + +_ODP_INLINE odp_time_t odp_time_sum(odp_time_t t1, odp_time_t t2) +{ + odp_time_t time; + + time.u64 = t1.u64 + t2.u64; + + return time; +} + /** @endcond */
#endif diff --git a/platform/linux-generic/odp_time.c b/platform/linux-generic/odp_time.c index 065ad956..97886d6a 100644 --- a/platform/linux-generic/odp_time.c +++ b/platform/linux-generic/odp_time.c @@ -152,26 +152,6 @@ static inline uint64_t time_res(void) return time_spec_res(); }
-static inline int time_cmp(odp_time_t t2, odp_time_t t1) -{ - if (odp_likely(t2.u64 > t1.u64)) - return 1; - - if (t2.u64 < t1.u64) - return -1; - - return 0; -} - -static inline odp_time_t time_sum(odp_time_t t1, odp_time_t t2) -{ - odp_time_t time; - - time.u64 = t1.u64 + t2.u64; - - return time; -} - static inline uint64_t time_to_ns(odp_time_t time) { if (_odp_time_glob.use_hw) @@ -194,16 +174,7 @@ static inline void time_wait_until(odp_time_t time)
do { cur = _odp_time_cur(); - } while (time_cmp(time, cur) > 0); -} - -odp_time_t odp_time_diff(odp_time_t t2, odp_time_t t1) -{ - odp_time_t time; - - time.u64 = t2.u64 - t1.u64; - - return time; + } while (odp_time_cmp(time, cur) > 0); }
uint64_t odp_time_diff_ns(odp_time_t t2, odp_time_t t1) @@ -230,16 +201,6 @@ odp_time_t odp_time_global_from_ns(uint64_t ns) return time_from_ns(ns); }
-int odp_time_cmp(odp_time_t t2, odp_time_t t1) -{ - return time_cmp(t2, t1); -} - -odp_time_t odp_time_sum(odp_time_t t1, odp_time_t t2) -{ - return time_sum(t1, t2); -} - uint64_t odp_time_local_res(void) { return time_res(); @@ -254,7 +215,7 @@ 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 = time_sum(cur, wait); + odp_time_t end_time = odp_time_sum(cur, wait);
time_wait_until(end_time); }
commit c6cc6d3a79976bfe96cbb9ff192cf22daffc18c4 Author: Petri Savolainen petri.savolainen@linaro.org Date: Tue May 29 13:52:27 2018 +0300
linux-gen: time: inline arch cpu time on x86
Inline cpu HW time counter read function on x86. Time global data structure is visible to applications, but Posix types (timespec) or header files are not.
Signed-off-by: Petri Savolainen petri.savolainen@linaro.org Reviewed-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am index 30ba0476..8709e713 100644 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@ -42,7 +42,8 @@ odpapiplatinclude_HEADERS = \ include/odp/api/plat/strong_types.h \ include/odp/api/plat/sync_inlines.h \ include/odp/api/plat/thread_inlines.h \ - include/odp/api/plat/ticketlock_inlines.h + include/odp/api/plat/ticketlock_inlines.h \ + include/odp/api/plat/time_inlines.h
odpapiabiarchinclude_HEADERS += \ include-abi/odp/api/abi/align.h \ @@ -82,7 +83,6 @@ odpapiabiarchinclude_HEADERS += \ endif
noinst_HEADERS = \ - arch/odp_arch_time_internal.h \ include/odp_align_internal.h \ include/odp_atomic_internal.h \ include/odp_bitmap_internal.h \ @@ -227,14 +227,16 @@ __LIB__libodp_linux_la_SOURCES += \ odp_std_clib_api.c \ odp_sync_api.c \ odp_thread_api.c \ - odp_ticketlock_api.c + odp_ticketlock_api.c \ + odp_time_api.c endif
if ARCH_IS_ARM __LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_cycles.c \ arch/default/odp_global_time.c \ arch/default/odp_sysinfo_parse.c -odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_inlines.h +odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_inlines.h \ + arch/default/odp/api/abi/cpu_time.h if !ODP_ABI_COMPAT odpapiabiarchinclude_HEADERS += arch/arm/odp/api/abi/cpu.h endif @@ -247,7 +249,8 @@ if ARCH_IS_AARCH64 __LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_cycles.c \ arch/aarch64/odp_global_time.c \ arch/default/odp_sysinfo_parse.c -odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_inlines.h +odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_inlines.h \ + arch/default/odp/api/abi/cpu_time.h if !ODP_ABI_COMPAT odpapiabiarchinclude_HEADERS += arch/aarch64/odp/api/abi/cpu.h endif @@ -260,7 +263,8 @@ if ARCH_IS_DEFAULT __LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_cycles.c \ arch/default/odp_global_time.c \ arch/default/odp_sysinfo_parse.c -odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_inlines.h +odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_inlines.h \ + arch/default/odp/api/abi/cpu_time.h if !ODP_ABI_COMPAT odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu.h endif @@ -271,7 +275,8 @@ if ARCH_IS_MIPS64 __LIB__libodp_linux_la_SOURCES += arch/mips64/odp_cpu_cycles.c \ arch/default/odp_global_time.c \ arch/mips64/odp_sysinfo_parse.c -odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_inlines.h +odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_inlines.h \ + arch/default/odp/api/abi/cpu_time.h if !ODP_ABI_COMPAT odpapiabiarchinclude_HEADERS += arch/mips64/odp/api/abi/cpu.h endif @@ -282,7 +287,8 @@ if ARCH_IS_POWERPC __LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_cycles.c \ arch/default/odp_global_time.c \ arch/powerpc/odp_sysinfo_parse.c -odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_inlines.h +odpapiabiarchinclude_HEADERS += arch/default/odp/api/abi/cpu_inlines.h \ + arch/default/odp/api/abi/cpu_time.h if !ODP_ABI_COMPAT odpapiabiarchinclude_HEADERS += arch/powerpc/odp/api/abi/cpu.h endif @@ -294,7 +300,9 @@ __LIB__libodp_linux_la_SOURCES += arch/x86/cpu_flags.c \ arch/x86/odp_cpu_cycles.c \ arch/x86/odp_global_time.c \ arch/x86/odp_sysinfo_parse.c -odpapiabiarchinclude_HEADERS += arch/x86/odp/api/abi/cpu_inlines.h +odpapiabiarchinclude_HEADERS += arch/x86/odp/api/abi/cpu_inlines.h \ + arch/x86/odp/api/abi/cpu_rdtsc.h \ + arch/x86/odp/api/abi/cpu_time.h if !ODP_ABI_COMPAT odpapiabiarchinclude_HEADERS += arch/x86/odp/api/abi/cpu.h endif diff --git a/platform/linux-generic/arch/aarch64/odp_global_time.c b/platform/linux-generic/arch/aarch64/odp_global_time.c index fac2088c..91e5c7a6 100644 --- a/platform/linux-generic/arch/aarch64/odp_global_time.c +++ b/platform/linux-generic/arch/aarch64/odp_global_time.c @@ -11,27 +11,11 @@ #include <time.h>
#include <odp_debug_internal.h> -#include <odp_arch_time_internal.h> +#include <odp/api/abi/cpu_time.h>
-int cpu_has_global_time(void) -{ - uint64_t hz = cpu_global_time_freq(); - - /* - * The system counter portion of the architected timer must - * provide a uniform view of system time to all processing - * elements in the system. This should hold true even for - * heterogeneous SoCs. - * - * Determine whether the system has 'global time' by checking - * whether a read of the architected timer frequency sys reg - * returns a sane value. Sane is considered to be within - * 1MHz and 6GHz (1us and .1667ns period). - */ - return hz >= 1000000 && hz <= 6000000000; -} +#include <odp/visibility_begin.h>
-uint64_t cpu_global_time(void) +uint64_t _odp_cpu_global_time(void) { uint64_t cntvct;
@@ -47,7 +31,27 @@ uint64_t cpu_global_time(void) return cntvct; }
-uint64_t cpu_global_time_freq(void) +#include <odp/visibility_end.h> + +int _odp_cpu_has_global_time(void) +{ + uint64_t hz = _odp_cpu_global_time_freq(); + + /* + * The system counter portion of the architected timer must + * provide a uniform view of system time to all processing + * elements in the system. This should hold true even for + * heterogeneous SoCs. + * + * Determine whether the system has 'global time' by checking + * whether a read of the architected timer frequency sys reg + * returns a sane value. Sane is considered to be within + * 1MHz and 6GHz (1us and .1667ns period). + */ + return hz >= 1000000 && hz <= 6000000000; +} + +uint64_t _odp_cpu_global_time_freq(void) { uint64_t cntfrq;
diff --git a/platform/linux-generic/arch/default/odp/api/abi/cpu_time.h b/platform/linux-generic/arch/default/odp/api/abi/cpu_time.h new file mode 100644 index 00000000..09138e70 --- /dev/null +++ b/platform/linux-generic/arch/default/odp/api/abi/cpu_time.h @@ -0,0 +1,24 @@ +/* Copyright (c) 2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_ARCH_CPU_TIME_H_ +#define ODP_ARCH_CPU_TIME_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> + +int _odp_cpu_has_global_time(void); +uint64_t _odp_cpu_global_time(void); +uint64_t _odp_cpu_global_time_freq(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/platform/linux-generic/arch/default/odp_global_time.c b/platform/linux-generic/arch/default/odp_global_time.c index faa0ec3f..facffea7 100644 --- a/platform/linux-generic/arch/default/odp_global_time.c +++ b/platform/linux-generic/arch/default/odp_global_time.c @@ -4,19 +4,23 @@ * SPDX-License-Identifier: BSD-3-Clause */
-#include <odp_arch_time_internal.h> +#include <odp/api/abi/cpu_time.h>
-int cpu_has_global_time(void) +#include <odp/visibility_begin.h> + +uint64_t _odp_cpu_global_time(void) { return 0; }
-uint64_t cpu_global_time(void) +#include <odp/visibility_end.h> + +int _odp_cpu_has_global_time(void) { return 0; }
-uint64_t cpu_global_time_freq(void) +uint64_t _odp_cpu_global_time_freq(void) { return 0; } diff --git a/platform/linux-generic/arch/odp_arch_time_internal.h b/platform/linux-generic/arch/odp_arch_time_internal.h deleted file mode 100644 index c3b90ac5..00000000 --- a/platform/linux-generic/arch/odp_arch_time_internal.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (c) 2017-2018, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef ODP_ARCH_TIME_INTERNAL_H_ -#define ODP_ARCH_TIME_INTERNAL_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include <stdint.h> - -int cpu_has_global_time(void); -uint64_t cpu_global_time(void); -uint64_t cpu_global_time_freq(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/platform/linux-generic/arch/x86/cpu_flags.c b/platform/linux-generic/arch/x86/cpu_flags.c index f5a744fd..935af2cb 100644 --- a/platform/linux-generic/arch/x86/cpu_flags.c +++ b/platform/linux-generic/arch/x86/cpu_flags.c @@ -41,7 +41,7 @@
#include "cpu_flags.h" #include <odp_debug_internal.h> -#include <odp_arch_time_internal.h> +#include <odp/api/abi/cpu_time.h> #include <stdio.h> #include <stdint.h>
@@ -361,7 +361,7 @@ void cpu_flags_print_all(void) ODP_PRINT("%s", str); }
-int cpu_has_global_time(void) +int _odp_cpu_has_global_time(void) { if (cpu_get_flag_enabled(RTE_CPUFLAG_INVTSC) > 0) return 1; diff --git a/platform/linux-generic/arch/x86/odp/api/abi/cpu_inlines.h b/platform/linux-generic/arch/x86/odp/api/abi/cpu_inlines.h index 63be3da6..1eb8a956 100644 --- a/platform/linux-generic/arch/x86/odp/api/abi/cpu_inlines.h +++ b/platform/linux-generic/arch/x86/odp/api/abi/cpu_inlines.h @@ -8,6 +8,7 @@ #define ODP_ARCH_CPU_INLINES_H_
#include <stdint.h> +#include <odp/api/abi/cpu_rdtsc.h>
_ODP_INLINE void odp_cpu_pause(void) { @@ -20,19 +21,7 @@ _ODP_INLINE void odp_cpu_pause(void)
_ODP_INLINE uint64_t odp_cpu_cycles(void) { - union { - uint64_t tsc_64; - struct { - uint32_t lo_32; - uint32_t hi_32; - }; - } tsc; - - __asm__ __volatile__ ("rdtsc" : - "=a" (tsc.lo_32), - "=d" (tsc.hi_32) : : "memory"); - - return tsc.tsc_64; + return _odp_cpu_rdtsc(); }
_ODP_INLINE uint64_t odp_cpu_cycles_max(void) diff --git a/platform/linux-generic/arch/x86/odp/api/abi/cpu_rdtsc.h b/platform/linux-generic/arch/x86/odp/api/abi/cpu_rdtsc.h new file mode 100644 index 00000000..ccc5f0f3 --- /dev/null +++ b/platform/linux-generic/arch/x86/odp/api/abi/cpu_rdtsc.h @@ -0,0 +1,29 @@ +/* Copyright (c) 2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_ARCH_CPU_RDTSC_H_ +#define ODP_ARCH_CPU_RDTSC_H_ + +#include <stdint.h> + +static inline uint64_t _odp_cpu_rdtsc(void) +{ + union { + uint64_t tsc_64; + struct { + uint32_t lo_32; + uint32_t hi_32; + }; + } tsc; + + __asm__ __volatile__ ("rdtsc" : + "=a" (tsc.lo_32), + "=d" (tsc.hi_32) : : "memory"); + + return tsc.tsc_64; +} + +#endif diff --git a/platform/linux-generic/arch/x86/odp/api/abi/cpu_time.h b/platform/linux-generic/arch/x86/odp/api/abi/cpu_time.h new file mode 100644 index 00000000..05ff0db9 --- /dev/null +++ b/platform/linux-generic/arch/x86/odp/api/abi/cpu_time.h @@ -0,0 +1,29 @@ +/* Copyright (c) 2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_ARCH_CPU_TIME_H_ +#define ODP_ARCH_CPU_TIME_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> +#include <odp/api/abi/cpu_rdtsc.h> + +static inline uint64_t _odp_cpu_global_time(void) +{ + return _odp_cpu_rdtsc(); +} + +int _odp_cpu_has_global_time(void); +uint64_t _odp_cpu_global_time_freq(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/platform/linux-generic/arch/x86/odp_global_time.c b/platform/linux-generic/arch/x86/odp_global_time.c index da22d45a..e46a7586 100644 --- a/platform/linux-generic/arch/x86/odp_global_time.c +++ b/platform/linux-generic/arch/x86/odp_global_time.c @@ -10,24 +10,15 @@
#include <time.h>
-#include <odp/api/cpu.h> #include <odp/api/hints.h> #include <odp_debug_internal.h> -#include <odp_arch_time_internal.h> - -/* Inlined API functions */ -#include <odp/api/plat/cpu_inlines.h> - -uint64_t cpu_global_time(void) -{ - return odp_cpu_cycles(); -} +#include <odp/api/abi/cpu_time.h>
#define SEC_IN_NS 1000000000ULL
/* Measure TSC frequency. Frequency information registers are defined for x86, * but those are often not enumerated. */ -uint64_t cpu_global_time_freq(void) +uint64_t _odp_cpu_global_time_freq(void) { struct timespec sleep, ts1, ts2; uint64_t t1, t2, ts_nsec, cycles, hz; @@ -49,7 +40,7 @@ uint64_t cpu_global_time_freq(void) return 0; }
- t1 = cpu_global_time(); + t1 = _odp_cpu_global_time();
if (nanosleep(&sleep, NULL) < 0) { ODP_DBG("nanosleep failed\n"); @@ -61,7 +52,7 @@ uint64_t cpu_global_time_freq(void) return 0; }
- t2 = cpu_global_time(); + t2 = _odp_cpu_global_time();
ts_nsec = (ts2.tv_sec - ts1.tv_sec) * SEC_IN_NS; ts_nsec += ts2.tv_nsec - ts1.tv_nsec; diff --git a/platform/linux-generic/include-abi/odp/api/abi/time.h b/platform/linux-generic/include-abi/odp/api/abi/time.h index a86a526d..e80e57b1 100644 --- a/platform/linux-generic/include-abi/odp/api/abi/time.h +++ b/platform/linux-generic/include-abi/odp/api/abi/time.h @@ -5,3 +5,6 @@ */
#include <odp/api/abi-default/time.h> + +/* Inlined functions for non-ABI compat mode */ +#include <odp/api/plat/time_inlines.h> diff --git a/platform/linux-generic/include/odp/api/plat/time_inlines.h b/platform/linux-generic/include/odp/api/plat/time_inlines.h new file mode 100644 index 00000000..1075a395 --- /dev/null +++ b/platform/linux-generic/include/odp/api/plat/time_inlines.h @@ -0,0 +1,67 @@ +/* Copyright (c) 2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_PLAT_TIME_INLINES_H_ +#define ODP_PLAT_TIME_INLINES_H_ + +#include <stdint.h> +#include <odp/api/align.h> + +#include <odp/api/abi/cpu_time.h> + +/** @cond _ODP_HIDE_FROM_DOXYGEN_ */ + +#define _ODP_TIMESPEC_SIZE 16 + +typedef struct _odp_time_global_t { + /* Storage space for struct timespec. Posix headers are not included + * here to avoid application exposure. */ + uint8_t ODP_ALIGNED(_ODP_TIMESPEC_SIZE) timespec[_ODP_TIMESPEC_SIZE]; + + int use_hw; + uint64_t hw_start; + uint64_t hw_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(void) +{ + if (_odp_time_glob.use_hw) { + odp_time_t time; + + time.count = _odp_cpu_global_time() - _odp_time_glob.hw_start; + return time; + } + + return _odp_timespec_cur(); +} + +#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 +#else + #define _ODP_INLINE +#endif + +_ODP_INLINE odp_time_t odp_time_local(void) +{ + return _odp_time_cur(); +} + +_ODP_INLINE odp_time_t odp_time_global(void) +{ + return _odp_time_cur(); +} + +/** @endcond */ + +#endif diff --git a/platform/linux-generic/odp_time.c b/platform/linux-generic/odp_time.c index 96308edc..065ad956 100644 --- a/platform/linux-generic/odp_time.c +++ b/platform/linux-generic/odp_time.c @@ -9,22 +9,21 @@ #include <odp_posix_extensions.h>
#include <time.h> +#include <string.h> +#include <inttypes.h> + #include <odp/api/time.h> #include <odp/api/hints.h> #include <odp_debug_internal.h> #include <odp_init_internal.h> -#include <odp_arch_time_internal.h> -#include <string.h> -#include <inttypes.h> +#include <odp/api/plat/time_inlines.h> + +ODP_STATIC_ASSERT(_ODP_TIMESPEC_SIZE >= (sizeof(struct timespec)), + "_ODP_TIMESPEC_SIZE too small");
-typedef struct time_global_t { - struct timespec spec_start; - int use_hw; - uint64_t hw_start; - uint64_t hw_freq_hz; -} time_global_t; +#include <odp/visibility_begin.h>
-static time_global_t global; +_odp_time_global_t _odp_time_glob;
/* * Posix timespec based functions @@ -49,21 +48,26 @@ static inline uint64_t time_spec_diff_nsec(struct timespec *t2, return nsec; }
-static inline odp_time_t time_spec_cur(void) +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, &global.spec_start); + 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; @@ -94,24 +98,15 @@ static inline odp_time_t time_spec_from_ns(uint64_t ns) * HW time counter based functions */
-static inline odp_time_t time_hw_cur(void) -{ - odp_time_t time; - - time.count = cpu_global_time() - global.hw_start; - - return time; -} - static inline uint64_t time_hw_res(void) { - return global.hw_freq_hz; + return _odp_time_glob.hw_freq_hz; }
static inline uint64_t time_hw_to_ns(odp_time_t time) { uint64_t nsec; - uint64_t freq_hz = global.hw_freq_hz; + uint64_t freq_hz = _odp_time_glob.hw_freq_hz; uint64_t count = time.count; uint64_t sec = 0;
@@ -129,7 +124,7 @@ static inline odp_time_t time_hw_from_ns(uint64_t ns) { odp_time_t time; uint64_t count; - uint64_t freq_hz = global.hw_freq_hz; + uint64_t freq_hz = _odp_time_glob.hw_freq_hz; uint64_t sec = 0;
if (ns >= ODP_TIME_SEC_IN_NS) { @@ -149,17 +144,9 @@ static inline odp_time_t time_hw_from_ns(uint64_t ns) * Common functions */
-static inline odp_time_t time_cur(void) -{ - if (global.use_hw) - return time_hw_cur(); - - return time_spec_cur(); -} - static inline uint64_t time_res(void) { - if (global.use_hw) + if (_odp_time_glob.use_hw) return time_hw_res();
return time_spec_res(); @@ -187,7 +174,7 @@ static inline odp_time_t time_sum(odp_time_t t1, odp_time_t t2)
static inline uint64_t time_to_ns(odp_time_t time) { - if (global.use_hw) + if (_odp_time_glob.use_hw) return time_hw_to_ns(time);
return time_spec_to_ns(time); @@ -195,7 +182,7 @@ static inline uint64_t time_to_ns(odp_time_t time)
static inline odp_time_t time_from_ns(uint64_t ns) { - if (global.use_hw) + if (_odp_time_glob.use_hw) return time_hw_from_ns(ns);
return time_spec_from_ns(ns); @@ -206,20 +193,10 @@ static inline void time_wait_until(odp_time_t time) odp_time_t cur;
do { - cur = time_cur(); + cur = _odp_time_cur(); } while (time_cmp(time, cur) > 0); }
-odp_time_t odp_time_local(void) -{ - return time_cur(); -} - -odp_time_t odp_time_global(void) -{ - return time_cur(); -} - odp_time_t odp_time_diff(odp_time_t t2, odp_time_t t1) { odp_time_t time; @@ -275,7 +252,7 @@ uint64_t odp_time_global_res(void)
void odp_time_wait_ns(uint64_t ns) { - odp_time_t cur = time_cur(); + odp_time_t cur = _odp_time_cur(); odp_time_t wait = time_from_ns(ns); odp_time_t end_time = time_sum(cur, wait);
@@ -289,28 +266,31 @@ void odp_time_wait_until(odp_time_t time)
int odp_time_init_global(void) { + struct timespec *timespec; int ret = 0; + _odp_time_global_t *global = &_odp_time_glob;
- memset(&global, 0, sizeof(time_global_t)); + memset(global, 0, sizeof(_odp_time_global_t));
- if (cpu_has_global_time()) { - global.use_hw = 1; - global.hw_freq_hz = cpu_global_time_freq(); + 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) + if (global->hw_freq_hz == 0) return -1;
printf("HW time counter freq: %" PRIu64 " hz\n\n", - global.hw_freq_hz); + global->hw_freq_hz);
- global.hw_start = cpu_global_time(); + global->hw_start = _odp_cpu_global_time(); return 0; }
- global.spec_start.tv_sec = 0; - global.spec_start.tv_nsec = 0; + timespec = (struct timespec *)(uintptr_t)global->timespec; + timespec->tv_sec = 0; + timespec->tv_nsec = 0;
- ret = clock_gettime(CLOCK_MONOTONIC_RAW, &global.spec_start); + ret = clock_gettime(CLOCK_MONOTONIC_RAW, timespec);
return ret; } diff --git a/platform/linux-generic/odp_time_api.c b/platform/linux-generic/odp_time_api.c new file mode 100644 index 00000000..cd547b23 --- /dev/null +++ b/platform/linux-generic/odp_time_api.c @@ -0,0 +1,13 @@ +/* Copyright (c) 2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config.h" + +#include <odp/api/time.h> + +/* Non-inlined functions for ABI compat mode */ +#define _ODP_NO_INLINE +#include <odp/api/plat/time_inlines.h> diff --git a/platform/linux-generic/odp_timer.c b/platform/linux-generic/odp_timer.c index f46aa6e8..5fef5af2 100644 --- a/platform/linux-generic/odp_timer.c +++ b/platform/linux-generic/odp_timer.c @@ -53,8 +53,8 @@ #include <odp/api/std_types.h> #include <odp/api/sync.h> #include <odp/api/time.h> +#include <odp/api/plat/time_inlines.h> #include <odp/api/timer.h> -#include <odp_arch_time_internal.h> #include <odp_timer_internal.h>
/* Inlined API functions */
-----------------------------------------------------------------------
Summary of changes: platform/linux-generic/Makefile.am | 26 ++-- .../linux-generic/arch/aarch64/odp_global_time.c | 44 ++++--- .../arch/default/odp/api/abi/cpu_time.h | 24 ++++ .../linux-generic/arch/default/odp_global_time.c | 12 +- .../linux-generic/arch/odp_arch_time_internal.h | 24 ---- platform/linux-generic/arch/x86/cpu_flags.c | 4 +- .../arch/x86/odp/api/abi/cpu_inlines.h | 15 +-- .../linux-generic/arch/x86/odp/api/abi/cpu_rdtsc.h | 29 +++++ .../linux-generic/arch/x86/odp/api/abi/cpu_time.h | 29 +++++ platform/linux-generic/arch/x86/odp_global_time.c | 17 +-- .../linux-generic/include-abi/odp/api/abi/time.h | 3 + .../include/odp/api/plat/time_inlines.h | 101 +++++++++++++++ platform/linux-generic/odp_packet_io.c | 1 + platform/linux-generic/odp_schedule_basic.c | 1 + platform/linux-generic/odp_schedule_scalable.c | 1 + platform/linux-generic/odp_schedule_sp.c | 1 + platform/linux-generic/odp_time.c | 137 ++++++--------------- .../{odp_cpu_api.c => odp_time_api.c} | 4 +- platform/linux-generic/odp_timer.c | 2 +- platform/linux-generic/odp_traffic_mngr.c | 2 + platform/linux-generic/pktio/dpdk.c | 2 + platform/linux-generic/pktio/netmap.c | 2 + 22 files changed, 295 insertions(+), 186 deletions(-) create mode 100644 platform/linux-generic/arch/default/odp/api/abi/cpu_time.h delete mode 100644 platform/linux-generic/arch/odp_arch_time_internal.h create mode 100644 platform/linux-generic/arch/x86/odp/api/abi/cpu_rdtsc.h create mode 100644 platform/linux-generic/arch/x86/odp/api/abi/cpu_time.h create mode 100644 platform/linux-generic/include/odp/api/plat/time_inlines.h copy platform/linux-generic/{odp_cpu_api.c => odp_time_api.c} (76%)
hooks/post-receive