All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
To: Fady Bader <fady@mellanox.com>
Cc: dev@dpdk.org, thomas@monjalon.net, talshn@mellanox.com,
	dmitry.koziuk@gmail.com, harini.ramakrishnan@microsoft.com,
	ocardona@microsoft.com, anand.rawat@intel.com,
	ranjit.menon@intel.com, yohadt@mellanox.com
Subject: Re: [dpdk-dev] [PATCH v4 2/2] timer: support EAL functions on Windows
Date: Wed, 6 May 2020 22:43:52 +0300	[thread overview]
Message-ID: <20200506224352.38910815@Sovereign> (raw)
In-Reply-To: <20200506120109.9856-3-fady@mellanox.com>

Getting extremely volatile results from get_tsc_hz(). Here's what I get from
10 successive calls:

freq=2660000000
freq=3220000000
freq=3740000000
freq=3870000000
freq=3830000000
freq=4060000000
freq=3370000000
freq=3820000000
freq=7370000000
freq=4970000000

Please see the last comment for the reason (and other comments inline).

On 2020-05-06 15:01 GMT+0300 Fady Bader wrote:
> Implemented the needed Windows eal timer functions.
> 
> Signed-off-by: Fady Bader <fady@mellanox.com>
> ---
[snip]
> diff --git a/lib/librte_eal/windows/eal_timer.c b/lib/librte_eal/windows/eal_timer.c
> new file mode 100644
> index 000000000..108f66b54
> --- /dev/null
> +++ b/lib/librte_eal/windows/eal_timer.c
> @@ -0,0 +1,96 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright 2020 Mellanox Technologies, Ltd
> + */
> +#include <inttypes.h>
> +#include <time.h>
> +
> +#include <rte_windows.h>
> +#include <rte_common.h>
> +#include <rte_log.h>
> +#include <rte_cycles.h>
> +#include <rte_eal.h>
> +#include <rte_errno.h>

#include "eal_private.h", without it:

../../../lib/librte_eal/windows/eal_timer.c: In function ‘rte_eal_timer_init’:
../../../lib/librte_eal/windows/eal_timer.c:108:2: warning: implicit declaration of function ‘set_tsc_freq’; did you mean ‘get_tsc_freq’? [-Wimplicit-function-declaration]
  108 |  set_tsc_freq();

> +
> +#define US_PER_SEC 1E6
> +#define CYC_PER_10MHZ 1E7
> +
> +/* The frequency of the RDTSC timer resolution */
> +static uint64_t eal_tsc_resolution_hz;
> +

At top level:
../../../lib/librte_eal/windows/eal_timer.c:20:17: warning: ‘eal_tsc_resolution_hz’ defined but not used [-Wunused-variable]
   20 | static uint64_t eal_tsc_resolution_hz;

Note: set_tsc_freq() already caches frequency you calculate here.

> +	due_time.QuadPart = -(us * 10);
> +	if (!SetWaitableTimer(timer, &due_time, 0, NULL, NULL, FALSE)) {
> +		CloseHandle(timer);
> +		RTE_LOG_WIN32_ERR("SetWaitableTimer()");

RTE_LOG_WIN32_ERR() uses GetLastError(), the value of which may be overridden
by a successful call to CloseHandle().

> +		rte_errno = EINVAL;
> +		return;
> +	}
> +	/* start wait for timer for us microseconds */
> +	WaitForSingleObject(timer, INFINITE);
> +	CloseHandle(timer);
> +}
> +
> +uint64_t
> +get_tsc_freq(void)
> +{
> +	LARGE_INTEGER t_start, t_end, elapsed_us;
> +	LARGE_INTEGER frequency;
> +	uint64_t tsc_hz;
> +
> +	if (QueryPerformanceFrequency(&frequency) == 0) {
> +		RTE_LOG_WIN32_ERR("QueryPerformanceFrequency()");
> +		return 0;
> +	}
> +
> +	if (QueryPerformanceCounter(&t_start) != 0) {

Per MSDN, QueryPerformanceFrequency() and QueryPerformanceCounter() always
succeed on all supported Windows versions.

> +		uint64_t end, start = rte_get_tsc_cycles();
> +
> +		rte_delay_us(US_PER_SEC / 10); /* 1/10 second */

Did you mean rte_delay_us_sleep()? rte_delay_us() assumes TSC frequency is
already available. With this fix, results become stable.

-- 
Dmitry Kozlyuk

      reply	other threads:[~2020-05-06 19:43 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-06 12:01 [dpdk-dev] [PATCH v4 0/2] eal timer split and implementation for Windows Fady Bader
2020-05-06 12:01 ` [dpdk-dev] [PATCH v4 1/2] timer: move from common to Unix directory Fady Bader
2020-05-06 19:49   ` Dmitry Kozlyuk
2020-05-06 12:01 ` [dpdk-dev] [PATCH v4 2/2] timer: support EAL functions on Windows Fady Bader
2020-05-06 19:43   ` Dmitry Kozlyuk [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200506224352.38910815@Sovereign \
    --to=dmitry.kozliuk@gmail.com \
    --cc=anand.rawat@intel.com \
    --cc=dev@dpdk.org \
    --cc=dmitry.koziuk@gmail.com \
    --cc=fady@mellanox.com \
    --cc=harini.ramakrishnan@microsoft.com \
    --cc=ocardona@microsoft.com \
    --cc=ranjit.menon@intel.com \
    --cc=talshn@mellanox.com \
    --cc=thomas@monjalon.net \
    --cc=yohadt@mellanox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.