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 675FEA04F1; Wed, 17 Jun 2020 05:18:04 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 69F2C1BFBB; Wed, 17 Jun 2020 05:18:03 +0200 (CEST) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 42DED1BFB6 for ; Wed, 17 Jun 2020 05:18:01 +0200 (CEST) IronPort-SDR: MFv5vJI11X8LSEGRM5AjDsfgY4fSAJJczYNbOW1mXrmyn1JrL0okHPbCfOOaTIvQYuWqvDRfER FfXJQ38LzkVw== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jun 2020 20:17:59 -0700 IronPort-SDR: pIhQKgCknRI9TEWi2Pv7wkZR8dZMLpPfgGzkNkiHn6dbMN5/fcoWtObcNVvUc8zHcgBVEaYxfP lpnLBBXgtOCA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,521,1583222400"; d="scan'208";a="383062431" Received: from orsmsx101.amr.corp.intel.com ([10.22.225.128]) by fmsmga001.fm.intel.com with ESMTP; 16 Jun 2020 20:17:59 -0700 Received: from [10.166.30.253] (10.166.30.253) by ORSMSX101.amr.corp.intel.com (10.22.225.128) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 16 Jun 2020 20:17:59 -0700 To: Fady Bader , CC: , , , , , , , References: <20200614084348.22404-1-fady@mellanox.com> <20200614084348.22404-4-fady@mellanox.com> From: Ranjit Menon Message-ID: <8727b8e7-8c7e-60d1-2467-3d0b2e129c1d@intel.com> Date: Tue, 16 Jun 2020 20:17:56 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Thunderbird/68.8.1 MIME-Version: 1.0 In-Reply-To: <20200614084348.22404-4-fady@mellanox.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US X-Originating-IP: [10.166.30.253] Subject: Re: [dpdk-dev] [PATCH v8 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" On 6/14/2020 1:43 AM, Fady Bader wrote: > 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 | 90 +++++++++++++++++++++++++++++++++ > lib/librte_eal/windows/include/rte_os.h | 2 + > lib/librte_eal/windows/meson.build | 1 + > 5 files changed, 100 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 55aaeb18e..2a62ef9b1 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', > ) > subdir_done() > endif > diff --git a/lib/librte_eal/windows/eal.c b/lib/librte_eal/windows/eal.c > index feee91244..203dfafdb 100644 > --- a/lib/librte_eal/windows/eal.c > +++ b/lib/librte_eal/windows/eal.c > @@ -250,6 +250,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..b0b83fb9b > --- /dev/null > +++ b/lib/librte_eal/windows/eal_timer.c > @@ -0,0 +1,90 @@ > +/* 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(); To be more precise, shouldn't we initialize 'start' just before calling QueryPerformanceCounter() for the first time below? > + > + QueryPerformanceFrequency(&frequency); > + QueryPerformanceCounter(&t_start); > + > + 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); Please leave a blank like here. > + /* 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 adfc8b9b7..9efbe6fd0 100644 > --- a/lib/librte_eal/windows/meson.build > +++ b/lib/librte_eal/windows/meson.build > @@ -9,6 +9,7 @@ sources += files( > 'eal_lcore.c', > 'eal_log.c', > 'eal_thread.c', > + 'eal_timer.c', > 'fnmatch.c', > 'getopt.c', > ) ranjit m.