From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 35A54A034F; Thu, 7 May 2020 15:06:24 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D00E21DCB9; Thu, 7 May 2020 15:05:57 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 10C111DCAB for ; Thu, 7 May 2020 15:05:43 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from fady@mellanox.com) with ESMTPS (AES256-SHA encrypted); 7 May 2020 16:05:41 +0300 Received: from l-wincomp04-vm.labs.mlnx (l-wincomp04-vm.mtl.labs.mlnx [10.237.1.5]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 047D5fJQ031501; Thu, 7 May 2020 16:05:41 +0300 From: Fady Bader To: dev@dpdk.org Cc: thomas@monjalon.net, talshn@mellanox.com, dmitry.koziuk@gmail.com, yohadt@mellanox.com, harini.ramakrishnan@microsoft.com, ocardona@microsoft.com, anand.rawat@intel.com, ranjit.menon@intel.com Date: Thu, 7 May 2020 16:05:31 +0300 Message-Id: <20200507130531.624-4-fady@mellanox.com> X-Mailer: git-send-email 2.16.1.windows.4 In-Reply-To: <20200507130531.624-1-fady@mellanox.com> References: <20200507130531.624-1-fady@mellanox.com> Subject: [dpdk-dev] [PATCH v5 3/3] timer: support EAL functions on Windows X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Implemented the needed Windows eal timer functions. Signed-off-by: Fady Bader --- lib/librte_eal/common/meson.build | 1 + lib/librte_eal/windows/eal.c | 6 +++ lib/librte_eal/windows/eal_timer.c | 77 +++++++++++++++++++++++++++++++++ lib/librte_eal/windows/include/rte_os.h | 2 + lib/librte_eal/windows/meson.build | 1 + 5 files changed, 87 insertions(+) create mode 100644 lib/librte_eal/windows/eal_timer.c diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build index 155da29b4..0ea995573 100644 --- a/lib/librte_eal/common/meson.build +++ b/lib/librte_eal/common/meson.build @@ -14,6 +14,7 @@ if is_windows 'eal_common_log.c', 'eal_common_options.c', 'eal_common_thread.c', + 'eal_common_timer.c', 'rte_option.c', ) subdir_done() diff --git a/lib/librte_eal/windows/eal.c b/lib/librte_eal/windows/eal.c index 831179799..4bc8fbfab 100644 --- a/lib/librte_eal/windows/eal.c +++ b/lib/librte_eal/windows/eal.c @@ -248,6 +248,12 @@ rte_eal_init(int argc, char **argv) if (fctret < 0) exit(1); + if (rte_eal_timer_init() < 0) { + rte_eal_init_alert("Cannot init TSC timer"); + rte_errno = EFAULT; + return -1; + } + eal_thread_init_master(rte_config.master_lcore); RTE_LCORE_FOREACH_SLAVE(i) { diff --git a/lib/librte_eal/windows/eal_timer.c b/lib/librte_eal/windows/eal_timer.c new file mode 100644 index 000000000..2d2929fb3 --- /dev/null +++ b/lib/librte_eal/windows/eal_timer.c @@ -0,0 +1,77 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2020 Mellanox Technologies, Ltd + */ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "eal_private.h" + +#define US_PER_SEC 1E6 +#define CYC_PER_10MHZ 1E7 + +void +rte_delay_us_sleep(unsigned int us) +{ + LARGE_INTEGER start, end; + LARGE_INTEGER freq; + + QueryPerformanceCounter(&start); + QueryPerformanceFrequency(&freq); + + LARGE_INTEGER ticks; + ticks.QuadPart = freq.QuadPart * us / US_PER_SEC; + + QueryPerformanceCounter(&end); + while ((end.QuadPart - start.QuadPart) < ticks.QuadPart) { + rte_pause(); + QueryPerformanceCounter(&end); + } +} + +uint64_t +get_tsc_freq(void) +{ + LARGE_INTEGER t_start, t_end, elapsed_us; + LARGE_INTEGER frequency; + uint64_t tsc_hz; + uint64_t end, start = rte_get_tsc_cycles(); + + QueryPerformanceFrequency(&frequency); + QueryPerformanceCounter(&t_start); + + rte_delay_us_sleep(US_PER_SEC / 10); /* 1/10 second */ + + QueryPerformanceCounter(&t_end); + end = rte_get_tsc_cycles(); + + elapsed_us.QuadPart = t_end.QuadPart - t_start.QuadPart; + + /* + * To guard against loss-of-precision, convert to microseconds + * *before* dividing by ticks-per-second. + */ + elapsed_us.QuadPart *= US_PER_SEC; + elapsed_us.QuadPart /= frequency.QuadPart; + + double secs = ((double)elapsed_us.QuadPart)/US_PER_SEC; + tsc_hz = (uint64_t)((end - start)/secs); + /* Round up to 10Mhz. 1E7 ~ 10Mhz */ + return RTE_ALIGN_MUL_NEAR(tsc_hz, CYC_PER_10MHZ); +} + + +int +rte_eal_timer_init(void) +{ + set_tsc_freq(); + return 0; +} + + diff --git a/lib/librte_eal/windows/include/rte_os.h b/lib/librte_eal/windows/include/rte_os.h index 510e39e03..6410b9c2f 100644 --- a/lib/librte_eal/windows/include/rte_os.h +++ b/lib/librte_eal/windows/include/rte_os.h @@ -24,6 +24,8 @@ extern "C" { #define PATH_MAX _MAX_PATH #endif +#define sleep(x) Sleep(1000 * (x)) + #define strerror_r(a, b, c) strerror_s(b, c, a) /* strdup is deprecated in Microsoft libc and _strdup is preferred */ diff --git a/lib/librte_eal/windows/meson.build b/lib/librte_eal/windows/meson.build index 09dd4ab2f..c796f289d 100644 --- a/lib/librte_eal/windows/meson.build +++ b/lib/librte_eal/windows/meson.build @@ -8,5 +8,6 @@ sources += files( 'eal_debug.c', 'eal_lcore.c', 'eal_thread.c', + 'eal_timer.c', 'getopt.c', ) -- 2.16.1.windows.4