X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=80df28548efba23f52652abab32926fc8dbcf65b;hp=56abe6fd598ef2d8ecb0c7565b9552e0755e2ad5;hb=4e8c82b4e9804c52bf2c78327cc5bfca9d8aedfc;hpb=d7e92306bde2117702ed96b7c5647d9485869047 diff --git a/io_u.c b/io_u.c index 56abe6fd..80df2854 100644 --- a/io_u.c +++ b/io_u.c @@ -557,10 +557,10 @@ static unsigned long long get_next_buflen(struct thread_data *td, struct io_u *i for (i = 0; i < td->o.bssplit_nr[ddir]; i++) { struct bssplit *bsp = &td->o.bssplit[ddir][i]; + if (!bsp->perc) + continue; buflen = bsp->bs; perc += bsp->perc; - if (!perc) - break; if ((r / perc <= frand_max / 100ULL) && io_u_fits(td, io_u, buflen)) break; @@ -570,8 +570,10 @@ static unsigned long long get_next_buflen(struct thread_data *td, struct io_u *i power_2 = is_power_of_2(minbs); if (!td->o.bs_unaligned && power_2) buflen &= ~(minbs - 1); - else if (!td->o.bs_unaligned && !power_2) - buflen -= buflen % minbs; + else if (!td->o.bs_unaligned && !power_2) + buflen -= buflen % minbs; + if (buflen > maxbs) + buflen = maxbs; } while (!io_u_fits(td, io_u, buflen)); return buflen; @@ -604,7 +606,7 @@ static inline enum fio_ddir get_rand_ddir(struct thread_data *td) int io_u_quiesce(struct thread_data *td) { - int completed = 0; + int ret = 0, completed = 0; /* * We are going to sleep, ensure that we flush anything pending as @@ -619,17 +621,20 @@ int io_u_quiesce(struct thread_data *td) td_io_commit(td); while (td->io_u_in_flight) { - int ret; - ret = io_u_queued_complete(td, 1); if (ret > 0) completed += ret; + else if (ret < 0) + break; } if (td->flags & TD_F_REGROW_LOGS) regrow_logs(td); - return completed; + if (completed) + return completed; + + return ret; } static enum fio_ddir rate_ddir(struct thread_data *td, enum fio_ddir ddir) @@ -770,10 +775,7 @@ void put_io_u(struct thread_data *td, struct io_u *io_u) { const bool needs_lock = td_async_processing(td); - if (io_u->post_submit) { - io_u->post_submit(io_u, io_u->error == 0); - io_u->post_submit = NULL; - } + zbd_put_io_u(io_u); if (td->parent) td = td->parent; @@ -1335,10 +1337,7 @@ static long set_io_u_file(struct thread_data *td, struct io_u *io_u) if (!fill_io_u(td, io_u)) break; - if (io_u->post_submit) { - io_u->post_submit(io_u, false); - io_u->post_submit = NULL; - } + zbd_put_io_u(io_u); put_file_log(td, f); td_io_close_file(td, f); @@ -1556,7 +1555,8 @@ again: assert(!(td->flags & TD_F_CHILD)); ret = pthread_cond_wait(&td->free_cond, &td->io_u_lock); assert(ret == 0); - goto again; + if (!td->error) + goto again; } if (needs_lock)