X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=gettime.c;h=35d685e1576149974d5e77f18db2b1fb180f3a9e;hp=cf0d664030d2b2d82267b79e15ee53d04205bb0d;hb=49758e11f3658686ccd1c61724a5eba142f3ee4f;hpb=a73468166ef0a85d489dcdc291229a3d9ad9cfc1 diff --git a/gettime.c b/gettime.c index cf0d6640..35d685e1 100644 --- a/gettime.c +++ b/gettime.c @@ -19,12 +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; -static pthread_t gtod_thread; - -enum fio_cs fio_clock_source = CS_GTOD; +enum fio_cs fio_clock_source = FIO_PREFERRED_CLOCK_SOURCE; #ifdef FIO_DEBUG_TIME @@ -267,66 +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) { - fio_tv = smalloc(sizeof(struct timeval)); - assert(fio_tv); + 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; } -static void fio_gtod_update(void) +unsigned long long utime_since_now(struct timeval *s) { - gettimeofday(fio_tv, NULL); + struct timeval t; + + fio_gettime(&t, NULL); + return utime_since(s, &t); } -static void *gtod_thread_main(void *data) +unsigned long mtime_since(struct timeval *s, struct timeval *e) { - struct fio_mutex *mutex = data; + long sec, usec, ret; - fio_mutex_up(mutex); - - /* - * As long as we have jobs around, update the clock. It would be nice - * to have some way of NOT hammering that CPU with gettimeofday(), - * but I'm not sure what to use outside of a simple CPU nop to relax - * it - we don't want to lose precision. - */ - while (threads) { - fio_gtod_update(); - nop; + sec = e->tv_sec - s->tv_sec; + usec = e->tv_usec - s->tv_usec; + if (sec > 0 && usec < 0) { + sec--; + usec += 1000000; } - return NULL; + if (sec < 0 || (sec == 0 && usec < 0)) + return 0; + + sec *= 1000UL; + usec /= 1000UL; + ret = sec + usec; + + return ret; } -int fio_start_gtod_thread(void) +unsigned long mtime_since_now(struct timeval *s) { - struct fio_mutex *mutex; - pthread_attr_t attr; - int ret; - - mutex = fio_mutex_init(0); - if (!mutex) - return 1; - - pthread_attr_init(&attr); - pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); - ret = pthread_create(>od_thread, &attr, gtod_thread_main, NULL); - pthread_attr_destroy(&attr); - if (ret) { - log_err("Can't create gtod thread: %s\n", strerror(ret)); - goto err; - } + struct timeval t; + void *p = __builtin_return_address(0); - ret = pthread_detach(gtod_thread); - if (ret) { - log_err("Can't detatch gtod thread: %s\n", strerror(ret)); - goto err; - } + fio_gettime(&t, p); + return mtime_since(s, &t); +} - dprint(FD_MUTEX, "wait on startup_mutex\n"); - fio_mutex_down(mutex); - dprint(FD_MUTEX, "done waiting on startup_mutex\n"); -err: - fio_mutex_remove(mutex); - return ret; +unsigned long time_since_now(struct timeval *s) +{ + return mtime_since_now(s) / 1000; }