>> diff --git a/gettime.c b/gettime.c >> index 035d275..89f3e27 100644 >> --- a/gettime.c >> +++ b/gettime.c >> @@ -168,17 +168,23 @@ void fio_gettime(struct timeval *tp, void >> fio_unused *caller) >> } >> #ifdef ARCH_HAVE_CPU_CLOCK >> case CS_CPUCLOCK: { >> - unsigned long long usecs, t; >> + unsigned long long usecs, t, delta = 0; >> >> t = get_cpu_clock(); >> if (tv && t < tv->last_cycles) { >> dprint(FD_TIME, "CPU clock going back in time\n"); >> t = tv->last_cycles; >> - } else if (tv) >> + } else if (tv) { >> + if (tv->last_tv_valid) >> + delta = t - tv->last_cycles; >> tv->last_cycles = t; >> + } >> >> usecs = t / cycles_per_usec; >> - tp->tv_sec = usecs / 1000000; >> + if (delta && delta < 1000000) >> + tp->tv_sec = tv->last_tv.tv_sec; >> + else >> + tp->tv_sec = usecs / 1000000; >> tp->tv_usec = usecs % 1000000; >> break; >> } > > I was thinking about this... Is it actually guarenteed to work. If > tv->last_tv.tv_usec is eg 900,000, you'd only need a 100k usec diff to > need to wrap, not 1000k. And since this is about avoiding costly divs, > since we know the number of cycles last time, it might make more sense > to just do the single div to go from cycles to usecs, then add that to > the tv->last_tv. > Something like this might work, though that amount of logic may be equivalent in terms of cycles to the divide. diff --git a/gettime.c b/gettime.c index 035d275..955a0a1 100644 --- a/gettime.c +++ b/gettime.c @@ -168,18 +168,25 @@ void fio_gettime(struct timeval *tp, void fio_unused *caller) } #ifdef ARCH_HAVE_CPU_CLOCK case CS_CPUCLOCK: { - unsigned long long usecs, t; + unsigned long long usecs, t, delta = 0; t = get_cpu_clock(); if (tv && t < tv->last_cycles) { dprint(FD_TIME, "CPU clock going back in time\n"); t = tv->last_cycles; - } else if (tv) + } else if (tv) { + if (tv->last_tv_valid) + delta = t - tv->last_cycles; tv->last_cycles = t; + } usecs = t / cycles_per_usec; - tp->tv_sec = usecs / 1000000; tp->tv_usec = usecs % 1000000; + if (delta && delta < 1000000 && + tv->last_tv.tv_usec < tp->tv_usec) + tp->tv_sec = tv->last_tv.tv_sec; + else + tp->tv_sec = usecs / 1000000; break; } #endif -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html