diff options
author | Daniel Wagner <wagi@monom.org> | 2019-03-15 11:14:06 +0100 |
---|---|---|
committer | John Kacur <jkacur@redhat.com> | 2019-06-19 01:03:45 +0200 |
commit | 6a9661a03e9ee95aa48353e6d840e9c12140c431 (patch) | |
tree | f0ea643b605a56eb3092568fe5a87172e9ca0b42 | |
parent | 6a7446e489fe29655d6dfc326c7470adfb375965 (diff) | |
download | rt-tests-6a9661a03e9ee95aa48353e6d840e9c12140c431.tar.gz rt-tests-6a9661a03e9ee95aa48353e6d840e9c12140c431.tar.xz |
queuelat: Use clock syscall for ARM 32 bit
CPUs such as Cortex-M8 don't have a rdtsc instruction. Fallback using
a syscall.
Signed-off-by: Daniel Wagner <wagi@monom.org>
Signed-off-by: John Kacur <jkacur@redhat.com>
-rw-r--r-- | src/queuelat/queuelat.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/queuelat/queuelat.c b/src/queuelat/queuelat.c index 3b291f1..a5525e4 100644 --- a/src/queuelat/queuelat.c +++ b/src/queuelat/queuelat.c @@ -7,6 +7,7 @@ #include <stdio.h> #include <unistd.h> #include <signal.h> +#include <time.h> #define NSEC_PER_SEC 1000000000 @@ -249,6 +250,8 @@ typedef unsigned long long cycles_t; typedef unsigned long long usecs_t; typedef unsigned long long u64; +#if defined __x86_64__ || defined __i386__ + #ifdef __x86_64__ #define DECLARE_ARGS(val, low, high) unsigned low, high #define EAX_EDX_VAL(val, low, high) ((low) | ((u64)(high) << 32)) @@ -270,7 +273,25 @@ static inline unsigned long long __rdtscll(void) return EAX_EDX_VAL(val, low, high); } -#define rdtscll(val) do { (val) = __rdtscll(); } while (0) +#define gettick(val) do { (val) = __rdtscll(); } while (0) + +#elif defined __arm__ + +static inline unsigned long long __clock_gettime(void) +{ + struct timespec now; + int ret; + + ret = clock_gettime(CLOCK_MONOTONIC, &now); + if (ret < 0) + return 0; + + return now.tv_nsec; +} + +#define gettick(val) do { (val) = __clock_gettime(); } while (0) + +#endif static void init_buckets(void) { @@ -348,9 +369,9 @@ static void run_n(int n) memmove(dest, src, n); for (i = 0; i < loops; i++) { - rdtscll(b); + gettick(b); memmove(dest, src, n); - rdtscll(a); + gettick(a); delta = (a - b) * cycles_to_ns; account(delta); } @@ -446,9 +467,9 @@ void main_loop(void) int ret; int nr_packets_fill; - rdtscll(b); + gettick(b); memmove(dest, src, default_n); - rdtscll(a); + gettick(a); delta = (a - b) * cycles_to_ns; account(delta); |