From: Vincent Fu Date: Fri, 24 Mar 2023 17:47:14 +0000 (+0000) Subject: init: refactor random seed setting X-Git-Tag: fio-3.35~34 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=ab3c4e7868980f91439a1fe888b0f13b27f3cd42;p=fio.git init: refactor random seed setting td->rand_seed was modified in three different places. Put all this code in setup_random_seeds() to make it easier to understand and more maintanable. Also put setup_random_seeds() next to the other random-seed-related functions in init.c. init_rand_seed() was called in three different places for fio's main random number generators. Also put these three sets of invocations in the same place. Always initialize all of fio's main set of random states instead of skipping some for sequential workloads. This makes debugging easier. No functional change. Signed-off-by: Vincent Fu --- diff --git a/fio.h b/fio.h index 6b841e9c..6fc7fb9c 100644 --- a/fio.h +++ b/fio.h @@ -638,7 +638,6 @@ extern void fio_options_dup_and_init(struct option *); extern char *fio_option_dup_subs(const char *); extern void fio_options_mem_dupe(struct thread_data *); extern void td_fill_rand_seeds(struct thread_data *); -extern void td_fill_verify_state_seed(struct thread_data *); extern void add_job_opts(const char **, int); extern int ioengine_load(struct thread_data *); extern bool parse_dryrun(void); diff --git a/init.c b/init.c index 1c8df1a7..e020d452 100644 --- a/init.c +++ b/init.c @@ -1020,19 +1020,6 @@ static void init_rand_file_service(struct thread_data *td) } } -void td_fill_verify_state_seed(struct thread_data *td) -{ - bool use64; - - if (td->o.random_generator == FIO_RAND_GEN_TAUSWORTHE64) - use64 = true; - else - use64 = false; - - init_rand_seed(&td->verify_state, td->rand_seeds[FIO_RAND_VER_OFF], - use64); -} - static void td_fill_rand_seeds_internal(struct thread_data *td, bool use64) { uint64_t read_seed = td->rand_seeds[FIO_RAND_BS_OFF]; @@ -1056,7 +1043,8 @@ static void td_fill_rand_seeds_internal(struct thread_data *td, bool use64) init_rand_seed(&td->bsrange_state[DDIR_WRITE], write_seed, use64); init_rand_seed(&td->bsrange_state[DDIR_TRIM], trim_seed, use64); - td_fill_verify_state_seed(td); + init_rand_seed(&td->verify_state, td->rand_seeds[FIO_RAND_VER_OFF], + use64); init_rand_seed(&td->rwmix_state, td->rand_seeds[FIO_RAND_MIX_OFF], false); if (td->o.file_service_type == FIO_FSERVICE_RANDOM) @@ -1075,12 +1063,6 @@ static void td_fill_rand_seeds_internal(struct thread_data *td, bool use64) init_rand_seed(&td->prio_state, td->rand_seeds[FIO_RAND_PRIO_CMDS], false); init_rand_seed(&td->dedupe_working_set_index_state, td->rand_seeds[FIO_RAND_DEDUPE_WORKING_SET_IX], use64); - if (!td_random(td)) - return; - - if (td->o.rand_repeatable) - td->rand_seeds[FIO_RAND_BLOCK_OFF] = FIO_RANDSEED * td->thread_number; - init_rand_seed(&td->random_state, td->rand_seeds[FIO_RAND_BLOCK_OFF], use64); for (i = 0; i < DDIR_RWDIR_CNT; i++) { @@ -1088,20 +1070,15 @@ static void td_fill_rand_seeds_internal(struct thread_data *td, bool use64) init_rand_seed(s, td->rand_seeds[FIO_RAND_SEQ_RAND_READ_OFF], false); } + + init_rand_seed(&td->buf_state, td->rand_seeds[FIO_RAND_BUF_OFF], use64); + frand_copy(&td->buf_state_prev, &td->buf_state); } void td_fill_rand_seeds(struct thread_data *td) { bool use64; - if (td->o.allrand_repeatable) { - unsigned int i; - - for (i = 0; i < FIO_RAND_NR_OFFS; i++) - td->rand_seeds[i] = FIO_RANDSEED * td->thread_number - + i; - } - if (td->o.random_generator == FIO_RAND_GEN_TAUSWORTHE64) use64 = true; else @@ -1109,14 +1086,45 @@ void td_fill_rand_seeds(struct thread_data *td) td_fill_rand_seeds_internal(td, use64); - init_rand_seed(&td->buf_state, td->rand_seeds[FIO_RAND_BUF_OFF], use64); - frand_copy(&td->buf_state_prev, &td->buf_state); - dprint(FD_RANDOM, "FIO_RAND_NR_OFFS=%d\n", FIO_RAND_NR_OFFS); for (int i = 0; i < FIO_RAND_NR_OFFS; i++) dprint(FD_RANDOM, "rand_seeds[%d]=%" PRIu64 "\n", i, td->rand_seeds[i]); } +static int setup_random_seeds(struct thread_data *td) +{ + uint64_t seed; + unsigned int i; + + if (!td->o.rand_repeatable && !fio_option_is_set(&td->o, rand_seed)) { + int ret = init_random_seeds(td->rand_seeds, sizeof(td->rand_seeds)); + if (ret) + return ret; + } else { + seed = td->o.rand_seed; + for (i = 0; i < 4; i++) + seed *= 0x9e370001UL; + + for (i = 0; i < FIO_RAND_NR_OFFS; i++) { + td->rand_seeds[i] = seed * td->thread_number + i; + seed *= 0x9e370001UL; + } + } + + if (td->o.allrand_repeatable) { + unsigned int i; + + for (i = 0; i < FIO_RAND_NR_OFFS; i++) + td->rand_seeds[i] = FIO_RANDSEED * td->thread_number + i; + } + + if (td->o.rand_repeatable) + td->rand_seeds[FIO_RAND_BLOCK_OFF] = FIO_RANDSEED * td->thread_number; + + td_fill_rand_seeds(td); + return 0; +} + /* * Initializes the ioengine configured for a job, if it has not been done so * already. @@ -1250,31 +1258,6 @@ static void init_flags(struct thread_data *td) } } -static int setup_random_seeds(struct thread_data *td) -{ - uint64_t seed; - unsigned int i; - - if (!td->o.rand_repeatable && !fio_option_is_set(&td->o, rand_seed)) { - int ret = init_random_seeds(td->rand_seeds, sizeof(td->rand_seeds)); - if (!ret) - td_fill_rand_seeds(td); - return ret; - } - - seed = td->o.rand_seed; - for (i = 0; i < 4; i++) - seed *= 0x9e370001UL; - - for (i = 0; i < FIO_RAND_NR_OFFS; i++) { - td->rand_seeds[i] = seed * td->thread_number + i; - seed *= 0x9e370001UL; - } - - td_fill_rand_seeds(td); - return 0; -} - enum { FPRE_NONE = 0, FPRE_JOBNAME,