[PATCH] fio: fix larger sleeps
authorJens Axboe <axboe@suse.de>
Wed, 23 Nov 2005 14:43:49 +0000 (15:43 +0100)
committerJens Axboe <axboe@suse.de>
Wed, 23 Nov 2005 14:43:49 +0000 (15:43 +0100)
fio.c

diff --git a/fio.c b/fio.c
index a840b6048ff9d59652c5d80a31461783c067ad74..8cec4c52a040e94cae57526342e49e0a80b07fed 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -327,24 +327,31 @@ static void __usec_sleep(int usec)
                nop;
 }
 
-static void usec_sleep(int usec)
+static void usec_sleep(struct thread_data *td, unsigned long usec)
 {
-       struct timespec req = { .tv_sec = 0, .tv_nsec = usec * 1000 };
-       struct timespec rem;
+       struct timespec req, rem;
+
+       req.tv_sec = usec / 1000000;
+       req.tv_nsec = usec * 1000 - req.tv_sec * 1000000;
 
        do {
                if (usec < 5000) {
                        __usec_sleep(usec);
                        break;
                }
+
                rem.tv_sec = rem.tv_nsec = 0;
-               nanosleep(&req, &rem);
-               if (!rem.tv_nsec)
+               if (nanosleep(&req, &rem) < 0)
+                       break;
+
+               if ((rem.tv_sec + rem.tv_nsec) == 0)
                        break;
 
                req.tv_nsec = rem.tv_nsec;
-               usec = rem.tv_nsec * 1000;
-       } while (1);
+               req.tv_sec = rem.tv_sec;
+
+               usec = rem.tv_sec * 1000000 + rem.tv_nsec / 1000;
+       } while (!td->terminate);
 }
 
 static void rate_throttle(struct thread_data *td, unsigned long time_spent,
@@ -362,7 +369,7 @@ static void rate_throttle(struct thread_data *td, unsigned long time_spent,
 
                td->rate_pending_usleep += s;
                if (td->rate_pending_usleep >= 100000) {
-                       usec_sleep(td->rate_pending_usleep);
+                       usec_sleep(td, td->rate_pending_usleep);
                        td->rate_pending_usleep = 0;
                }
        } else {
@@ -837,7 +844,7 @@ static void do_sync_io(struct thread_data *td)
                io_u = NULL;
 
                if (td->thinktime)
-                       usec_sleep(td->thinktime);
+                       usec_sleep(td, td->thinktime);
 
                if (should_fsync(td) && td->fsync_blocks &&
                    (td->io_blocks % td->fsync_blocks) == 0)
@@ -1098,7 +1105,7 @@ static void do_async_io(struct thread_data *td)
                        break;
 
                if (td->thinktime)
-                       usec_sleep(td->thinktime);
+                       usec_sleep(td, td->thinktime);
 
                if (should_fsync(td) && td->fsync_blocks &&
                    (td->io_blocks % td->fsync_blocks) == 0)