Fixup wrong types for dprint()
[fio.git] / gettime.c
index f29edcb7bd64bb2085a03cae25c0ae25057c22aa..352c1d3d7611be0277d3e038d737c1465f9ec820 100644 (file)
--- a/gettime.c
+++ b/gettime.c
@@ -21,8 +21,8 @@ int tsc_reliable = 0;
 
 struct tv_valid {
        struct timeval last_tv;
+       uint64_t last_cycles;
        int last_tv_valid;
-       unsigned long last_cycles;
 };
 #ifdef CONFIG_TLS_THREAD
 static struct tv_valid __thread static_tv_valid;
@@ -168,7 +168,7 @@ static void *__fio_gettime(struct timeval *tp)
 #endif
 #ifdef ARCH_HAVE_CPU_CLOCK
        case CS_CPUCLOCK: {
-               unsigned long long usecs, t;
+               uint64_t usecs, t;
 
                t = get_cpu_clock();
                if (tv && t < tv->last_cycles) {
@@ -233,7 +233,7 @@ void fio_gettime(struct timeval *tp, void fio_unused *caller)
 static unsigned long get_cycles_per_usec(void)
 {
        struct timeval s, e;
-       unsigned long long c_s, c_e;
+       uint64_t c_s, c_e;
        enum fio_cs old_cs = fio_clock_source;
 
 #ifdef CONFIG_CLOCK_GETTIME
@@ -245,7 +245,7 @@ static unsigned long get_cycles_per_usec(void)
 
        c_s = get_cpu_clock();
        do {
-               unsigned long long elapsed;
+               uint64_t elapsed;
 
                __fio_gettime(&e);
 
@@ -262,10 +262,10 @@ static unsigned long get_cycles_per_usec(void)
 
 #define NR_TIME_ITERS  50
 
-static void calibrate_cpu_clock(void)
+static int calibrate_cpu_clock(void)
 {
        double delta, mean, S;
-       unsigned long avg, cycles[NR_TIME_ITERS];
+       uint64_t avg, cycles[NR_TIME_ITERS];
        int i, samples;
 
        cycles[0] = get_cycles_per_usec();
@@ -279,6 +279,13 @@ static void calibrate_cpu_clock(void)
                }
        }
 
+       /*
+        * The most common platform clock breakage is returning zero
+        * indefinitely. Check for that and return failure.
+        */
+       if (!cycles[0] && !cycles[NR_TIME_ITERS - 1])
+               return 1;
+
        S = sqrt(S / (NR_TIME_ITERS - 1.0));
 
        samples = avg = 0;
@@ -295,20 +302,23 @@ static void calibrate_cpu_clock(void)
        mean /= 10.0;
 
        for (i = 0; i < NR_TIME_ITERS; i++)
-               dprint(FD_TIME, "cycles[%d]=%lu\n", i, cycles[i] / 10);
+               dprint(FD_TIME, "cycles[%d]=%llu\n", i,
+                                       (unsigned long long) cycles[i] / 10);
 
        avg /= samples;
        avg = (avg + 5) / 10;
-       dprint(FD_TIME, "avg: %lu\n", avg);
+       dprint(FD_TIME, "avg: %llu\n", (unsigned long long) avg);
        dprint(FD_TIME, "mean=%f, S=%f\n", mean, S);
 
        cycles_per_usec = avg;
        inv_cycles_per_usec = 16777216UL / cycles_per_usec;
        dprint(FD_TIME, "inv_cycles_per_usec=%lu\n", inv_cycles_per_usec);
+       return 0;
 }
 #else
-static void calibrate_cpu_clock(void)
+static int calibrate_cpu_clock(void)
 {
+       return 1;
 }
 #endif
 
@@ -343,7 +353,9 @@ void fio_clock_init(void)
 #endif
 
        fio_clock_source_inited = fio_clock_source;
-       calibrate_cpu_clock();
+
+       if (calibrate_cpu_clock())
+               tsc_reliable = 0;
 
        /*
         * If the arch sets tsc_reliable != 0, then it must be good enough
@@ -429,9 +441,9 @@ uint64_t time_since_now(struct timeval *s)
 #define CLOCK_ENTRIES  100000
 
 struct clock_entry {
-       unsigned long seq;
-       unsigned long tsc;
-       unsigned long cpu;
+       uint64_t seq;
+       uint64_t tsc;
+       uint64_t cpu;
 };
 
 struct clock_thread {
@@ -481,6 +493,13 @@ static void *clock_thread_fn(void *data)
        }
 
        log_info("cs: cpu%3d: %lu clocks seen\n", t->cpu, t->entries[CLOCK_ENTRIES - 1].tsc - t->entries[0].tsc);
+       /*
+        * The most common platform clock breakage is returning zero
+        * indefinitely. Check for that and return failure.
+        */
+       if (!t->entries[CLOCK_ENTRIES - 1].tsc && !t->entries[0].tsc)
+               return (void *) 1;
+
        return NULL;
 }
 
@@ -501,6 +520,7 @@ int fio_monotonic_clocktest(void)
        unsigned int nr_cpus = cpus_online();
        struct clock_entry *entries;
        unsigned long tentries, failed;
+       struct clock_entry *prev, *this;
        uint64_t seq = 0;
        int i;
 
@@ -558,7 +578,7 @@ int fio_monotonic_clocktest(void)
        qsort(entries, tentries, sizeof(struct clock_entry), clock_cmp);
 
        for (failed = i = 0; i < tentries; i++) {
-               struct clock_entry *prev, *this = &entries[i];
+               this = &entries[i];
 
                if (!i) {
                        prev = this;