X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=backend.c;h=3430e6612d4312740f31045d6ebf6ff4ff96950b;hb=1e564979edb07cf889ab160765e36a031990c2ad;hp=f1def38b36b7898865eff2d3c86b8a0ee0fc3eae;hpb=823952afda151688e8b509be4f4e09b4ac1efd75;p=fio.git diff --git a/backend.c b/backend.c index f1def38b..3430e661 100644 --- a/backend.c +++ b/backend.c @@ -565,6 +565,8 @@ static void do_verify(struct thread_data *td, uint64_t verify_bytes) io_u->end_io = verify_io_u; ddir = io_u->ddir; + if (!td->o.disable_slat) + fio_gettime(&io_u->start_time, NULL); ret = td_io_queue(td, io_u); switch (ret) { @@ -662,7 +664,28 @@ static unsigned int exceeds_number_ios(struct thread_data *td) return number_ios >= td->o.number_ios; } -static int io_bytes_exceeded(struct thread_data *td) +static int io_issue_bytes_exceeded(struct thread_data *td) +{ + unsigned long long bytes, limit; + + if (td_rw(td)) + bytes = td->io_issue_bytes[DDIR_READ] + td->io_issue_bytes[DDIR_WRITE]; + else if (td_write(td)) + bytes = td->io_issue_bytes[DDIR_WRITE]; + else if (td_read(td)) + bytes = td->io_issue_bytes[DDIR_READ]; + else + bytes = td->io_issue_bytes[DDIR_TRIM]; + + if (td->o.io_limit) + limit = td->o.io_limit; + else + limit = td->o.size; + + return bytes >= limit || exceeds_number_ios(td); +} + +static int io_complete_bytes_exceeded(struct thread_data *td) { unsigned long long bytes, limit; @@ -703,18 +726,24 @@ static uint64_t do_io(struct thread_data *td) lat_target_init(td); + total_bytes = td->o.size; + /* + * Allow random overwrite workloads to write up to io_limit + * before starting verification phase as 'size' doesn't apply. + */ + if (td_write(td) && td_random(td) && td->o.norandommap) + total_bytes = max(total_bytes, (uint64_t) td->o.io_limit); /* * 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) || + (!flist_empty(&td->trim_list)) || !io_issue_bytes_exceeded(td) || td->o.time_based) { struct timeval comp_time; struct io_u *io_u; @@ -1231,7 +1260,7 @@ static uint64_t do_dry_run(struct thread_data *td) td_set_runstate(td, TD_RUNNING); while ((td->o.read_iolog_file && !flist_empty(&td->io_log_list)) || - (!flist_empty(&td->trim_list)) || !io_bytes_exceeded(td)) { + (!flist_empty(&td->trim_list)) || !io_complete_bytes_exceeded(td)) { struct io_u *io_u; int ret; @@ -2109,6 +2138,7 @@ static void *helper_thread_main(void *data) gettimeofday(&tv, NULL); ts.tv_sec = tv.tv_sec + sec; ts.tv_nsec = (tv.tv_usec * 1000) + nsec; + if (ts.tv_nsec >= 1000000000ULL) { ts.tv_nsec -= 1000000000ULL; ts.tv_sec++;