From: Jens Axboe Date: Wed, 23 Nov 2005 14:43:49 +0000 (+0100) Subject: [PATCH] fio: fix larger sleeps X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=d15c51952b1aaa1148c129b05f686c456fa430d5;p=disktools.git [PATCH] fio: fix larger sleeps --- diff --git a/fio.c b/fio.c index a840b60..8cec4c5 100644 --- 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)