init: refactor random seed setting
authorVincent Fu <vincent.fu@samsung.com>
Fri, 24 Mar 2023 17:47:14 +0000 (17:47 +0000)
committerVincent Fu <vincent.fu@samsung.com>
Thu, 13 Apr 2023 17:33:00 +0000 (13:33 -0400)
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 <vincent.fu@samsung.com>
fio.h
init.c

diff --git a/fio.h b/fio.h
index 6b841e9c263bf1b1960d00b551d78e7ebb986467..6fc7fb9c63a6bad1a6a103e1f3c00ffe10650f4a 100644 (file)
--- 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 1c8df1a754c576dd558a999dccffd05abc82fdf9..e020d452f973413950a70f855a49b35684f686dc 100644 (file)
--- 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,