- if (tv && t < tv->last_cycles) {
- dprint(FD_TIME, "CPU clock going back in time\n");
- t = tv->last_cycles;
- } else if (tv)
- tv->last_cycles = t;
-
- usecs = (t * inv_cycles_per_usec) / 16777216UL;
- tp->tv_sec = usecs / 1000000;
- tp->tv_usec = usecs % 1000000;
+#ifdef ARCH_CPU_CLOCK_WRAPS
+ if (t < cycles_start && !cycles_wrap)
+ cycles_wrap = 1;
+ else if (cycles_wrap && t >= cycles_start && !tv->warned) {
+ log_err("fio: double CPU clock wrap\n");
+ tv->warned = 1;
+ }
+
+ t -= cycles_start;
+#endif
+ tv->last_cycles = t;
+ tv->last_tv_valid = 1;
+#ifdef ARCH_CPU_CLOCK_CYCLES_PER_USEC
+ nsecs = t * 1000 / ARCH_CPU_CLOCK_CYCLES_PER_USEC;
+#else
+ if (t < max_cycles_for_mult)
+ nsecs = (t * inv_cycles_per_nsec) / NSEC_INV_FACTOR;
+ else
+ nsecs = (t / NSEC_INV_FACTOR) * inv_cycles_per_nsec;
+#endif
+ tp->tv_sec = nsecs / 1000000000ULL;
+ tp->tv_nsec = nsecs % 1000000000ULL;