X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=gettime-thread.c;h=86c2e2efdcdcd796bd280951b5f0170ebe5a8db8;hb=c9af088bc9f52b58c8ee68d96403b48c8da9964b;hp=87f50600cca01a78d25f53f167d7835212dde5cc;hpb=d3d378218e9e03411749b65451b32d7a7466ff61;p=fio.git diff --git a/gettime-thread.c b/gettime-thread.c index 87f50600..86c2e2ef 100644 --- a/gettime-thread.c +++ b/gettime-thread.c @@ -1,12 +1,11 @@ -#include -#include #include #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; @@ -17,21 +16,21 @@ void fio_gtod_init(void) return; fio_ts = smalloc(sizeof(*fio_ts)); - if (!fio_ts) - log_err("fio: smalloc pool exhausted\n"); } 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 { @@ -59,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; }