Sending a new version soon. > Subject: Re: [PATCH v8 3/3] timer: support EAL functions on Windows > > > On 6/14/2020 1:43 AM, Fady Bader wrote: > > Implemented the needed Windows eal timer functions. > > > > Signed-off-by: Fady Bader <f...@mellanox.com> > > --- > > 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 > > +<inttypes.h> > > + > > +#include <rte_windows.h> > > +#include <rte_common.h> > > +#include <rte_cycles.h> > > +#include <rte_eal.h> > > +#include <rte_errno.h> > > +#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?
You are right, I'll change it. > > + > > + 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. Ok. > > + /* 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. Fady.