The following changes since commit bfca2c74b53e499acd8e97e9e56d3c40a5dd8b4f: init: update email address (2014-01-29 16:39:04 -0700) are available in the git repository at: git://git.kernel.dk/fio.git master for you to fetch changes up to 78a6469cfc9094763320e61c60f9aaef0ece9689: More precise fix for verify_backlog verification failure (2014-02-05 13:15:22 -0700) ---------------------------------------------------------------- Jens Axboe (2): Fix for prematurely stopping on verify More precise fix for verify_backlog verification failure Puthikorn Voravootivat (2): Fix rand_seed mismatches in verify phase Fix verify_backlog start verification before finish writing Stefan Hajnoczi (2): init: --minimal does not take an optional argument init: log error on missing --output-format argument backend.c | 32 ++++++++++++++++++++++++++++++-- init.c | 8 +++++++- io_u.c | 7 ++++++- iolog.c | 2 +- verify.c | 17 +++++++++++++++-- 5 files changed, 59 insertions(+), 7 deletions(-) --- Diff of recent changes: diff --git a/backend.c b/backend.c index 93e6632..62fa17c 100644 --- a/backend.c +++ b/backend.c @@ -642,7 +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; + uint64_t total_bytes, bytes_issued = 0; if (in_ramp_time(td)) td_set_runstate(td, TD_RAMP); @@ -651,6 +651,16 @@ static uint64_t do_io(struct thread_data *td) lat_target_init(td); + /* + * If verify_backlog is enabled, we'll run the verify in this + * handler as well. For that case, we may need up to twice the + * amount of bytes. + */ + total_bytes = td->o.size; + if (td->o.verify != VERIFY_NONE && + (td_write(td) && td->o.verify_backlog)) + total_bytes += td->o.size; + while ((td->o.read_iolog_file && !flist_empty(&td->io_log_list)) || (!flist_empty(&td->trim_list)) || !io_bytes_exceeded(td) || td->o.time_based) { @@ -678,7 +688,7 @@ static uint64_t do_io(struct thread_data *td) if (flow_threshold_exceeded(td)) continue; - if (bytes_issued >= (uint64_t) td->o.size) + if (bytes_issued >= total_bytes) break; io_u = get_io_u(td); @@ -697,6 +707,13 @@ static uint64_t do_io(struct thread_data *td) */ if (td->o.verify != VERIFY_NONE && io_u->ddir == DDIR_READ && ((io_u->flags & IO_U_F_VER_LIST) || !td_rw(td))) { + + if (!td->o.verify_pattern_bytes) { + io_u->rand_seed = __rand(&td->__verify_state); + if (sizeof(int) != sizeof(long *)) + io_u->rand_seed *= __rand(&td->__verify_state); + } + if (td->o.verify_async) io_u->end_io = verify_io_u_async; else @@ -707,6 +724,17 @@ static uint64_t do_io(struct thread_data *td) else td_set_runstate(td, TD_RUNNING); + /* + * Verify_backlog disabled: We need to log rand seed before the + * actual IO to be able to replay it correctly in the verify phase. + */ + if (td_write(td) && io_u->ddir == DDIR_WRITE && + td->o.do_verify && + td->o.verify != VERIFY_NONE && + !td->o.experimental_verify && + !(td->flags & TD_F_VER_BACKLOG)) + log_io_piece(td, io_u); + ret = td_io_queue(td, io_u); switch (ret) { case FIO_Q_COMPLETED: diff --git a/init.c b/init.c index cc35e2b..6c48d3a 100644 --- a/init.c +++ b/init.c @@ -100,7 +100,7 @@ static struct option l_opts[FIO_NR_OPTIONS] = { }, { .name = (char *) "minimal", - .has_arg = optional_argument, + .has_arg = no_argument, .val = 'm' | FIO_CLIENT_FLAG, }, { @@ -1652,6 +1652,12 @@ int parse_cmd_line(int argc, char *argv[], int client_type) output_format = FIO_OUTPUT_TERSE; break; case 'F': + if (!optarg) { + log_err("fio: missing --output-format argument\n"); + exit_val = 1; + do_exit++; + break; + } if (!strcmp(optarg, "minimal") || !strcmp(optarg, "terse") || !strcmp(optarg, "csv")) diff --git a/io_u.c b/io_u.c index 518d884..4264cd5 100644 --- a/io_u.c +++ b/io_u.c @@ -1623,10 +1623,15 @@ static void io_completed(struct thread_data *td, struct io_u *io_u, utime_since_now(&td->start)); } + /* + * Verify_backlog enable: We need to log the write job after + * finishing it to prevent verifying before finish writing. + */ if (td_write(td) && idx == DDIR_WRITE && td->o.do_verify && td->o.verify != VERIFY_NONE && - !td->o.experimental_verify) + !td->o.experimental_verify && + (td->flags & TD_F_VER_BACKLOG)) log_io_piece(td, io_u); icd->bytes_done[idx] += bytes; diff --git a/iolog.c b/iolog.c index ec29971..017b235 100644 --- a/iolog.c +++ b/iolog.c @@ -209,7 +209,7 @@ void log_io_piece(struct thread_data *td, struct io_u *io_u) * drop the old one, which we rely on the rb insert/lookup for * handling. */ - if ((!td_random(td) || !td->o.overwrite) && + if (((!td->o.verifysort) || !td_random(td) || !td->o.overwrite) && (file_randommap(td, ipo->file) || td->o.verify == VERIFY_NONE)) { INIT_FLIST_HEAD(&ipo->list); flist_add_tail(&ipo->list, &td->io_hist_list); diff --git a/verify.c b/verify.c index 568bae8..90cd093 100644 --- a/verify.c +++ b/verify.c @@ -72,10 +72,10 @@ void fill_verify_pattern(struct thread_data *td, void *p, unsigned int len, if (use_seed) __fill_random_buf(p, len, seed); else - io_u->rand_seed = fill_random_buf(&td->buf_state, p, len); + io_u->rand_seed = fill_random_buf(&td->__verify_state, p, len); return; } - + if (io_u->buf_filled_len >= len) { dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n", td->o.verify_pattern_bytes, len); @@ -718,6 +718,13 @@ int verify_io_u(struct thread_data *td, struct io_u *io_u) memswp(p, p + td->o.verify_offset, header_size); hdr = p; + /* + * Make rand_seed check pass when have verifysort or + * verify_backlog. + */ + if (td->o.verifysort || (td->flags & TD_F_VER_BACKLOG)) + io_u->rand_seed = hdr->rand_seed; + ret = verify_header(io_u, hdr); switch (ret) { case 0: @@ -1056,6 +1063,12 @@ int get_next_verify(struct thread_data *td, struct io_u *io_u) remove_trim_entry(td, ipo); free(ipo); dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u); + + if (!td->o.verify_pattern_bytes) { + io_u->rand_seed = __rand(&td->__verify_state); + if (sizeof(int) != sizeof(long *)) + io_u->rand_seed *= __rand(&td->__verify_state); + } return 0; } -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html