From 26251d8d635bc9b9d31de2427095684b0c87b836 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 11 Mar 2014 10:21:18 -0600 Subject: [PATCH] Try a little harder to honor number_ios more accurately Previously, fio checked this on completion, which means we could almost spill over by the iodepth setting. Check this before issue instead, taking the in flight IOs into account as well. Reported-by: Robert Elliott Signed-off-by: Jens Axboe --- backend.c | 17 ++++++++++++++++- io_u.c | 3 --- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/backend.c b/backend.c index 992033c5..bab20266 100644 --- a/backend.c +++ b/backend.c @@ -625,6 +625,7 @@ reap: static int io_bytes_exceeded(struct thread_data *td) { + unsigned long long number_ios = 0; unsigned long long bytes; if (td_rw(td)) @@ -636,7 +637,13 @@ static int io_bytes_exceeded(struct thread_data *td) else bytes = td->this_io_bytes[DDIR_TRIM]; - return bytes >= td->o.size; + if (td->o.number_ios) { + number_ios = ddir_rw_sum(td->this_io_blocks); + number_ios += td->io_u_queued + td->io_u_in_flight; + } + + return bytes >= td->o.size || + (number_ios && number_ios >= td->o.number_ios); } /* @@ -1128,6 +1135,14 @@ static int keep_running(struct thread_data *td) return 1; } + if (td->o.number_ios) { + unsigned long long number_ios = ddir_rw_sum(td->this_io_blocks); + + number_ios += td->io_u_queued + td->io_u_in_flight; + if (number_ios >= td->o.number_ios) + return 0; + } + if (td->o.size != -1ULL && ddir_rw_sum(td->io_bytes) < td->o.size) { uint64_t diff; diff --git a/io_u.c b/io_u.c index 8e277087..0b86d9f3 100644 --- a/io_u.c +++ b/io_u.c @@ -1595,9 +1595,6 @@ static void account_io_completion(struct thread_data *td, struct io_u *io_u, if (!gtod_reduce(td)) add_iops_sample(td, idx, bytes, &icd->time); - - if (td->o.number_ios && !--td->o.number_ios) - td->done = 1; } static long long usec_for_io(struct thread_data *td, enum fio_ddir ddir) -- 2.25.1