From: Justin Eno Date: Wed, 28 Jan 2015 22:13:28 +0000 (-0800) Subject: Fix for verify_only (do_dry_run()) broken by 74d6277f X-Git-Tag: fio-2.2.6~17 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=e28dd2cfa734e26163532d24f1e06708cad659a6 Fix for verify_only (do_dry_run()) broken by 74d6277f Previous commit to backend.c tracks io_limit more closely by counting submitted (in-flight) I/O instead of completed I/O. do_dry_run() does not submit I/O, so its I/O is not counted, and it loops forever. Signed-off-by: Justin Eno Signed-off-by: Jens Axboe --- diff --git a/backend.c b/backend.c index 9012140d..7ec8d2a3 100644 --- a/backend.c +++ b/backend.c @@ -662,7 +662,7 @@ static unsigned int exceeds_number_ios(struct thread_data *td) return number_ios >= td->o.number_ios; } -static int io_bytes_exceeded(struct thread_data *td) +static int io_issue_bytes_exceeded(struct thread_data *td) { unsigned long long bytes, limit; @@ -683,6 +683,27 @@ static int io_bytes_exceeded(struct thread_data *td) return bytes >= limit || exceeds_number_ios(td); } +static int io_complete_bytes_exceeded(struct thread_data *td) +{ + unsigned long long bytes, limit; + + if (td_rw(td)) + bytes = td->this_io_bytes[DDIR_READ] + td->this_io_bytes[DDIR_WRITE]; + else if (td_write(td)) + bytes = td->this_io_bytes[DDIR_WRITE]; + else if (td_read(td)) + bytes = td->this_io_bytes[DDIR_READ]; + else + bytes = td->this_io_bytes[DDIR_TRIM]; + + if (td->o.io_limit) + limit = td->o.io_limit; + else + limit = td->o.size; + + return bytes >= limit || exceeds_number_ios(td); +} + /* * Main IO worker function. It retrieves io_u's to process and queues * and reaps them, checking for rate and errors along the way. @@ -714,7 +735,7 @@ static uint64_t do_io(struct thread_data *td) total_bytes += td->o.size; while ((td->o.read_iolog_file && !flist_empty(&td->io_log_list)) || - (!flist_empty(&td->trim_list)) || !io_bytes_exceeded(td) || + (!flist_empty(&td->trim_list)) || !io_issue_bytes_exceeded(td) || td->o.time_based) { struct timeval comp_time; struct io_u *io_u; @@ -1231,7 +1252,7 @@ static uint64_t do_dry_run(struct thread_data *td) td_set_runstate(td, TD_RUNNING); while ((td->o.read_iolog_file && !flist_empty(&td->io_log_list)) || - (!flist_empty(&td->trim_list)) || !io_bytes_exceeded(td)) { + (!flist_empty(&td->trim_list)) || !io_complete_bytes_exceeded(td)) { struct io_u *io_u; int ret;