X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=580c414622db161fe78061413ac5bef6de7e0efb;hp=d4a65089a502ece5f28d58ef38ad84ae85def358;hb=c3dc516ad75eb7a1596def3473cdc3882a55d166;hpb=553f965256ab58b0e0958b0e367d8e63698f7a26 diff --git a/io_u.c b/io_u.c index d4a65089..580c4146 100644 --- a/io_u.c +++ b/io_u.c @@ -77,11 +77,6 @@ static uint64_t last_block(struct thread_data *td, struct fio_file *f, return max_blocks; } -struct rand_off { - struct flist_head list; - uint64_t off; -}; - static int __get_next_rand_offset(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir, uint64_t *b, uint64_t lastb) @@ -173,7 +168,7 @@ bail: /* * Generate a value, v, between 1 and 100, both inclusive */ - v = rand32_between(&td->zone_state, 1, 100); + v = rand_between(&td->zone_state, 1, 100); /* * Find our generated table. 'send' is the end block of this zone, @@ -230,7 +225,7 @@ bail: /* * Generate a value, v, between 1 and 100, both inclusive */ - v = rand32_between(&td->zone_state, 1, 100); + v = rand_between(&td->zone_state, 1, 100); zsi = &td->zone_state_index[ddir][v - 1]; stotal = zsi->size_perc_prev; @@ -272,16 +267,8 @@ bail: return 0; } -static int flist_cmp(void *data, struct flist_head *a, struct flist_head *b) -{ - struct rand_off *r1 = flist_entry(a, struct rand_off, list); - struct rand_off *r2 = flist_entry(b, struct rand_off, list); - - return r1->off - r2->off; -} - -static int get_off_from_method(struct thread_data *td, struct fio_file *f, - enum fio_ddir ddir, uint64_t *b) +static int get_next_rand_offset(struct thread_data *td, struct fio_file *f, + enum fio_ddir ddir, uint64_t *b) { if (td->o.random_distribution == FIO_RAND_DIST_RANDOM) { uint64_t lastb; @@ -306,25 +293,6 @@ static int get_off_from_method(struct thread_data *td, struct fio_file *f, return 1; } -/* - * Sort the reads for a verify phase in batches of verifysort_nr, if - * specified. - */ -static inline bool should_sort_io(struct thread_data *td) -{ - if (!td->o.verifysort_nr || !td->o.do_verify) - return false; - if (!td_random(td)) - return false; - if (td->runstate != TD_VERIFYING) - return false; - if (td->o.random_generator == FIO_RAND_GEN_TAUSWORTHE || - td->o.random_generator == FIO_RAND_GEN_TAUSWORTHE64) - return false; - - return true; -} - static bool should_do_random(struct thread_data *td, enum fio_ddir ddir) { unsigned int v; @@ -332,49 +300,11 @@ static bool should_do_random(struct thread_data *td, enum fio_ddir ddir) if (td->o.perc_rand[ddir] == 100) return true; - v = rand32_between(&td->seq_rand_state[ddir], 1, 100); + v = rand_between(&td->seq_rand_state[ddir], 1, 100); return v <= td->o.perc_rand[ddir]; } -static int get_next_rand_offset(struct thread_data *td, struct fio_file *f, - enum fio_ddir ddir, uint64_t *b) -{ - struct rand_off *r; - int i, ret = 1; - - if (!should_sort_io(td)) - return get_off_from_method(td, f, ddir, b); - - if (!flist_empty(&td->next_rand_list)) { -fetch: - r = flist_first_entry(&td->next_rand_list, struct rand_off, list); - flist_del(&r->list); - *b = r->off; - free(r); - return 0; - } - - for (i = 0; i < td->o.verifysort_nr; i++) { - r = malloc(sizeof(*r)); - - ret = get_off_from_method(td, f, ddir, &r->off); - if (ret) { - free(r); - break; - } - - flist_add(&r->list, &td->next_rand_list); - } - - if (ret && !i) - return ret; - - assert(!flist_empty(&td->next_rand_list)); - flist_sort(NULL, &td->next_rand_list, flist_cmp); - goto fetch; -} - static void loop_cache_invalidate(struct thread_data *td, struct fio_file *f) { struct thread_options *o = &td->o; @@ -395,9 +325,9 @@ static int get_next_rand_block(struct thread_data *td, struct fio_file *f, if (td->o.time_based || (td->o.file_service_type & __FIO_FSERVICE_NONUNIFORM)) { fio_file_reset(td, f); + loop_cache_invalidate(td, f); if (!get_next_rand_offset(td, f, ddir, b)) return 0; - loop_cache_invalidate(td, f); } dprint(FD_IO, "%s: rand offset failed, last=%llu, size=%llu\n", @@ -659,7 +589,7 @@ static inline enum fio_ddir get_rand_ddir(struct thread_data *td) { unsigned int v; - v = rand32_between(&td->rwmix_state, 1, 100); + v = rand_between(&td->rwmix_state, 1, 100); if (v <= td->o.rwmix[DDIR_READ]) return DDIR_READ; @@ -680,11 +610,8 @@ int io_u_quiesce(struct thread_data *td) * io's that have been actually submitted to an async engine, * and cur_depth is meaningless for sync engines. */ - if (td->io_u_queued || td->cur_depth) { - int fio_unused ret; - - ret = td_io_commit(td); - } + if (td->io_u_queued || td->cur_depth) + td_io_commit(td); while (td->io_u_in_flight) { int ret; @@ -1699,7 +1626,7 @@ static void small_content_scramble(struct io_u *io_u) /* * Return an io_u to be processed. Gets a buflen and offset, sets direction, - * etc. The returned io_u is fully ready to be prepped and submitted. + * etc. The returned io_u is fully ready to be prepped, populated and submitted. */ struct io_u *get_io_u(struct thread_data *td) { @@ -1760,12 +1687,9 @@ struct io_u *get_io_u(struct thread_data *td) td->o.min_bs[DDIR_WRITE], io_u->buflen); } else if ((td->flags & TD_F_SCRAMBLE_BUFFERS) && - !(td->flags & TD_F_COMPRESS)) + !(td->flags & TD_F_COMPRESS) && + !(td->flags & TD_F_DO_VERIFY)) do_scramble = 1; - if (td->flags & TD_F_DO_VERIFY) { - populate_verify_io_u(td, io_u); - do_scramble = 0; - } } else if (io_u->ddir == DDIR_READ) { /* * Reset the buf_filled parameters so next time if the @@ -2145,7 +2069,7 @@ static struct frand_state *get_buf_state(struct thread_data *td) return &td->buf_state; } - v = rand32_between(&td->dedupe_state, 1, 100); + v = rand_between(&td->dedupe_state, 1, 100); if (v <= td->o.dedupe_percentage) return &td->buf_state_prev;