rand: add 64-bit tausworthe variant with a 2^258 cycle
[fio.git] / init.c
diff --git a/init.c b/init.c
index ba5bf2fbf4bb9b55bc61267e7ff0e3e8889bbd04..9f1041c7a4e7b9add4b8b1b6889473b4705b7085 100644 (file)
--- a/init.c
+++ b/init.c
@@ -496,12 +496,14 @@ static int fixed_block_size(struct thread_options *o)
 static unsigned long long get_rand_start_delay(struct thread_data *td)
 {
        unsigned long long delayrange;
+       uint64_t frand_max;
        unsigned long r;
 
        delayrange = td->o.start_delay_high - td->o.start_delay;
 
+       frand_max = rand_max(&td->delay_state);
        r = __rand(&td->delay_state);
-       delayrange = (unsigned long long) ((double) delayrange * (r / (FRAND_MAX + 1.0)));
+       delayrange = (unsigned long long) ((double) delayrange * (r / (frand_max + 1.0)));
 
        delayrange += td->o.start_delay;
        return delayrange;
@@ -827,18 +829,18 @@ static int exists_and_not_file(const char *filename)
        return 1;
 }
 
-static void td_fill_rand_seeds_internal(struct thread_data *td)
+static void td_fill_rand_seeds_internal(struct thread_data *td, int use64)
 {
-       init_rand_seed(&td->bsrange_state, td->rand_seeds[FIO_RAND_BS_OFF]);
-       init_rand_seed(&td->verify_state, td->rand_seeds[FIO_RAND_VER_OFF]);
-       init_rand_seed(&td->rwmix_state, td->rand_seeds[FIO_RAND_MIX_OFF]);
+       init_rand_seed(&td->bsrange_state, td->rand_seeds[FIO_RAND_BS_OFF], use64);
+       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], use64);
 
        if (td->o.file_service_type == FIO_FSERVICE_RANDOM)
-               init_rand_seed(&td->next_file_state, td->rand_seeds[FIO_RAND_FILE_OFF]);
+               init_rand_seed(&td->next_file_state, td->rand_seeds[FIO_RAND_FILE_OFF], use64);
 
-       init_rand_seed(&td->file_size_state, td->rand_seeds[FIO_RAND_FILE_SIZE_OFF]);
-       init_rand_seed(&td->trim_state, td->rand_seeds[FIO_RAND_TRIM_OFF]);
-       init_rand_seed(&td->delay_state, td->rand_seeds[FIO_RAND_START_DELAY]);
+       init_rand_seed(&td->file_size_state, td->rand_seeds[FIO_RAND_FILE_SIZE_OFF], use64);
+       init_rand_seed(&td->trim_state, td->rand_seeds[FIO_RAND_TRIM_OFF], use64);
+       init_rand_seed(&td->delay_state, td->rand_seeds[FIO_RAND_START_DELAY], use64);
 
        if (!td_random(td))
                return;
@@ -846,14 +848,16 @@ static void td_fill_rand_seeds_internal(struct thread_data *td)
        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]);
-       init_rand_seed(&td->seq_rand_state[DDIR_READ], td->rand_seeds[FIO_RAND_SEQ_RAND_READ_OFF]);
-       init_rand_seed(&td->seq_rand_state[DDIR_WRITE], td->rand_seeds[FIO_RAND_SEQ_RAND_WRITE_OFF]);
-       init_rand_seed(&td->seq_rand_state[DDIR_TRIM], td->rand_seeds[FIO_RAND_SEQ_RAND_TRIM_OFF]);
+       init_rand_seed(&td->random_state, td->rand_seeds[FIO_RAND_BLOCK_OFF], use64);
+       init_rand_seed(&td->seq_rand_state[DDIR_READ], td->rand_seeds[FIO_RAND_SEQ_RAND_READ_OFF], use64);
+       init_rand_seed(&td->seq_rand_state[DDIR_WRITE], td->rand_seeds[FIO_RAND_SEQ_RAND_WRITE_OFF], use64);
+       init_rand_seed(&td->seq_rand_state[DDIR_TRIM], td->rand_seeds[FIO_RAND_SEQ_RAND_TRIM_OFF], use64);
 }
 
 void td_fill_rand_seeds(struct thread_data *td)
 {
+       int use64;
+
        if (td->o.allrand_repeatable) {
                unsigned int i;
 
@@ -862,12 +866,17 @@ void td_fill_rand_seeds(struct thread_data *td)
                                + i;
        }
 
-       td_fill_rand_seeds_internal(td);
+       if (td->o.random_generator == FIO_RAND_GEN_TAUSWORTHE64)
+               use64 = 1;
+       else
+               use64 = 0;
+
+       td_fill_rand_seeds_internal(td, use64);
 
-       init_rand_seed(&td->buf_state, td->rand_seeds[FIO_RAND_BUF_OFF]);
+       init_rand_seed(&td->buf_state, td->rand_seeds[FIO_RAND_BUF_OFF], use64);
        frand_copy(&td->buf_state_prev, &td->buf_state);
 
-       init_rand_seed(&td->dedupe_state, td->rand_seeds[FIO_DEDUPE_OFF]);
+       init_rand_seed(&td->dedupe_state, td->rand_seeds[FIO_DEDUPE_OFF], use64);
 }
 
 /*
@@ -1107,6 +1116,16 @@ int parse_dryrun(void)
        return dump_cmdline || parse_only;
 }
 
+static void gen_log_name(char *name, size_t size, const char *logtype,
+                        const char *logname, unsigned int num,
+                        const char *suf, int per_job)
+{
+       if (per_job)
+               snprintf(name, size, "%s_%s.%d.%s", logname, logtype, num, suf);
+       else
+               snprintf(name, size, "%s_%s.%s", logname, logtype, suf);
+}
+
 /*
  * Adds a job to the list of things todo. Sanitizes the various options
  * to make sure we don't have conflicts, and initializes various
@@ -1225,14 +1244,16 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                else
                        suf = "log";
 
-               snprintf(logname, sizeof(logname), "%s_lat.%d.%s",
-                               o->lat_log_file, td->thread_number, suf);
+               gen_log_name(logname, sizeof(logname), "lat", o->lat_log_file,
+                               td->thread_number, suf, o->per_job_logs);
                setup_log(&td->lat_log, &p, logname);
-               snprintf(logname, sizeof(logname), "%s_slat.%d.%s",
-                               o->lat_log_file, td->thread_number, suf);
+
+               gen_log_name(logname, sizeof(logname), "slat", o->lat_log_file,
+                               td->thread_number, suf, o->per_job_logs);
                setup_log(&td->slat_log, &p, logname);
-               snprintf(logname, sizeof(logname), "%s_clat.%d.%s",
-                               o->lat_log_file, td->thread_number, suf);
+
+               gen_log_name(logname, sizeof(logname), "clat", o->lat_log_file,
+                               td->thread_number, suf, o->per_job_logs);
                setup_log(&td->clat_log, &p, logname);
        }
        if (o->bw_log_file) {
@@ -1251,8 +1272,8 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                else
                        suf = "log";
 
-               snprintf(logname, sizeof(logname), "%s_bw.%d.%s",
-                               o->bw_log_file, td->thread_number, suf);
+               gen_log_name(logname, sizeof(logname), "bw", o->bw_log_file,
+                               td->thread_number, suf, o->per_job_logs);
                setup_log(&td->bw_log, &p, logname);
        }
        if (o->iops_log_file) {
@@ -1271,8 +1292,8 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                else
                        suf = "log";
 
-               snprintf(logname, sizeof(logname), "%s_iops.%d.%s",
-                               o->iops_log_file, td->thread_number, suf);
+               gen_log_name(logname, sizeof(logname), "iops", o->iops_log_file,
+                               td->thread_number, suf, o->per_job_logs);
                setup_log(&td->iops_log, &p, logname);
        }