X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=init.c;h=5edd53e06cca9e03b063fc5aea5f94e9e65575ad;hp=ba5bf2fbf4bb9b55bc61267e7ff0e3e8889bbd04;hb=7627557b4795971e0a7565f51415697c71d27c6b;hpb=40fe5e7bf13fd7b99e26ed83623d3560a7ffdc8a;ds=sidebyside diff --git a/init.c b/init.c index ba5bf2fb..5edd53e0 100644 --- 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; @@ -660,7 +662,9 @@ static int fixup_options(struct thread_data *td) ret = warnings_fatal; } - o->refill_buffers = 1; + if (!fio_option_is_set(o, refill_buffers)) + o->refill_buffers = 1; + if (o->max_bs[DDIR_WRITE] != o->min_bs[DDIR_WRITE] && !o->verify_interval) o->verify_interval = o->min_bs[DDIR_WRITE]; @@ -827,18 +831,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 +850,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 +868,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; - init_rand_seed(&td->buf_state, td->rand_seeds[FIO_RAND_BUF_OFF]); + 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); - 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 +1118,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 +1246,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 +1274,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 +1294,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); } @@ -1689,13 +1712,41 @@ static int fill_def_thread(void) return 0; } +static void show_debug_categories(void) +{ + struct debug_level *dl = &debug_levels[0]; + int curlen, first = 1; + + curlen = 0; + while (dl->name) { + int has_next = (dl + 1)->name != NULL; + + if (first || curlen + strlen(dl->name) >= 80) { + if (!first) { + printf("\n"); + curlen = 0; + } + curlen += printf("\t\t\t%s", dl->name); + curlen += 3 * (8 - 1); + if (has_next) + curlen += printf(","); + } else { + curlen += printf("%s", dl->name); + if (has_next) + curlen += printf(","); + } + dl++; + first = 0; + } + printf("\n"); +} + static void usage(const char *name) { printf("%s\n", fio_version_string); printf("%s [options] [job options] \n", name); - printf(" --debug=options\tEnable debug logging. May be one/more of:\n" - "\t\t\tprocess,file,io,mem,blktrace,verify,random,parse,\n" - "\t\t\tdiskutil,job,mutex,profile,time,net,rate,compress\n"); + printf(" --debug=options\tEnable debug logging. May be one/more of:\n"); + show_debug_categories(); printf(" --parse-only\t\tParse options only, don't start any IO\n"); printf(" --output\t\tWrite output to file\n"); printf(" --runtime\t\tRuntime in seconds\n");