X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=gettime.c;h=2037354d0116a122ffb9b698c55b7b9aacbce86b;hp=15356b1b9227c2b92f7676aae124664647f0e5d1;hb=783a3eb15f143d26eed5fd1c943f238057f3ee52;hpb=5bd9c78ce361e3a924013299c53fd823fba05818 diff --git a/gettime.c b/gettime.c index 15356b1b..2037354d 100644 --- a/gettime.c +++ b/gettime.c @@ -22,6 +22,7 @@ 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; @@ -276,3 +277,56 @@ void fio_gtod_update(void) { gettimeofday(fio_tv, NULL); } + +static void *gtod_thread_main(void *data) +{ + struct fio_mutex *mutex = data; + + 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; + } + + return NULL; +} + +int fio_start_gtod_thread(void) +{ + 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; + } + + ret = pthread_detach(gtod_thread); + if (ret) { + log_err("Can't detatch gtod thread: %s\n", strerror(ret)); + goto err; + } + + 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; +}