X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=gettime-thread.c;h=86c2e2efdcdcd796bd280951b5f0170ebe5a8db8;hb=2d21a787e642c4ba3b043c7e07f29c98e0383beb;hp=eb535a07cf041250064decdeb1cc9d74f1252703;hpb=ec2ea18e87fad6c42d6875cd4ee1bb25ef9b4627;p=fio.git diff --git a/gettime-thread.c b/gettime-thread.c index eb535a07..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; @@ -15,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 { @@ -57,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; }