gettime: silence bogus gcc warnings
[fio.git] / gettime.c
index 5ceb809de3ae9247a5cc7d3e2557b062541fc73f..8d99900c72819c70471115bac9cbd50f88d2671f 100644 (file)
--- a/gettime.c
+++ b/gettime.c
 #include "hash.h"
 #include "os/os.h"
 
-#if defined(ARCH_HAVE_CPU_CLOCK) && !defined(ARCH_CPU_CLOCK_CYCLES_PER_USEC)
+#if defined(ARCH_HAVE_CPU_CLOCK)
+#ifndef ARCH_CPU_CLOCK_CYCLES_PER_USEC
 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
+#endif
 int tsc_reliable = 0;
 
 struct tv_valid {
@@ -129,7 +133,9 @@ static void fio_init gtod_init(void)
 #ifdef CONFIG_CLOCK_GETTIME
 static int fill_clock_gettime(struct timespec *ts)
 {
-#ifdef CONFIG_CLOCK_MONOTONIC
+#if defined(CONFIG_CLOCK_MONOTONIC_RAW)
+       return clock_gettime(CLOCK_MONOTONIC_RAW, ts);
+#elif defined(CONFIG_CLOCK_MONOTONIC)
        return clock_gettime(CLOCK_MONOTONIC, ts);
 #else
        return clock_gettime(CLOCK_REALTIME, ts);
@@ -171,6 +177,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 +186,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
@@ -254,7 +262,7 @@ static unsigned long get_cycles_per_usec(void)
 static int calibrate_cpu_clock(void)
 {
        double delta, mean, S;
-       uint64_t avg, cycles[NR_TIME_ITERS];
+       uint64_t minc, maxc, avg, cycles[NR_TIME_ITERS];
        int i, samples;
 
        cycles[0] = get_cycles_per_usec();
@@ -277,10 +285,14 @@ static int calibrate_cpu_clock(void)
 
        S = sqrt(S / (NR_TIME_ITERS - 1.0));
 
-       samples = avg = 0;
+       minc = -1ULL;
+       maxc = samples = avg = 0;
        for (i = 0; i < NR_TIME_ITERS; i++) {
                double this = cycles[i];
 
+               minc = min(cycles[i], minc);
+               maxc = max(cycles[i], maxc);
+
                if ((fmax(this, mean) - fmin(this, mean)) > S)
                        continue;
                samples++;
@@ -296,15 +308,21 @@ static int calibrate_cpu_clock(void)
 
        avg /= samples;
        avg = (avg + 5) / 10;
+       minc /= 10;
+       maxc /= 10;
        dprint(FD_TIME, "avg: %llu\n", (unsigned long long) avg);
-       dprint(FD_TIME, "mean=%f, S=%f\n", mean, S);
+       dprint(FD_TIME, "min=%llu, max=%llu, mean=%f, S=%f\n",
+                       (unsigned long long) minc,
+                       (unsigned long long) maxc, mean, S);
 
        cycles_per_usec = avg;
        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
@@ -469,12 +487,20 @@ static void *clock_thread_fn(void *data)
        uint32_t last_seq;
        int i;
 
-       memset(&cpu_mask, 0, sizeof(cpu_mask));
+       if (fio_cpuset_init(&cpu_mask)) {
+               int __err = errno;
+
+               log_err("clock cpuset init failed: %s\n", strerror(__err));
+               goto err_out;
+       }
+
        fio_cpu_set(&cpu_mask, t->cpu);
 
        if (fio_setaffinity(gettid(), cpu_mask) == -1) {
-               log_err("clock setaffinity failed\n");
-               return (void *) 1;
+               int __err = errno;
+
+               log_err("clock setaffinity failed: %s\n", strerror(__err));
+               goto err;
        }
 
        pthread_mutex_lock(&t->lock);
@@ -510,9 +536,14 @@ static void *clock_thread_fn(void *data)
         * indefinitely. Check for that and return failure.
         */
        if (!t->entries[i - 1].tsc && !t->entries[0].tsc)
-               return (void *) 1;
+               goto err;
 
+       fio_cpuset_exit(&cpu_mask);
        return NULL;
+err:
+       fio_cpuset_exit(&cpu_mask);
+err_out:
+       return (void *) 1;
 }
 
 static int clock_cmp(const void *p1, const void *p2)
@@ -609,6 +640,8 @@ int fio_monotonic_clocktest(int debug)
 
        qsort(entries, tentries, sizeof(struct clock_entry), clock_cmp);
 
+       /* silence silly gcc */
+       prev = NULL;
        for (failed = i = 0; i < tentries; i++) {
                this = &entries[i];