X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=gettime.c;h=35d685e1576149974d5e77f18db2b1fb180f3a9e;hp=15356b1b9227c2b92f7676aae124664647f0e5d1;hb=49758e11f3658686ccd1c61724a5eba142f3ee4f;hpb=5bd9c78ce361e3a924013299c53fd823fba05818 diff --git a/gettime.c b/gettime.c index 15356b1b..35d685e1 100644 --- a/gettime.c +++ b/gettime.c @@ -19,11 +19,7 @@ static unsigned long last_cycles; static struct timeval last_tv; static int last_tv_valid; -static struct timeval *fio_tv; -int fio_gtod_offload = 0; -int fio_gtod_cpu = -1; - -enum fio_cs fio_clock_source = CS_GTOD; +enum fio_cs fio_clock_source = FIO_PREFERRED_CLOCK_SOURCE; #ifdef FIO_DEBUG_TIME @@ -266,13 +262,68 @@ void fio_clock_init(void) calibrate_cpu_clock(); } -void fio_gtod_init(void) +unsigned long long utime_since(struct timeval *s, struct timeval *e) +{ + long sec, usec; + unsigned long long ret; + + sec = e->tv_sec - s->tv_sec; + usec = e->tv_usec - s->tv_usec; + if (sec > 0 && usec < 0) { + sec--; + usec += 1000000; + } + + /* + * time warp bug on some kernels? + */ + if (sec < 0 || (sec == 0 && usec < 0)) + return 0; + + ret = sec * 1000000ULL + usec; + + return ret; +} + +unsigned long long utime_since_now(struct timeval *s) { - fio_tv = smalloc(sizeof(struct timeval)); - assert(fio_tv); + struct timeval t; + + fio_gettime(&t, NULL); + return utime_since(s, &t); +} + +unsigned long mtime_since(struct timeval *s, struct timeval *e) +{ + long sec, usec, ret; + + sec = e->tv_sec - s->tv_sec; + usec = e->tv_usec - s->tv_usec; + if (sec > 0 && usec < 0) { + sec--; + usec += 1000000; + } + + if (sec < 0 || (sec == 0 && usec < 0)) + return 0; + + sec *= 1000UL; + usec /= 1000UL; + ret = sec + usec; + + return ret; +} + +unsigned long mtime_since_now(struct timeval *s) +{ + struct timeval t; + void *p = __builtin_return_address(0); + + fio_gettime(&t, p); + return mtime_since(s, &t); } -void fio_gtod_update(void) +unsigned long time_since_now(struct timeval *s) { - gettimeofday(fio_tv, NULL); + return mtime_since_now(s) / 1000; }