X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=gettime.c;h=8991703fd0662fad4616ed8ab66f154f12c0ade9;hp=352c1d3d7611be0277d3e038d737c1465f9ec820;hb=c2acfbac7e9eb8ac5407ac024c0fd000614c77e2;hpb=4b91ee8fd12c72bd76ce9f5ff9116626b48566a0 diff --git a/gettime.c b/gettime.c index 352c1d3d..8991703f 100644 --- a/gettime.c +++ b/gettime.c @@ -25,7 +25,7 @@ struct tv_valid { int last_tv_valid; }; #ifdef CONFIG_TLS_THREAD -static struct tv_valid __thread static_tv_valid; +static __thread struct tv_valid static_tv_valid; #else static pthread_key_t tv_tls_key; #endif @@ -205,7 +205,7 @@ void fio_gettime(struct timeval *tp, void fio_unused *caller) gtod_log_caller(caller); #endif - if (fio_tv) { + if (fio_unlikely(fio_tv)) { memcpy(tp, fio_tv, sizeof(*tp)); return; } @@ -327,7 +327,7 @@ void fio_local_clock_init(int is_thread) { struct tv_valid *t; - t = calloc(sizeof(*t), 1); + t = calloc(1, sizeof(*t)); if (pthread_setspecific(tv_tls_key, t)) log_err("fio: can't set TLS key\n"); } @@ -441,9 +441,9 @@ uint64_t time_since_now(struct timeval *s) #define CLOCK_ENTRIES 100000 struct clock_entry { - uint64_t seq; + uint32_t seq; + uint32_t cpu; uint64_t tsc; - uint64_t cpu; }; struct clock_thread { @@ -451,11 +451,11 @@ struct clock_thread { int cpu; pthread_mutex_t lock; pthread_mutex_t started; - uint64_t *seq; + uint32_t *seq; struct clock_entry *entries; }; -static inline uint64_t atomic64_inc_return(uint64_t *seq) +static inline uint32_t atomic32_inc_return(uint32_t *seq) { return 1 + __sync_fetch_and_add(seq, 1); } @@ -465,6 +465,7 @@ static void *clock_thread_fn(void *data) struct clock_thread *t = data; struct clock_entry *c; os_cpu_mask_t cpu_mask; + uint32_t last_seq; int i; memset(&cpu_mask, 0, sizeof(cpu_mask)); @@ -478,13 +479,17 @@ static void *clock_thread_fn(void *data) pthread_mutex_lock(&t->lock); pthread_mutex_unlock(&t->started); + last_seq = 0; c = &t->entries[0]; for (i = 0; i < CLOCK_ENTRIES; i++, c++) { - uint64_t seq, tsc; + uint32_t seq; + uint64_t tsc; c->cpu = t->cpu; do { - seq = atomic64_inc_return(t->seq); + seq = atomic32_inc_return(t->seq); + if (seq < last_seq) + break; tsc = get_cpu_clock(); } while (seq != *t->seq); @@ -492,12 +497,14 @@ static void *clock_thread_fn(void *data) c->tsc = tsc; } - log_info("cs: cpu%3d: %lu clocks seen\n", t->cpu, t->entries[CLOCK_ENTRIES - 1].tsc - t->entries[0].tsc); + log_info("cs: cpu%3d: %llu clocks seen\n", t->cpu, + (unsigned long long) t->entries[i - 1].tsc - t->entries[0].tsc); + /* * The most common platform clock breakage is returning zero * indefinitely. Check for that and return failure. */ - if (!t->entries[CLOCK_ENTRIES - 1].tsc && !t->entries[0].tsc) + if (!t->entries[i - 1].tsc && !t->entries[0].tsc) return (void *) 1; return NULL; @@ -521,7 +528,7 @@ int fio_monotonic_clocktest(void) struct clock_entry *entries; unsigned long tentries, failed; struct clock_entry *prev, *this; - uint64_t seq = 0; + uint32_t seq = 0; int i; log_info("cs: reliable_tsc: %s\n", tsc_reliable ? "yes" : "no"); @@ -571,7 +578,7 @@ int fio_monotonic_clocktest(void) free(threads); if (failed) { - log_err("Clocksource test: %u threads failed\n", failed); + log_err("Clocksource test: %lu threads failed\n", failed); goto err; } @@ -588,9 +595,10 @@ int fio_monotonic_clocktest(void) if (prev->tsc > this->tsc) { uint64_t diff = prev->tsc - this->tsc; - log_info("cs: CPU clock mismatch (diff=%lu):\n", diff); - log_info("\t CPU%3lu: TSC=%lu, SEQ=%lu\n", prev->cpu, prev->tsc, prev->seq); - log_info("\t CPU%3lu: TSC=%lu, SEQ=%lu\n", this->cpu, this->tsc, this->seq); + log_info("cs: CPU clock mismatch (diff=%llu):\n", + (unsigned long long) diff); + log_info("\t CPU%3u: TSC=%llu, SEQ=%u\n", prev->cpu, (unsigned long long) prev->tsc, prev->seq); + log_info("\t CPU%3u: TSC=%llu, SEQ=%u\n", this->cpu, (unsigned long long) this->tsc, this->seq); failed++; }