clock: hardwire tsc as unreliable on Solaris for now
[fio.git] / gettime.c
index e60d3e20ee492ee96c628e671951ada7e67c1b0b..5c0e44576f2b3392fd0c982b2ee35a95c06cec3a 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);
 
@@ -265,7 +265,7 @@ static unsigned long get_cycles_per_usec(void)
 static void 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();
@@ -342,6 +342,14 @@ void fio_clock_init(void)
                log_err("fio: can't create TLS key\n");
 #endif
 
+       /*
+        * Probably an AMD issue, will need to investigate. Until that
+        * is done, disable the CPU clock.
+        */
+#if FIO_OS == os_solaris
+       tsc_reliable = 0;
+#endif
+
        fio_clock_source_inited = fio_clock_source;
        calibrate_cpu_clock();
 
@@ -429,9 +437,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 {
@@ -504,6 +512,8 @@ int fio_monotonic_clocktest(void)
        uint64_t seq = 0;
        int i;
 
+       log_info("cs: reliable_tsc: %s\n", tsc_reliable ? "yes" : "no");
+
        fio_debug |= 1U << FD_TIME;
        calibrate_cpu_clock();
        fio_debug &= ~(1U << FD_TIME);