static int get_off_from_method(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir, uint64_t *b) { if (td->o.random_distribution == FIO_RAND_DIST_RANDOM) return __get_next_rand_offset(td, f, ddir, b); else if (td->o.random_distribution == FIO_RAND_DIST_ZIPF) return __get_next_rand_offset_zipf(td, f, ddir, b); else if (td->o.random_distribution == FIO_RAND_DIST_PARETO) return __get_next_rand_offset_pareto(td, f, ddir, b); log_err("fio: unknown random distribution: %d\n", td->o.random_distribution); return 1; }
static int get_off_from_method(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; lastb = last_block(td, f, ddir); if (!lastb) return 1; return __get_next_rand_offset(td, f, ddir, b, lastb); } else if (td->o.random_distribution == FIO_RAND_DIST_ZIPF) return __get_next_rand_offset_zipf(td, f, ddir, b); else if (td->o.random_distribution == FIO_RAND_DIST_PARETO) return __get_next_rand_offset_pareto(td, f, ddir, b); else if (td->o.random_distribution == FIO_RAND_DIST_GAUSS) return __get_next_rand_offset_gauss(td, f, ddir, b); else if (td->o.random_distribution == FIO_RAND_DIST_ZONED) return __get_next_rand_offset_zoned(td, f, ddir, b); log_err("fio: unknown random distribution: %d\n", td->o.random_distribution); return 1; }
static int __get_next_rand_offset_zoned(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir, uint64_t *b) { unsigned int v, send, stotal; uint64_t offset, lastb; static int warned; struct zone_split_index *zsi; lastb = last_block(td, f, ddir); if (!lastb) return 1; if (!td->o.zone_split_nr[ddir]) { bail: return __get_next_rand_offset(td, f, ddir, b, lastb); } /* * Generate a value, v, between 1 and 100, both inclusive */ v = rand32_between(&td->zone_state, 1, 100); zsi = &td->zone_state_index[ddir][v - 1]; stotal = zsi->size_perc_prev; send = zsi->size_perc; /* * Should never happen */ if (send == -1U) { if (!warned) { log_err("fio: bug in zoned generation\n"); warned = 1; } goto bail; } /* * 'send' is some percentage below or equal to 100 that * marks the end of the current IO range. 'stotal' marks * the start, in percent. */ if (stotal) offset = stotal * lastb / 100ULL; else offset = 0; lastb = lastb * (send - stotal) / 100ULL; /* * Generate index from 0..send-of-lastb */ if (__get_next_rand_offset(td, f, ddir, b, lastb) == 1) return 1; /* * Add our start offset, if any */ if (offset) *b += offset; return 0; }