X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=rate-submit.c;fp=rate-submit.c;h=b07a207273b9d68223f506e4fb0b3f824d999fbd;hp=e5c6204351db00304db32fa376837faa9c420cc9;hb=d28174f0189cd862bc7480e5dc8314fd8257ffd2;hpb=0943e13c80b404e0c8a11ad21d7d8ca84ba5fd3e diff --git a/rate-submit.c b/rate-submit.c index e5c62043..b07a2072 100644 --- a/rate-submit.c +++ b/rate-submit.c @@ -53,7 +53,7 @@ static int io_workqueue_fn(struct submit_worker *sw, struct io_u *io_u = container_of(work, struct io_u, work); const enum fio_ddir ddir = io_u->ddir; struct thread_data *td = sw->priv; - int ret; + int ret, error; if (td->o.serialize_overlap) check_overlap(io_u); @@ -71,12 +71,14 @@ static int io_workqueue_fn(struct submit_worker *sw, ret = io_u_queued_complete(td, 1); if (ret > 0) td->cur_depth -= ret; + else if (ret < 0) + break; io_u_clear(td, io_u, IO_U_F_FLIGHT); } while (1); dprint(FD_RATE, "io_u %p ret %d by %u\n", io_u, ret, gettid()); - io_queue_event(td, io_u, &ret, ddir, NULL, 0, NULL); + error = io_queue_event(td, io_u, &ret, ddir, NULL, 0, NULL); if (ret == FIO_Q_COMPLETED) td->cur_depth--; @@ -93,6 +95,9 @@ static int io_workqueue_fn(struct submit_worker *sw, td->cur_depth -= ret; } + if (error || td->error) + pthread_cond_signal(&td->parent->free_cond); + return 0; } @@ -100,6 +105,8 @@ static bool io_workqueue_pre_sleep_flush_fn(struct submit_worker *sw) { struct thread_data *td = sw->priv; + if (td->error) + return false; if (td->io_u_queued || td->cur_depth || td->io_u_in_flight) return true;