X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=f6efae056ec0cff552f2ac038cb770ad8ea948aa;hp=dcf7a40562531af0a55cd56ddb7d02a00527bdd6;hb=ae4860fd0ad92a16f488302027f5e1992b41bc13;hpb=c22825bb537af1f84a18dcb4af6d8c6844f751ac diff --git a/io_u.c b/io_u.c index dcf7a405..f6efae05 100644 --- a/io_u.c +++ b/io_u.c @@ -62,6 +62,7 @@ static uint64_t last_block(struct thread_data *td, struct fio_file *f, /* * Hmm, should we make sure that ->io_size <= ->real_file_size? + * -> not for now since there is code assuming it could go either. */ max_size = f->io_size; if (max_size > f->real_file_size) @@ -531,8 +532,7 @@ static unsigned int __get_next_buflen(struct thread_data *td, struct io_u *io_u, int ddir = io_u->ddir; unsigned int buflen = 0; unsigned int minbs, maxbs; - uint64_t frand_max; - unsigned long r; + uint64_t frand_max, r; assert(ddir_rw(ddir)); @@ -561,7 +561,7 @@ static unsigned int __get_next_buflen(struct thread_data *td, struct io_u *io_u, if (buflen < minbs) buflen = minbs; } else { - long perc = 0; + long long perc = 0; unsigned int i; for (i = 0; i < td->o.bssplit_nr[ddir]; i++) { @@ -569,16 +569,14 @@ static unsigned int __get_next_buflen(struct thread_data *td, struct io_u *io_u, buflen = bsp->bs; perc += bsp->perc; - if ((r * 100UL <= frand_max * perc) && + if (!perc) + break; + if ((r / perc <= frand_max / 100ULL) && io_u_fits(td, io_u, buflen)) break; } } - if (td->o.verify != VERIFY_NONE) - buflen = (buflen + td->o.verify_interval - 1) & - ~(td->o.verify_interval - 1); - if (!td->o.bs_unaligned && is_power_of_2(minbs)) buflen &= ~(minbs - 1); @@ -645,20 +643,24 @@ int io_u_quiesce(struct thread_data *td) } while (td->io_u_in_flight) { - int fio_unused ret; + int ret; ret = io_u_queued_complete(td, 1); if (ret > 0) completed += ret; } + if (td->flags & TD_F_REGROW_LOGS) + regrow_logs(td); + return completed; } static enum fio_ddir rate_ddir(struct thread_data *td, enum fio_ddir ddir) { enum fio_ddir odir = ddir ^ 1; - long usec, now; + long usec; + uint64_t now; assert(ddir_rw(ddir)); now = utime_since_now(&td->start); @@ -757,8 +759,10 @@ static enum fio_ddir get_rw_ddir(struct thread_data *td) ddir = DDIR_READ; else if (td_write(td)) ddir = DDIR_WRITE; - else + else if (td_trim(td)) ddir = DDIR_TRIM; + else + ddir = DDIR_INVAL; td->rwmix_ddir = rate_ddir(td, ddir); return td->rwmix_ddir; @@ -1510,7 +1514,7 @@ static bool check_get_trim(struct thread_data *td, struct io_u *io_u) get_trim = 1; } - if (get_trim && !get_next_trim(td, io_u)) + if (get_trim && get_next_trim(td, io_u)) return true; } @@ -1730,6 +1734,9 @@ static void account_io_completion(struct thread_data *td, struct io_u *io_u, if (td->parent) td = td->parent; + if (!td->o.stats) + return; + if (no_reduce) lusec = utime_since(&io_u->issue_time, &icd->time); @@ -1901,7 +1908,7 @@ static void init_icd(struct thread_data *td, struct io_completion_data *icd, icd->nr = nr; icd->error = 0; - for (ddir = DDIR_READ; ddir < DDIR_RWDIR_CNT; ddir++) + for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) icd->bytes_done[ddir] = 0; } @@ -1940,7 +1947,7 @@ int io_u_sync_complete(struct thread_data *td, struct io_u *io_u) return -1; } - for (ddir = DDIR_READ; ddir < DDIR_RWDIR_CNT; ddir++) + for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) td->bytes_done[ddir] += icd.bytes_done[ddir]; return 0; @@ -1956,7 +1963,7 @@ int io_u_queued_complete(struct thread_data *td, int min_evts) int ret, ddir; struct timespec ts = { .tv_sec = 0, .tv_nsec = 0, }; - dprint(FD_IO, "io_u_queued_completed: min=%d\n", min_evts); + dprint(FD_IO, "io_u_queued_complete: min=%d\n", min_evts); if (!min_evts) tvp = &ts; @@ -1979,7 +1986,7 @@ int io_u_queued_complete(struct thread_data *td, int min_evts) return -1; } - for (ddir = DDIR_READ; ddir < DDIR_RWDIR_CNT; ddir++) + for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) td->bytes_done[ddir] += icd.bytes_done[ddir]; return ret; @@ -1990,7 +1997,7 @@ int io_u_queued_complete(struct thread_data *td, int min_evts) */ void io_u_queued(struct thread_data *td, struct io_u *io_u) { - if (!td->o.disable_slat) { + if (!td->o.disable_slat && ramp_time_over(td) && td->o.stats) { unsigned long slat_time; slat_time = utime_since(&io_u->start_time, &io_u->issue_time);