[PATCH] fio: improve timing on low number of usecs
authorJens Axboe <axboe@suse.de>
Tue, 8 Nov 2005 11:57:07 +0000 (12:57 +0100)
committerJens Axboe <axboe@suse.de>
Tue, 8 Nov 2005 11:57:07 +0000 (12:57 +0100)
arch.h [new file with mode: 0644]
fio.c

diff --git a/arch.h b/arch.h
new file mode 100644 (file)
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 0e4f0f067cf1779acc20d36ce2ec86819f6a0bab..ef2459a985db2ca05dbd8e238d6ee0ce985ca850 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -44,6 +44,7 @@
 #include <asm/types.h>
 #include <asm/bitops.h>
 
+#include "arch.h"
 #include "list.h"
 #include "md5.h"
 
 
 #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);
 }