X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.c;h=b8cba547ac931fcdf7ac0b3af79b7b19a7b8af75;hp=fcf3ae80c1fd5316c0ce121434eef2426b4471fe;hb=b67740d3620aee7c753987cdcf750fa28d871fcf;hpb=492158cf6a2e81886c43a6e696b17d7160ec5540 diff --git a/fio.c b/fio.c index fcf3ae80..b8cba547 100644 --- a/fio.c +++ b/fio.c @@ -446,6 +446,13 @@ static void do_io(struct thread_data *td) break; } + /* + * Add verification end_io handler, if asked to verify + * a previously written file. + */ + if (td->o.verify != VERIFY_NONE) + io_u->end_io = verify_io_u; + ret = td_io_queue(td, io_u); switch (ret) { case FIO_Q_COMPLETED: @@ -614,7 +621,6 @@ static void fill_io_buf(struct thread_data *td, struct io_u *io_u, int max_bs) static int init_io_u(struct thread_data *td) { - unsigned long long buf_size; struct io_u *io_u; unsigned int max_bs; int i, max_units; @@ -626,24 +632,24 @@ static int init_io_u(struct thread_data *td) max_units = td->o.iodepth; max_bs = max(td->o.max_bs[DDIR_READ], td->o.max_bs[DDIR_WRITE]); - buf_size = (unsigned long long) max_bs * (unsigned long long) max_units; - buf_size += page_mask; - if (buf_size != (size_t) buf_size) { - log_err("fio: IO memory too large. Reduce max_bs or iodepth\n"); - return 1; - } - - td->orig_buffer_size = buf_size; + td->orig_buffer_size = (unsigned long long) max_bs * (unsigned long long) max_units; if (td->o.mem_type == MEM_SHMHUGE || td->o.mem_type == MEM_MMAPHUGE) td->orig_buffer_size = (td->orig_buffer_size + td->o.hugepage_size - 1) & ~(td->o.hugepage_size - 1); - else if (td->orig_buffer_size & page_mask) - td->orig_buffer_size = (td->orig_buffer_size + page_mask) & ~page_mask; + + if (td->orig_buffer_size != (size_t) td->orig_buffer_size) { + log_err("fio: IO memory too large. Reduce max_bs or iodepth\n"); + return 1; + } if (allocate_io_mem(td)) return 1; - p = ALIGN(td->orig_buffer); + if (td->o.odirect) + p = ALIGN(td->orig_buffer); + else + p = td->orig_buffer; + for (i = 0; i < max_units; i++) { if (td->terminate) return 1; @@ -725,6 +731,8 @@ static int keep_running(struct thread_data *td) { unsigned long long io_done; + if (td->done) + return 0; if (td->o.time_based) return 1; if (td->o.loops) { @@ -732,7 +740,7 @@ static int keep_running(struct thread_data *td) return 1; } - io_done = td->io_bytes[DDIR_READ] + td->io_bytes[DDIR_WRITE]; + io_done = td->io_bytes[DDIR_READ] + td->io_bytes[DDIR_WRITE] + td->io_skip_bytes; if (io_done < td->o.size) return 1; @@ -754,7 +762,8 @@ static int clear_io_state(struct thread_data *td) td->last_was_sync = 0; - td->nr_done_files = 0; + if (td->o.time_based) + td->nr_done_files = 0; for_each_file(td, f, i) td_io_close_file(td, f); @@ -892,7 +901,8 @@ static void *thread_main(void *data) if (td->error || td->terminate) break; - if (td->o.verify == VERIFY_NONE) + if (td->o.verify == VERIFY_NONE || + (td->io_ops->flags & FIO_UNIDIR)) continue; if (clear_io_state(td)) @@ -909,8 +919,8 @@ static void *thread_main(void *data) } update_rusage_stat(td); - td->ts.runtime[0] = runtime[0] / 1000; - td->ts.runtime[1] = runtime[1] / 1000; + td->ts.runtime[0] = (runtime[0] + 999) / 1000; + td->ts.runtime[1] = (runtime[1] + 999) / 1000; td->ts.total_run_time = mtime_since_now(&td->epoch); td->ts.io_bytes[0] = td->io_bytes[0]; td->ts.io_bytes[1] = td->io_bytes[1]; @@ -921,8 +931,6 @@ static void *thread_main(void *data) finish_log(td, td->ts.slat_log, "slat"); if (td->ts.clat_log) finish_log(td, td->ts.clat_log, "clat"); - if (td->o.write_iolog_file) - write_iolog_close(td); if (td->o.exec_postrun) { if (system(td->o.exec_postrun) < 0) log_err("fio: postrun %s failed\n", td->o.exec_postrun); @@ -937,6 +945,13 @@ err: close_files(td); close_ioengine(td); cleanup_io_u(td); + + /* + * do this very late, it will log file closing as well + */ + if (td->o.write_iolog_file) + write_iolog_close(td); + options_mem_free(td); td_set_runstate(td, TD_EXITED); return (void *) (unsigned long) td->error;