examples/performance-thread: fix compilation on Suse 11 SP2
authorBruce Richardson <bruce.richardson@intel.com>
Mon, 24 Apr 2017 13:04:22 +0000 (14:04 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 24 Apr 2017 14:02:20 +0000 (16:02 +0200)
Fixes following compilation error, using uint64_t type,
instead of int128_t unnecessarily:

In file included from ./common/lthread.c:82:0:
./common/lthread_timer.h: In function ‘_ns_to_clks’:
./common/lthread_timer.h:49:20: error: expected ‘=’, ‘,’, ‘;’,
 ‘asm’ or ‘__attribute__’ before ‘clkns’
compilation terminated due to -Wfatal-errors.

Fixes: 116819b9ed0d ("examples/performance-thread: add lthread subsystem")
Cc: stable@dpdk.org
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
examples/performance-thread/common/lthread_timer.h

index b044b90..7c03d67 100644 (file)
@@ -46,11 +46,22 @@ extern "C" {
 static inline uint64_t
 _ns_to_clks(uint64_t ns)
 {
-       unsigned __int128 clkns = rte_get_tsc_hz();
+       /*
+        * clkns needs to be divided by 1E9 to get ns clocks. However,
+        * dividing by this first would lose a lot of accuracy.
+        * Dividing after a multiply by ns, could cause overflow of
+        * uint64_t if ns is about 5 seconds [if we assume a max tsc
+        * rate of 4GHz]. Therefore we first divide by 1E4, then
+        * multiply and finally divide by 1E5. This allows ns to be
+        * values many hours long, without overflow, while still keeping
+        * reasonable accuracy.
+        */
+       uint64_t clkns = rte_get_tsc_hz() / 1e4;
 
        clkns *= ns;
-       clkns /= 1000000000;
-       return (uint64_t) clkns;
+       clkns /= 1e5;
+
+       return clkns;
 }