X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=gettime-thread.c;h=86c2e2efdcdcd796bd280951b5f0170ebe5a8db8;hp=0a2cc6c451d533d1a5c56ce2ce857c85a7b31de2;hb=515418094c61cf135513a34651af6134a8794b5d;hpb=b2e6494cd9b2195d8df250444d750d10f61a12b5 diff --git a/gettime-thread.c b/gettime-thread.c index 0a2cc6c4..86c2e2ef 100644 --- a/gettime-thread.c +++ b/gettime-thread.c @@ -2,9 +2,10 @@ #include #include "fio.h" +#include "lib/seqlock.h" #include "smalloc.h" -struct timespec *fio_ts = NULL; +struct fio_ts *fio_ts; int fio_gtod_offload = 0; static pthread_t gtod_thread; static os_cpu_mask_t fio_gtod_cpumask; @@ -19,15 +20,17 @@ void fio_gtod_init(void) static void fio_gtod_update(void) { - if (fio_ts) { - struct timeval __tv; - - gettimeofday(&__tv, NULL); - fio_ts->tv_sec = __tv.tv_sec; - write_barrier(); - fio_ts->tv_nsec = __tv.tv_usec * 1000; - write_barrier(); - } + struct timeval __tv; + + if (!fio_ts) + return; + + gettimeofday(&__tv, NULL); + + write_seqlock_begin(&fio_ts->seqlock); + fio_ts->ts.tv_sec = __tv.tv_sec; + fio_ts->ts.tv_nsec = __tv.tv_usec * 1000; + write_seqlock_end(&fio_ts->seqlock); } struct gtod_cpu_data { @@ -55,7 +58,7 @@ static void *gtod_thread_main(void *data) * 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) { + while (nr_segments) { fio_gtod_update(); nop; }