fio: fix cycles_start build issue
authorChristian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
Fri, 27 Feb 2015 15:20:46 +0000 (08:20 -0700)
committerJens Axboe <axboe@fb.com>
Fri, 27 Feb 2015 15:20:46 +0000 (08:20 -0700)
There is an issue introduced with "commit 73df3e07 gettime: offset CPU cycle
counter by initial value". For architectures which define
ARCH_CPU_CLOCK_CYCLES_PER_USEC (currently only s390) this causes a build
error

gettime.c:174:11: error: â€˜cycles_start’ undeclared (first use in this
function)
    if (t < cycles_start && !cycles_wrap)

To make sure variables and code are only compiled in the same cases I
added a
clock definition called ARCH_CPU_CLOCK_WRAPS. We could merge
ARCH_CPU_CLOCK_WRAPS and the existing ARCH_CPU_CLOCK_CYCLES_PER_USEC
into one
if you prefer, so far nobody else uses it.

To avoid cluttering all architecture headers I enabled it by default in
arch-generic.h, so any arch not needing the wrap handling can undef
ARCH_CPU_CLOCK_WRAPS later in their headers.

Signed-off-by: Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
arch/arch-s390.h
arch/arch.h
gettime.c

index 169282b9d4d308de3e3ca23aa6ba5be7c46613e1..cc7a1d10de28c0541e21cc5520a126165f30815b 100644 (file)
@@ -40,6 +40,7 @@ static inline unsigned long long get_cpu_clock(void)
 
 #define ARCH_CPU_CLOCK_CYCLES_PER_USEC 1
 #define ARCH_HAVE_CPU_CLOCK
+#undef ARCH_CPU_CLOCK_WRAPS
 
 #define ARCH_HAVE_INIT
 extern int tsc_reliable;
index 0075f73d022f13ba425ea0c33b3d20885423005c..5671b9a0f8885a9ca6302483915b01cb9245860b 100644 (file)
@@ -30,6 +30,8 @@ enum {
 
 extern unsigned long arch_flags;
 
+#define ARCH_CPU_CLOCK_WRAPS
+
 #if defined(__i386__)
 #include "arch-x86.h"
 #elif defined(__x86_64__)
index 6863ce3f97cef140e967990b9b8a7dc0bf3b0126..d1c8eb970c3cb4125022508b2cb43b3f36571843 100644 (file)
--- a/gettime.c
+++ b/gettime.c
@@ -17,6 +17,8 @@
 static unsigned long cycles_per_usec;
 static unsigned long inv_cycles_per_usec;
 static uint64_t max_cycles_for_mult;
+#endif
+#ifdef ARCH_CPU_CLOCK_WRAPS
 static unsigned long long cycles_start, cycles_wrap;
 #endif
 int tsc_reliable = 0;
@@ -171,6 +173,7 @@ static void __fio_gettime(struct timeval *tp)
 #endif
 
                t = get_cpu_clock();
+#ifdef ARCH_CPU_CLOCK_WRAPS
                if (t < cycles_start && !cycles_wrap)
                        cycles_wrap = 1;
                else if (cycles_wrap && t >= cycles_start && !tv->warned) {
@@ -179,6 +182,7 @@ static void __fio_gettime(struct timeval *tp)
                }
 
                t -= cycles_start;
+#endif
                tv->last_cycles = t;
                tv->last_tv_valid = 1;
 #ifdef ARCH_CPU_CLOCK_CYCLES_PER_USEC
@@ -311,8 +315,10 @@ static int calibrate_cpu_clock(void)
        inv_cycles_per_usec = 16777216UL / cycles_per_usec;
        max_cycles_for_mult = ~0ULL / inv_cycles_per_usec;
        dprint(FD_TIME, "inv_cycles_per_usec=%lu\n", inv_cycles_per_usec);
+#ifdef ARCH_CPU_CLOCK_WRAPS
        cycles_start = get_cpu_clock();
        dprint(FD_TIME, "cycles_start=%llu\n", cycles_start);
+#endif
        return 0;
 }
 #else