X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=backend.c;h=bd94078ad5104a52a009694176ce7f2646d75bab;hp=c9875f480c726ec814ed916d02491a4dce442faf;hb=518a1cf0f5a201843197c1e2aa860008a9a58e88;hpb=b06c3ffa6de4fec544c8788803c56c6c4e916347 diff --git a/backend.c b/backend.c index c9875f48..bd94078a 100644 --- a/backend.c +++ b/backend.c @@ -808,12 +808,15 @@ static long long usec_for_io(struct thread_data *td, enum fio_ddir ddir) * * Returns number of bytes written and trimmed. */ -static uint64_t do_io(struct thread_data *td) +static void do_io(struct thread_data *td, uint64_t *bytes_done) { unsigned int i; int ret = 0; uint64_t total_bytes, bytes_issued = 0; + for (i = 0; i < DDIR_RWDIR_CNT; i++) + bytes_done[i] = td->bytes_done[i]; + if (in_ramp_time(td)) td_set_runstate(td, TD_RAMP); else @@ -1046,7 +1049,8 @@ reap: if (!ddir_rw_sum(td->this_io_bytes)) td->done = 1; - return td->bytes_done[DDIR_WRITE] + td->bytes_done[DDIR_TRIM]; + for (i = 0; i < DDIR_RWDIR_CNT; i++) + bytes_done[i] = td->bytes_done[i] - bytes_done[i]; } static void cleanup_io_u(struct thread_data *td) @@ -1598,9 +1602,17 @@ static void *thread_main(void *data) if (td->o.verify_only && (td_write(td) || td_rw(td))) verify_bytes = do_dry_run(td); else { - verify_bytes = do_io(td); - if (!verify_bytes) + uint64_t bytes_done[DDIR_RWDIR_CNT]; + + do_io(td, bytes_done); + + if (!ddir_rw_sum(bytes_done)) { fio_mark_td_terminate(td); + verify_bytes = 0; + } else { + verify_bytes = bytes_done[DDIR_WRITE] + + bytes_done[DDIR_TRIM]; + } } clear_state = 1; @@ -1966,6 +1978,32 @@ mounted: return true; } +static bool waitee_running(struct thread_data *me) +{ + const char *waitee = me->o.wait_for; + const char *self = me->o.name; + struct thread_data *td; + int i; + + if (!waitee) + return false; + + for_each_td(td, i) { + if (!strcmp(td->o.name, self) || strcmp(td->o.name, waitee)) + continue; + + if (td->runstate < TD_EXITED) { + dprint(FD_PROCESS, "%s fenced by %s(%s)\n", + self, td->o.name, + runstate_to_name(td->runstate)); + return true; + } + } + + dprint(FD_PROCESS, "%s: %s completed, can run\n", self, waitee); + return false; +} + /* * Main function for kicking off and reaping jobs, as needed. */ @@ -2089,6 +2127,12 @@ reap: break; } + if (waitee_running(td)) { + dprint(FD_PROCESS, "%s: waiting for %s\n", + td->o.name, td->o.wait_for); + continue; + } + init_disk_util(td); td->rusage_sem = fio_mutex_init(FIO_MUTEX_LOCKED);