From patchwork Wed Jun 17 09:39:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fady Bader X-Patchwork-Id: 71676 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 3E75AA04A5; Wed, 17 Jun 2020 11:39:34 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7A0CF1E2B; Wed, 17 Jun 2020 11:39:33 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id A65D91E2B for ; Wed, 17 Jun 2020 11:39:31 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from fady@mellanox.com) with SMTP; 17 Jun 2020 12:39:28 +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 05H9dS3D017509; Wed, 17 Jun 2020 12:39:28 +0300 From: Fady Bader To: dev@dpdk.org Cc: fady@mellanox.com, thomas@monjalon.net, tbashar@mellanox.com, talshn@mellanox.com, yohadt@mellanox.com, dmitry.kozliuk@gmail.com, harini.ramakrishnan@microsoft.com, ocardona@microsoft.com, pallavi.kadam@intel.com, ranjit.menon@intel.com Date: Wed, 17 Jun 2020 12:39:14 +0300 Message-Id: <20200617093915.16428-2-fady@mellanox.com> X-Mailer: git-send-email 2.16.1.windows.4 In-Reply-To: <20200617093915.16428-1-fady@mellanox.com> References: <20200423144350.4016-2-fady@mellanox.com> <20200617093915.16428-1-fady@mellanox.com> Subject: [dpdk-dev] [PATCH v9 1/2] timer: move from common to Unix directory 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" Eal common timer doesn't compile under Windows. Compilation log: error LNK2019: unresolved external symbol nanosleep referenced in function rte_delay_us_sleep error LNK2019: unresolved external symbol get_tsc_freq referenced in function set_tsc_freq error LNK2019: unresolved external symbol sleep referenced in function set_tsc_freq The reason was that some functions called POSIX functions. The solution was to move POSIX dependent functions from common to Unix. Signed-off-by: Fady Bader --- lib/librte_eal/common/eal_common_timer.c | 22 ---------------------- lib/librte_eal/freebsd/Makefile | 1 + lib/librte_eal/linux/Makefile | 1 + lib/librte_eal/unix/eal_unix_timer.c | 29 +++++++++++++++++++++++++++++ lib/librte_eal/unix/meson.build | 1 + 5 files changed, 32 insertions(+), 22 deletions(-) create mode 100644 lib/librte_eal/unix/eal_unix_timer.c diff --git a/lib/librte_eal/common/eal_common_timer.c b/lib/librte_eal/common/eal_common_timer.c index fa9ee1b224..71e0bd035a 100644 --- a/lib/librte_eal/common/eal_common_timer.c +++ b/lib/librte_eal/common/eal_common_timer.c @@ -35,28 +35,6 @@ rte_delay_us_block(unsigned int us) rte_pause(); } -void -rte_delay_us_sleep(unsigned int us) -{ - struct timespec wait[2]; - int ind = 0; - - wait[0].tv_sec = 0; - if (us >= US_PER_S) { - wait[0].tv_sec = us / US_PER_S; - us -= wait[0].tv_sec * US_PER_S; - } - wait[0].tv_nsec = 1000 * us; - - while (nanosleep(&wait[ind], &wait[1 - ind]) && errno == EINTR) { - /* - * Sleep was interrupted. Flip the index, so the 'remainder' - * will become the 'request' for a next call. - */ - ind = 1 - ind; - } -} - uint64_t rte_get_tsc_hz(void) { diff --git a/lib/librte_eal/freebsd/Makefile b/lib/librte_eal/freebsd/Makefile index 2374ba0b7d..d18c00eeae 100644 --- a/lib/librte_eal/freebsd/Makefile +++ b/lib/librte_eal/freebsd/Makefile @@ -78,6 +78,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += rte_reciprocal.c # from unix dir SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_file.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_unix_memory.c +SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_unix_timer.c # from arch dir SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += rte_cpuflags.c diff --git a/lib/librte_eal/linux/Makefile b/lib/librte_eal/linux/Makefile index 07ce643bae..5d97073ed2 100644 --- a/lib/librte_eal/linux/Makefile +++ b/lib/librte_eal/linux/Makefile @@ -86,6 +86,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += rte_reciprocal.c # from unix dir SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_file.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_unix_memory.c +SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_unix_timer.c # from arch dir SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += rte_cpuflags.c diff --git a/lib/librte_eal/unix/eal_unix_timer.c b/lib/librte_eal/unix/eal_unix_timer.c new file mode 100644 index 0000000000..cc50159104 --- /dev/null +++ b/lib/librte_eal/unix/eal_unix_timer.c @@ -0,0 +1,29 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2020 Mellanox Technologies, Ltd + */ + +#include + +#include + +void +rte_delay_us_sleep(unsigned int us) +{ + struct timespec wait[2]; + int ind = 0; + + wait[0].tv_sec = 0; + if (us >= US_PER_S) { + wait[0].tv_sec = us / US_PER_S; + us -= wait[0].tv_sec * US_PER_S; + } + wait[0].tv_nsec = 1000 * us; + + while (nanosleep(&wait[ind], &wait[1 - ind]) && errno == EINTR) { + /* + * Sleep was interrupted. Flip the index, so the 'remainder' + * will become the 'request' for a next call. + */ + ind = 1 - ind; + } +} diff --git a/lib/librte_eal/unix/meson.build b/lib/librte_eal/unix/meson.build index e733910a1a..d3af6b6fe2 100644 --- a/lib/librte_eal/unix/meson.build +++ b/lib/librte_eal/unix/meson.build @@ -4,4 +4,5 @@ sources += files( 'eal_file.c', 'eal_unix_memory.c', + 'eal_unix_timer.c', ) From patchwork Wed Jun 17 09:39:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fady Bader X-Patchwork-Id: 71678 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 05D2AA04A5; Wed, 17 Jun 2020 11:39:48 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 93B7258C4; Wed, 17 Jun 2020 11:39:36 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id AAE3D25B3 for ; Wed, 17 Jun 2020 11:39:31 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from fady@mellanox.com) with SMTP; 17 Jun 2020 12:39:28 +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 05H9dS3E017509; Wed, 17 Jun 2020 12:39:28 +0300 From: Fady Bader To: dev@dpdk.org Cc: fady@mellanox.com, thomas@monjalon.net, tbashar@mellanox.com, talshn@mellanox.com, yohadt@mellanox.com, dmitry.kozliuk@gmail.com, harini.ramakrishnan@microsoft.com, ocardona@microsoft.com, pallavi.kadam@intel.com, ranjit.menon@intel.com Date: Wed, 17 Jun 2020 12:39:15 +0300 Message-Id: <20200617093915.16428-3-fady@mellanox.com> X-Mailer: git-send-email 2.16.1.windows.4 In-Reply-To: <20200617093915.16428-1-fady@mellanox.com> References: <20200423144350.4016-2-fady@mellanox.com> <20200617093915.16428-1-fady@mellanox.com> Subject: [dpdk-dev] [PATCH v9 2/2] 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 | 91 +++++++++++++++++++++++++++++++++ lib/librte_eal/windows/include/rte_os.h | 2 + lib/librte_eal/windows/meson.build | 1 + 5 files changed, 101 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 3108442697..4bdf77922f 100644 --- a/lib/librte_eal/common/meson.build +++ b/lib/librte_eal/common/meson.build @@ -26,6 +26,7 @@ if is_windows 'malloc_elem.c', 'malloc_heap.c', 'rte_malloc.c', + 'eal_common_timer.c', ) subdir_done() endif diff --git a/lib/librte_eal/windows/eal.c b/lib/librte_eal/windows/eal.c index 427a5557fa..b6bffd3d92 100644 --- a/lib/librte_eal/windows/eal.c +++ b/lib/librte_eal/windows/eal.c @@ -354,6 +354,12 @@ rte_eal_init(int argc, char **argv) return -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 0000000000..59099e8942 --- /dev/null +++ b/lib/librte_eal/windows/eal_timer.c @@ -0,0 +1,91 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2020 Mellanox Technologies, Ltd + */ +#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) +{ + HANDLE timer; + LARGE_INTEGER due_time; + + /* create waitable timer */ + timer = CreateWaitableTimer(NULL, TRUE, NULL); + if (!timer) { + RTE_LOG_WIN32_ERR("CreateWaitableTimer()"); + rte_errno = ENOMEM; + return; + } + + /* + * due_time's uom is 100 ns, multiply by 10 to convert to microseconds + * set us microseconds time for timer + */ + due_time.QuadPart = -((int64_t)us * 10); + if (!SetWaitableTimer(timer, &due_time, 0, NULL, NULL, FALSE)) { + RTE_LOG_WIN32_ERR("SetWaitableTimer()"); + rte_errno = EINVAL; + goto end; + } + /* start wait for timer for us microseconds */ + if (WaitForSingleObject(timer, INFINITE) == WAIT_FAILED) { + RTE_LOG_WIN32_ERR("WaitForSingleObject()"); + rte_errno = EINVAL; + } + +end: + CloseHandle(timer); +} + +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(); + + QueryPerformanceCounter(&t_start); + QueryPerformanceFrequency(&frequency); + + rte_delay_us_sleep(US_PER_SEC / 10); /* 1/10 second */ + + if (rte_errno != 0) + return 0; + + 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 cb10d6494f..569ed92d51 100644 --- a/lib/librte_eal/windows/include/rte_os.h +++ b/lib/librte_eal/windows/include/rte_os.h @@ -25,6 +25,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 ded5a2b808..08c888e018 100644 --- a/lib/librte_eal/windows/meson.build +++ b/lib/librte_eal/windows/meson.build @@ -14,6 +14,7 @@ sources += files( 'eal_memory.c', 'eal_mp.c', 'eal_thread.c', + 'eal_timer.c', 'fnmatch.c', 'getopt.c', )