From fd11d7afaecf030c6c9a4a9c6953037a2ff18353 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 8 Nov 2005 12:57:07 +0100 Subject: [PATCH] [PATCH] fio: improve timing on low number of usecs --- arch.h | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ fio.c | 71 +++++++++++++++++++++------------------------------------- 2 files changed, 89 insertions(+), 45 deletions(-) create mode 100644 arch.h diff --git a/arch.h b/arch.h new file mode 100644 index 0000000..08f8940 --- /dev/null +++ b/arch.h @@ -0,0 +1,63 @@ +#ifndef ARCH_H +#define ARCH_H + +/* + * assume we don't have _get either, if _set isn't defined + */ +#ifndef __NR_ioprio_set +#if defined(__i386__) +#define __NR_ioprio_set 289 +#define __NR_ioprio_get 290 +#elif defined(__powerpc__) || defined(__powerpc64__) +#define __NR_ioprio_set 273 +#define __NR_ioprio_get 274 +#elif defined(__x86_64__) +#define __NR_ioprio_set 251 +#define __NR_ioprio_get 252 +#elif defined(__ia64__) +#define __NR_ioprio_set 1274 +#define __NR_ioprio_get 1275 +#elif defined(__alpha__) +#define __NR_ioprio_set 442 +#define __NR_ioprio_get 443 +#elif defined(__s390x__) || defined(__s390__) +#define __NR_ioprio_set 282 +#define __NR_ioprio_get 283 +#else +#error "Unsupported arch" +#endif +#endif + +#ifndef __NR_fadvise64 +#if defined(__i386__) +#define __NR_fadvise64 250 +#elif defined(__powerpc__) || defined(__powerpc64__) +#define __NR_fadvise64 233 +#elif defined(__x86_64__) +#define __NR_fadvise64 221 +#elif defined(__ia64__) +#define __NR_fadvise64 1234 +#elif defined(__alpha__) +#define __NR_fadvise64 413 +#elif defined(__s390x__) || defined(__s390__) +#define __NR_fadvise64 253 +#else +#error "Unsupported arch" +#endif +#endif + +#if defined(__i386__) || defined(__x86_64) +#define nop __asm__ __volatile__("rep;nop": : :"memory") +#elif defined defined(__powerpc__) || defined(__powerpc64__) +#define nop do { } while (0) +#elif defined(__ia64__) +#define nop asm volatile ("hint @pause" ::: "memory"); +#elif defined(__alpha__) +#define nop do { } while (0) +#elif defined(__s390x__) || defined(__s390__) +#define nop asm volatile ("diag 0,0,68" : : : "memory") +#else +#error "Unsupported arch" +#endif + +#endif diff --git a/fio.c b/fio.c index 0e4f0f0..ef2459a 100644 --- a/fio.c +++ b/fio.c @@ -44,6 +44,7 @@ #include #include +#include "arch.h" #include "list.h" #include "md5.h" @@ -53,51 +54,6 @@ #define MAX_JOBS (1024) -/* - * assume we don't have _get either, if _set isn't defined - */ -#ifndef __NR_ioprio_set -#if defined(__i386__) -#define __NR_ioprio_set 289 -#define __NR_ioprio_get 290 -#elif defined(__powerpc__) || defined(__powerpc64__) -#define __NR_ioprio_set 273 -#define __NR_ioprio_get 274 -#elif defined(__x86_64__) -#define __NR_ioprio_set 251 -#define __NR_ioprio_get 252 -#elif defined(__ia64__) -#define __NR_ioprio_set 1274 -#define __NR_ioprio_get 1275 -#elif defined(__alpha__) -#define __NR_ioprio_set 442 -#define __NR_ioprio_get 443 -#elif defined(__s390x__) || defined(__s390__) -#define __NR_ioprio_set 282 -#define __NR_ioprio_get 283 -#else -#error "Unsupported arch" -#endif -#endif - -#ifndef __NR_fadvise64 -#if defined(__i386__) -#define __NR_fadvise64 250 -#elif defined(__powerpc__) || defined(__powerpc64__) -#define __NR_fadvise64 233 -#elif defined(__x86_64__) -#define __NR_fadvise64 221 -#elif defined(__ia64__) -#define __NR_fadvise64 1234 -#elif defined(__alpha__) -#define __NR_fadvise64 413 -#elif defined(__s390x__) || defined(__s390__) -#define __NR_fadvise64 253 -#else -#error "Unsupported arch" -#endif -#endif - static int ioprio_set(int which, int who, int ioprio) { return syscall(__NR_ioprio_set, which, who, ioprio); @@ -402,6 +358,14 @@ static unsigned long utime_since(struct timeval *s, struct timeval *e) return sec + usec; } +static unsigned long utime_since_now(struct timeval *s) +{ + struct timeval t; + + gettimeofday(&t, NULL); + return utime_since(s, &t); +} + static unsigned long mtime_since(struct timeval *s, struct timeval *e) { double sec, usec; @@ -588,18 +552,35 @@ static void add_bw_sample(struct thread_data *td) td->stat_io_bytes = td->this_io_bytes; } +/* + * busy looping version for the last few usec + */ +static void __usec_sleep(int usec) +{ + struct timeval start; + + gettimeofday(&start, NULL); + while (utime_since_now(&start) < usec) + __asm__ __volatile__("rep;nop": : :"memory"); +} + static void usec_sleep(int usec) { struct timespec req = { .tv_sec = 0, .tv_nsec = usec * 1000 }; struct timespec rem; do { + if (usec < 5000) { + __usec_sleep(usec); + break; + } rem.tv_sec = rem.tv_nsec = 0; nanosleep(&req, &rem); if (!rem.tv_nsec) break; req.tv_nsec = rem.tv_nsec; + usec = rem.tv_nsec * 1000; } while (1); } -- 2.25.1