X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=backend.c;h=2ec478c1ac206ebf4163a2e854fb77002dba2366;hb=d01612f3ae2515eb035d0c4ce954d8cb167a0a61;hp=c2fa34ccc7731fb3c11c280d7f887c00cd6e36d0;hpb=8d271b66d2bc1025f760d3c5a976dac42262a178;p=fio.git diff --git a/backend.c b/backend.c index c2fa34cc..2ec478c1 100644 --- a/backend.c +++ b/backend.c @@ -642,6 +642,7 @@ static uint64_t do_io(struct thread_data *td) uint64_t bytes_done[DDIR_RWDIR_CNT] = { 0, 0, 0 }; unsigned int i; int ret = 0; + uint64_t bytes_issued = 0; if (in_ramp_time(td)) td_set_runstate(td, TD_RAMP); @@ -675,6 +676,9 @@ static uint64_t do_io(struct thread_data *td) if (flow_threshold_exceeded(td)) continue; + if (bytes_issued >= (uint64_t) td->o.size) + break; + io_u = get_io_u(td); if (!io_u) break; @@ -708,6 +712,7 @@ static uint64_t do_io(struct thread_data *td) int bytes = io_u->xfer_buflen - io_u->resid; struct fio_file *f = io_u->file; + bytes_issued += bytes; /* * zero read, fail */ @@ -738,6 +743,7 @@ sync_done: ret = io_u_sync_complete(td, io_u, bytes_done); if (ret < 0) break; + bytes_issued += io_u->xfer_buflen; } break; case FIO_Q_QUEUED: @@ -748,6 +754,7 @@ sync_done: */ if (td->io_ops->commit == NULL) io_u_queued(td, io_u); + bytes_issued += io_u->xfer_buflen; break; case FIO_Q_BUSY: requeue_io_u(td, &io_u); @@ -919,7 +926,8 @@ static int init_io_u(struct thread_data *td) * overflow later. this adjustment may be too much if we get * lucky and the allocator gives us an aligned address. */ - if (td->o.odirect || td->o.mem_align || (td->io_ops->flags & FIO_RAWIO)) + if (td->o.odirect || td->o.mem_align || td->o.oatomic || + (td->io_ops->flags & FIO_RAWIO)) td->orig_buffer_size += page_mask + td->o.mem_align; if (td->o.mem_type == MEM_SHMHUGE || td->o.mem_type == MEM_MMAPHUGE) { @@ -937,7 +945,7 @@ static int init_io_u(struct thread_data *td) if (data_xfer && allocate_io_mem(td)) return 1; - if (td->o.odirect || td->o.mem_align || + if (td->o.odirect || td->o.mem_align || td->o.oatomic || (td->io_ops->flags & FIO_RAWIO)) p = PAGE_ALIGN(td->orig_buffer) + td->o.mem_align; else @@ -1086,14 +1094,15 @@ static int keep_running(struct thread_data *td) return 0; } -static int exec_string(const char *string) +static int exec_string(struct thread_options *o, const char *string, const char *mode) { - int ret, newlen = strlen(string) + 1 + 2; + int ret, newlen = strlen(string) + strlen(o->name) + strlen(mode) + 9 + 1; char *str; str = malloc(newlen); - sprintf(str, "%s", string); + sprintf(str, "%s &> %s.%s.txt", string, o->name, mode); + log_info("%s : Saving output of %s in %s.%s.txt\n",o->name, mode, o->name, mode); ret = system(str); if (ret == -1) log_err("fio: exec of cmd <%s> failed\n", str); @@ -1121,6 +1130,11 @@ static void *thread_main(void *data) } else td->pid = gettid(); + /* + * fio_time_init() may not have been called yet if running as a server + */ + fio_time_init(); + fio_local_clock_init(o->use_thread); dprint(FD_PROCESS, "jobs pid=%d started\n", (int) td->pid); @@ -1274,7 +1288,7 @@ static void *thread_main(void *data) if (init_random_map(td)) goto err; - if (o->exec_prerun && exec_string(o->exec_prerun)) + if (o->exec_prerun && exec_string(o, o->exec_prerun, (const char *)"prerun")) goto err; if (o->pre_read) { @@ -1397,7 +1411,7 @@ static void *thread_main(void *data) fio_mutex_up(writeout_mutex); if (o->exec_postrun) - exec_string(o->exec_postrun); + exec_string(o, o->exec_postrun, (const char *)"postrun"); if (exitall_on_terminate) fio_terminate_threads(td->groupid); @@ -1582,7 +1596,7 @@ static void run_threads(void) if (fio_gtod_offload && fio_start_gtod_thread()) return; - + fio_idle_prof_init(); set_sig_handlers();