From 052d2687930e5a99568e9349ca9704ae507e8dc5 Mon Sep 17 00:00:00 2001 From: Dmitry Eremin-Solenikov Date: Tue, 5 Sep 2017 21:11:06 +0300 Subject: linux-gen: deduplicate arch-specific files Rewrite ARCH-specific files so that there is no significant code duplication between different arch files and default files set. Signed-off-by: Dmitry Eremin-Solenikov Reviewed-by: Bill Fischofer Signed-off-by: Maxim Uvarov --- platform/Makefile.inc | 22 ----- platform/linux-generic/Makefile.am | 46 ++++++----- platform/linux-generic/arch/aarch64/odp_cpu_arch.c | 94 ---------------------- .../linux-generic/arch/aarch64/odp_global_time.c | 57 +++++++++++++ .../linux-generic/arch/aarch64/odp_sysinfo_parse.c | 28 ------- platform/linux-generic/arch/arm/odp_cpu_arch.c | 79 ------------------ .../linux-generic/arch/arm/odp_sysinfo_parse.c | 28 ------- platform/linux-generic/arch/default/odp_cpu_arch.c | 28 ------- .../linux-generic/arch/default/odp_cpu_cycles.c | 19 +++++ .../linux-generic/arch/default/odp_global_time.c | 33 ++++++++ platform/linux-generic/arch/mips64/odp_cpu_arch.c | 25 ------ platform/linux-generic/arch/powerpc/odp_cpu_arch.c | 25 ------ .../linux-generic/arch/powerpc/odp_global_time.c | 15 ++++ platform/linux-generic/arch/x86/odp_cpu_arch.c | 72 ----------------- platform/linux-generic/arch/x86/odp_global_time.c | 77 ++++++++++++++++++ 15 files changed, 226 insertions(+), 422 deletions(-) delete mode 100644 platform/linux-generic/arch/aarch64/odp_cpu_arch.c create mode 100644 platform/linux-generic/arch/aarch64/odp_global_time.c delete mode 100644 platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c delete mode 100644 platform/linux-generic/arch/arm/odp_cpu_arch.c delete mode 100644 platform/linux-generic/arch/arm/odp_sysinfo_parse.c create mode 100644 platform/linux-generic/arch/default/odp_cpu_cycles.c create mode 100644 platform/linux-generic/arch/default/odp_global_time.c create mode 100644 platform/linux-generic/arch/powerpc/odp_global_time.c create mode 100644 platform/linux-generic/arch/x86/odp_global_time.c diff --git a/platform/Makefile.inc b/platform/Makefile.inc index bb5da187b..f3161abd4 100644 --- a/platform/Makefile.inc +++ b/platform/Makefile.inc @@ -81,25 +81,3 @@ odpapiabiarchinclude_HEADERS = \ $(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/pool.h \ $(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/queue.h \ $(top_srcdir)/include/odp/arch/@ARCH_ABI@/odp/api/abi/shared_memory.h - -EXTRA_DIST = \ - arch/arm/odp/api/cpu_arch.h \ - arch/arm/odp_cpu_arch.c \ - arch/arm/odp_sysinfo_parse.c \ - arch/aarch64/odp/api/cpu_arch.h \ - arch/aarch64/odp_cpu_arch.c \ - arch/aarch64/odp_sysinfo_parse.c \ - arch/default/odp/api/cpu_arch.h \ - arch/default/odp_cpu_arch.c \ - arch/default/odp_sysinfo_parse.c \ - arch/mips64/odp/api/cpu_arch.h \ - arch/mips64/odp_cpu_arch.c \ - arch/mips64/odp_sysinfo_parse.c \ - arch/powerpc/odp/api/cpu_arch.h \ - arch/powerpc/odp_cpu_arch.c \ - arch/powerpc/odp_sysinfo_parse.c \ - arch/x86/odp/api/cpu_arch.h \ - arch/x86/odp_cpu_arch.c \ - arch/x86/odp_sysinfo_parse.c \ - arch/x86/cpu_flags.c \ - arch/x86/cpu_flags.h diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am index 7257a60f5..0ebb6f76c 100644 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@ -68,22 +68,6 @@ odpapiinclude_HEADERS = \ $(srcdir)/include/odp/api/traffic_mngr.h \ $(srcdir)/include/odp/api/version.h -if ARCH_IS_ARM -odpapiinclude_HEADERS += $(srcdir)/arch/arm/odp/api/cpu_arch.h -endif -if ARCH_IS_AARCH64 -odpapiinclude_HEADERS += $(srcdir)/arch/aarch64/odp/api/cpu_arch.h -endif -if ARCH_IS_MIPS64 -odpapiinclude_HEADERS += $(srcdir)/arch/mips64/odp/api/cpu_arch.h -endif -if ARCH_IS_POWERPC -odpapiinclude_HEADERS += $(srcdir)/arch/powerpc/odp/api/cpu_arch.h -endif -if ARCH_IS_X86 -odpapiinclude_HEADERS += $(srcdir)/arch/x86/odp/api/cpu_arch.h -endif - odpapiplatincludedir= $(includedir)/odp/api/plat odpapiplatinclude_HEADERS = \ $(builddir)/include/odp/api/plat/static_inline.h \ @@ -238,27 +222,47 @@ __LIB__libodp_linux_la_SOURCES = \ odp_weak.c if ARCH_IS_ARM -__LIB__libodp_linux_la_SOURCES += arch/arm/odp_cpu_arch.c \ - arch/arm/odp_sysinfo_parse.c +__LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/default/odp_global_time.c \ + arch/default/odp_sysinfo_parse.c +arch_odp_headers = $(srcdir)/arch/arm/odp/api/cpu_arch.h endif if ARCH_IS_AARCH64 -__LIB__libodp_linux_la_SOURCES += arch/aarch64/odp_cpu_arch.c \ - arch/aarch64/odp_sysinfo_parse.c +__LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/aarch64/odp_global_time.c \ + arch/default/odp_sysinfo_parse.c +arch_odp_headers = $(srcdir)/arch/aarch64/odp/api/cpu_arch.h endif if ARCH_IS_MIPS64 __LIB__libodp_linux_la_SOURCES += arch/mips64/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/default/odp_global_time.c \ arch/mips64/odp_sysinfo_parse.c +arch_odp_headers = $(srcdir)/arch/mips64/odp/api/cpu_arch.h endif if ARCH_IS_POWERPC -__LIB__libodp_linux_la_SOURCES += arch/powerpc/odp_cpu_arch.c \ +__LIB__libodp_linux_la_SOURCES += arch/default/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/default/odp_global_time.c \ arch/powerpc/odp_sysinfo_parse.c +arch_odp_headers = $(srcdir)/arch/powerpc/odp/api/cpu_arch.h endif if ARCH_IS_X86 __LIB__libodp_linux_la_SOURCES += arch/x86/cpu_flags.c \ arch/x86/odp_cpu_arch.c \ + arch/default/odp_cpu_cycles.c \ + arch/x86/odp_global_time.c \ arch/x86/odp_sysinfo_parse.c +arch_odp_headers = $(srcdir)/arch/x86/odp/api/cpu_arch.h +noinst_HEADERS += $(srcdir)/arch/x86/cpu_flags.h endif +noinst_HEADERS += $(srcdir)/arch/default/odp/api/cpu_arch.h + +odpapiinclude_HEADERS += $(arch_odp_headers) + if HAVE_PCAP __LIB__libodp_linux_la_SOURCES += pktio/pcap.c endif diff --git a/platform/linux-generic/arch/aarch64/odp_cpu_arch.c b/platform/linux-generic/arch/aarch64/odp_cpu_arch.c deleted file mode 100644 index b87d1c102..000000000 --- a/platform/linux-generic/arch/aarch64/odp_cpu_arch.c +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright (c) 2015, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "config.h" - -#include - -#include -#include - -#include -#include -#include -#include -#include - -#define GIGA 1000000000 - -uint64_t odp_cpu_cycles(void) -{ - struct timespec time; - uint64_t sec, ns, hz, cycles; - int ret; - - ret = clock_gettime(CLOCK_MONOTONIC_RAW, &time); - - if (ret != 0) - ODP_ABORT("clock_gettime failed\n"); - - hz = odp_cpu_hz_max(); - sec = (uint64_t)time.tv_sec; - ns = (uint64_t)time.tv_nsec; - - cycles = sec * hz; - cycles += (ns * hz) / GIGA; - - return cycles; -} - -uint64_t odp_cpu_cycles_max(void) -{ - return UINT64_MAX; -} - -uint64_t odp_cpu_cycles_resolution(void) -{ - return 1; -} - -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; -} - -uint64_t cpu_global_time(void) -{ - uint64_t cntvct; - - /* - * To be consistent with other architectures, do not issue a - * serializing instruction, e.g. ISB, before reading this - * sys reg. - */ - - /* Memory clobber to minimize optimization around load from sys reg. */ - __asm__ volatile("mrs %0, cntvct_el0" : "=r"(cntvct) : : "memory"); - - return cntvct; -} - -uint64_t cpu_global_time_freq(void) -{ - uint64_t cntfrq; - - __asm__ volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq) : : ); - - return cntfrq; -} diff --git a/platform/linux-generic/arch/aarch64/odp_global_time.c b/platform/linux-generic/arch/aarch64/odp_global_time.c new file mode 100644 index 000000000..97444f7e9 --- /dev/null +++ b/platform/linux-generic/arch/aarch64/odp_global_time.c @@ -0,0 +1,57 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config.h" + +#include + +#include + +#include +#include + +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; +} + +uint64_t cpu_global_time(void) +{ + uint64_t cntvct; + + /* + * To be consistent with other architectures, do not issue a + * serializing instruction, e.g. ISB, before reading this + * sys reg. + */ + + /* Memory clobber to minimize optimization around load from sys reg. */ + __asm__ volatile("mrs %0, cntvct_el0" : "=r"(cntvct) : : "memory"); + + return cntvct; +} + +uint64_t cpu_global_time_freq(void) +{ + uint64_t cntfrq; + + __asm__ volatile("mrs %0, cntfrq_el0" : "=r"(cntfrq) : : ); + + return cntfrq; +} diff --git a/platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c b/platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c deleted file mode 100644 index 1e2c729a7..000000000 --- a/platform/linux-generic/arch/aarch64/odp_sysinfo_parse.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "config.h" - -#include -#include -#include - -int cpuinfo_parser(FILE *file ODP_UNUSED, system_info_t *sysinfo) -{ - int i; - - ODP_DBG("Warning: use dummy values for freq and model string\n"); - for (i = 0; i < MAX_CPU_NUMBER; i++) { - sysinfo->cpu_hz_max[i] = 1400000000; - strcpy(sysinfo->model_str[i], "UNKNOWN"); - } - - return 0; -} - -void sys_info_print_arch(void) -{ -} diff --git a/platform/linux-generic/arch/arm/odp_cpu_arch.c b/platform/linux-generic/arch/arm/odp_cpu_arch.c deleted file mode 100644 index fc49ce371..000000000 --- a/platform/linux-generic/arch/arm/odp_cpu_arch.c +++ /dev/null @@ -1,79 +0,0 @@ -/* Copyright (c) 2015, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "config.h" - -#include - -#include -#include - -#include -#include -#include -#include -#include - -#define GIGA 1000000000 - -uint64_t odp_cpu_cycles(void) -{ - struct timespec time; - uint64_t sec, ns, hz, cycles; - int ret; - - ret = clock_gettime(CLOCK_MONOTONIC_RAW, &time); - - if (ret != 0) - ODP_ABORT("clock_gettime failed\n"); - - hz = odp_cpu_hz_max(); - sec = (uint64_t)time.tv_sec; - ns = (uint64_t)time.tv_nsec; - - cycles = sec * hz; - cycles += (ns * hz) / GIGA; - - return cycles; -} - -uint64_t odp_cpu_cycles_max(void) -{ - return UINT64_MAX; -} - -uint64_t odp_cpu_cycles_resolution(void) -{ - return 1; -} - -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; -} - -uint64_t cpu_global_time(void) -{ - return 0; -} - -uint64_t cpu_global_time_freq(void) -{ - return 0; -} diff --git a/platform/linux-generic/arch/arm/odp_sysinfo_parse.c b/platform/linux-generic/arch/arm/odp_sysinfo_parse.c deleted file mode 100644 index 1e2c729a7..000000000 --- a/platform/linux-generic/arch/arm/odp_sysinfo_parse.c +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2016, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include "config.h" - -#include -#include -#include - -int cpuinfo_parser(FILE *file ODP_UNUSED, system_info_t *sysinfo) -{ - int i; - - ODP_DBG("Warning: use dummy values for freq and model string\n"); - for (i = 0; i < MAX_CPU_NUMBER; i++) { - sysinfo->cpu_hz_max[i] = 1400000000; - strcpy(sysinfo->model_str[i], "UNKNOWN"); - } - - return 0; -} - -void sys_info_print_arch(void) -{ -} diff --git a/platform/linux-generic/arch/default/odp_cpu_arch.c b/platform/linux-generic/arch/default/odp_cpu_arch.c index fab351feb..8a8da7445 100644 --- a/platform/linux-generic/arch/default/odp_cpu_arch.c +++ b/platform/linux-generic/arch/default/odp_cpu_arch.c @@ -12,10 +12,7 @@ #include #include -#include -#include #include -#include #define GIGA 1000000000 @@ -39,28 +36,3 @@ uint64_t odp_cpu_cycles(void) return cycles; } - -uint64_t odp_cpu_cycles_max(void) -{ - return UINT64_MAX; -} - -uint64_t odp_cpu_cycles_resolution(void) -{ - return 1; -} - -int cpu_has_global_time(void) -{ - return 0; -} - -uint64_t cpu_global_time(void) -{ - return 0; -} - -uint64_t cpu_global_time_freq(void) -{ - return 0; -} diff --git a/platform/linux-generic/arch/default/odp_cpu_cycles.c b/platform/linux-generic/arch/default/odp_cpu_cycles.c new file mode 100644 index 000000000..ccc588825 --- /dev/null +++ b/platform/linux-generic/arch/default/odp_cpu_cycles.c @@ -0,0 +1,19 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config.h" + +#include + +uint64_t odp_cpu_cycles_max(void) +{ + return UINT64_MAX; +} + +uint64_t odp_cpu_cycles_resolution(void) +{ + return 1; +} diff --git a/platform/linux-generic/arch/default/odp_global_time.c b/platform/linux-generic/arch/default/odp_global_time.c new file mode 100644 index 000000000..89cce1cfb --- /dev/null +++ b/platform/linux-generic/arch/default/odp_global_time.c @@ -0,0 +1,33 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config.h" + +#include + +#include +#include + +#include +#include +#include +#include +#include + +int cpu_has_global_time(void) +{ + return 0; +} + +uint64_t cpu_global_time(void) +{ + return 0; +} + +uint64_t cpu_global_time_freq(void) +{ + return 0; +} diff --git a/platform/linux-generic/arch/mips64/odp_cpu_arch.c b/platform/linux-generic/arch/mips64/odp_cpu_arch.c index 143867ea0..620a01044 100644 --- a/platform/linux-generic/arch/mips64/odp_cpu_arch.c +++ b/platform/linux-generic/arch/mips64/odp_cpu_arch.c @@ -22,28 +22,3 @@ uint64_t odp_cpu_cycles(void) return cycle; } - -uint64_t odp_cpu_cycles_max(void) -{ - return UINT64_MAX; -} - -uint64_t odp_cpu_cycles_resolution(void) -{ - return 1; -} - -int cpu_has_global_time(void) -{ - return 0; -} - -uint64_t cpu_global_time(void) -{ - return 0; -} - -uint64_t cpu_global_time_freq(void) -{ - return 0; -} diff --git a/platform/linux-generic/arch/powerpc/odp_cpu_arch.c b/platform/linux-generic/arch/powerpc/odp_cpu_arch.c index fab351feb..6a16f13a2 100644 --- a/platform/linux-generic/arch/powerpc/odp_cpu_arch.c +++ b/platform/linux-generic/arch/powerpc/odp_cpu_arch.c @@ -39,28 +39,3 @@ uint64_t odp_cpu_cycles(void) return cycles; } - -uint64_t odp_cpu_cycles_max(void) -{ - return UINT64_MAX; -} - -uint64_t odp_cpu_cycles_resolution(void) -{ - return 1; -} - -int cpu_has_global_time(void) -{ - return 0; -} - -uint64_t cpu_global_time(void) -{ - return 0; -} - -uint64_t cpu_global_time_freq(void) -{ - return 0; -} diff --git a/platform/linux-generic/arch/powerpc/odp_global_time.c b/platform/linux-generic/arch/powerpc/odp_global_time.c new file mode 100644 index 000000000..d54ba6bc8 --- /dev/null +++ b/platform/linux-generic/arch/powerpc/odp_global_time.c @@ -0,0 +1,15 @@ + +int cpu_has_global_time(void) +{ + return 0; +} + +uint64_t cpu_global_time(void) +{ + return 0; +} + +uint64_t cpu_global_time_freq(void) +{ + return 0; +} diff --git a/platform/linux-generic/arch/x86/odp_cpu_arch.c b/platform/linux-generic/arch/x86/odp_cpu_arch.c index 50fbbac66..a20d91734 100644 --- a/platform/linux-generic/arch/x86/odp_cpu_arch.c +++ b/platform/linux-generic/arch/x86/odp_cpu_arch.c @@ -9,7 +9,6 @@ #include #include -#include #include #include @@ -30,74 +29,3 @@ uint64_t odp_cpu_cycles(void) return tsc.tsc_64; } - -uint64_t odp_cpu_cycles_max(void) -{ - return UINT64_MAX; -} - -uint64_t odp_cpu_cycles_resolution(void) -{ - return 1; -} - -uint64_t cpu_global_time(void) -{ - return odp_cpu_cycles(); -} - -#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) -{ - struct timespec sleep, ts1, ts2; - uint64_t t1, t2, ts_nsec, cycles, hz; - int i; - uint64_t avg = 0; - int rounds = 3; - int warm_up = 1; - - for (i = 0; i < rounds; i++) { - sleep.tv_sec = 0; - - if (warm_up) - sleep.tv_nsec = SEC_IN_NS / 1000; - else - sleep.tv_nsec = SEC_IN_NS / 4; - - if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts1)) { - ODP_DBG("clock_gettime failed\n"); - return 0; - } - - t1 = cpu_global_time(); - - if (nanosleep(&sleep, NULL) < 0) { - ODP_DBG("nanosleep failed\n"); - return 0; - } - - if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts2)) { - ODP_DBG("clock_gettime failed\n"); - return 0; - } - - t2 = cpu_global_time(); - - ts_nsec = (ts2.tv_sec - ts1.tv_sec) * SEC_IN_NS; - ts_nsec += ts2.tv_nsec - ts1.tv_nsec; - - cycles = t2 - t1; - - hz = (cycles * SEC_IN_NS) / ts_nsec; - - if (warm_up) - warm_up = 0; - else - avg += hz; - } - - return avg / (rounds - 1); -} diff --git a/platform/linux-generic/arch/x86/odp_global_time.c b/platform/linux-generic/arch/x86/odp_global_time.c new file mode 100644 index 000000000..3ed243cc6 --- /dev/null +++ b/platform/linux-generic/arch/x86/odp_global_time.c @@ -0,0 +1,77 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "config.h" + +#include + +#include + +#include +#include +#include +#include + +uint64_t cpu_global_time(void) +{ + return odp_cpu_cycles(); +} + +#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) +{ + struct timespec sleep, ts1, ts2; + uint64_t t1, t2, ts_nsec, cycles, hz; + int i; + uint64_t avg = 0; + int rounds = 3; + int warm_up = 1; + + for (i = 0; i < rounds; i++) { + sleep.tv_sec = 0; + + if (warm_up) + sleep.tv_nsec = SEC_IN_NS / 1000; + else + sleep.tv_nsec = SEC_IN_NS / 4; + + if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts1)) { + ODP_DBG("clock_gettime failed\n"); + return 0; + } + + t1 = cpu_global_time(); + + if (nanosleep(&sleep, NULL) < 0) { + ODP_DBG("nanosleep failed\n"); + return 0; + } + + if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts2)) { + ODP_DBG("clock_gettime failed\n"); + return 0; + } + + t2 = cpu_global_time(); + + ts_nsec = (ts2.tv_sec - ts1.tv_sec) * SEC_IN_NS; + ts_nsec += ts2.tv_nsec - ts1.tv_nsec; + + cycles = t2 - t1; + + hz = (cycles * SEC_IN_NS) / ts_nsec; + + if (warm_up) + warm_up = 0; + else + avg += hz; + } + + return avg / (rounds - 1); +} -- cgit v1.2.3