X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=init.c;h=f26f35dc5adcdca1b46133d934654651e8a8f021;hp=e9bf3a2bef5340a98c9e88727d6761ee36938b60;hb=3ab9ebca087bac797c7dad00fdb3b4dcfc01fa6c;hpb=bfc4884ea2d7847675c27c7bc0458ff5f614735d diff --git a/init.c b/init.c index e9bf3a2b..f26f35dc 100644 --- a/init.c +++ b/init.c @@ -48,7 +48,6 @@ static char **job_sections; static int nr_job_sections; int exitall_on_terminate = 0; -int exitall_on_terminate_error = 0; int output_format = FIO_OUTPUT_NORMAL; int eta_print = FIO_ETA_AUTO; int eta_new_line = 0; @@ -81,8 +80,6 @@ unsigned int *fio_debug_jobp = NULL; static char cmd_optstr[256]; static int did_arg; -bool steadystate = false; - #define FIO_CLIENT_FLAG (1 << 16) /* @@ -107,7 +104,7 @@ static struct option l_opts[FIO_NR_OPTIONS] = { }, { .name = (char *) "bandwidth-log", - .has_arg = required_argument, + .has_arg = no_argument, .val = 'b' | FIO_CLIENT_FLAG, }, { @@ -302,7 +299,6 @@ void free_threads_shm(void) static void free_shm(void) { if (threads) { - file_hash_exit(); flow_exit(); fio_debug_jobp = NULL; free_threads_shm(); @@ -313,8 +309,9 @@ static void free_shm(void) free(trigger_remote_cmd); trigger_file = trigger_cmd = trigger_remote_cmd = NULL; - options_free(fio_options, &def_thread); + options_free(fio_options, &def_thread.o); fio_filelock_exit(); + file_hash_exit(); scleanup(); } @@ -326,8 +323,6 @@ static void free_shm(void) */ static int setup_thread_area(void) { - void *hash; - if (threads) return 0; @@ -338,7 +333,6 @@ static int setup_thread_area(void) do { size_t size = max_jobs * sizeof(struct thread_data); - size += file_hash_size; size += sizeof(unsigned int); #ifndef CONFIG_NO_SHM @@ -370,10 +364,8 @@ static int setup_thread_area(void) #endif memset(threads, 0, max_jobs * sizeof(struct thread_data)); - hash = (void *) threads + max_jobs * sizeof(struct thread_data); - fio_debug_jobp = (void *) hash + file_hash_size; + fio_debug_jobp = (void *) threads + max_jobs * sizeof(struct thread_data); *fio_debug_jobp = -1; - file_hash_init(hash); flow_init(); @@ -831,7 +823,8 @@ static int fixup_options(struct thread_data *td) * If size is set but less than the min block size, complain */ if (o->size && o->size < td_min_bs(td)) { - log_err("fio: size too small, must be larger than the IO size: %llu\n", (unsigned long long) o->size); + log_err("fio: size too small, must not be less than minimum block size: %llu < %u\n", + (unsigned long long) o->size, td_min_bs(td)); ret = 1; } @@ -907,26 +900,6 @@ static const char *get_engine_name(const char *str) return p; } -static int exists_and_not_regfile(const char *filename) -{ - struct stat sb; - - if (lstat(filename, &sb) == -1) - return 0; - -#ifndef WIN32 /* NOT Windows */ - if (S_ISREG(sb.st_mode)) - return 0; -#else - /* \\.\ is the device namespace in Windows, where every file - * is a device node */ - if (S_ISREG(sb.st_mode) && strncmp(filename, "\\\\.\\", 4) != 0) - return 0; -#endif - - return 1; -} - static void init_rand_file_service(struct thread_data *td) { unsigned long nranges = td->o.nr_files << FIO_FSERVICE_SHIFT; @@ -1251,7 +1224,7 @@ static char *make_filename(char *buf, size_t buf_size,struct thread_options *o, return buf; } -int parse_dryrun(void) +bool parse_dryrun(void) { return dump_cmdline || parse_only; } @@ -1418,7 +1391,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, if (setup_rate(td)) goto err; - if (o->lat_log_file) { + if (o->write_lat_log) { struct log_params p = { .td = td, .avg_msec = o->log_avg_msec, @@ -1429,6 +1402,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, .log_gz = o->log_gz, .log_gz_store = o->log_gz_store, }; + const char *pre = o->lat_log_file ? o->lat_log_file : o->name; const char *suf; if (p.log_gz_store) @@ -1436,20 +1410,20 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, else suf = "log"; - gen_log_name(logname, sizeof(logname), "lat", o->lat_log_file, + gen_log_name(logname, sizeof(logname), "lat", pre, td->thread_number, suf, o->per_job_logs); setup_log(&td->lat_log, &p, logname); - gen_log_name(logname, sizeof(logname), "slat", o->lat_log_file, + gen_log_name(logname, sizeof(logname), "slat", pre, td->thread_number, suf, o->per_job_logs); setup_log(&td->slat_log, &p, logname); - gen_log_name(logname, sizeof(logname), "clat", o->lat_log_file, + gen_log_name(logname, sizeof(logname), "clat", pre, td->thread_number, suf, o->per_job_logs); setup_log(&td->clat_log, &p, logname); } - if (o->hist_log_file) { + if (o->write_hist_log) { struct log_params p = { .td = td, .avg_msec = o->log_avg_msec, @@ -1460,19 +1434,27 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, .log_gz = o->log_gz, .log_gz_store = o->log_gz_store, }; + const char *pre = o->hist_log_file ? o->hist_log_file : o->name; const char *suf; +#ifndef CONFIG_ZLIB + if (td->client_type) { + log_err("fio: --write_hist_log requires zlib in client/server mode\n"); + goto err; + } +#endif + if (p.log_gz_store) suf = "log.fz"; else suf = "log"; - gen_log_name(logname, sizeof(logname), "clat_hist", o->hist_log_file, + gen_log_name(logname, sizeof(logname), "clat_hist", pre, td->thread_number, suf, o->per_job_logs); setup_log(&td->clat_hist_log, &p, logname); } - if (o->bw_log_file) { + if (o->write_bw_log) { struct log_params p = { .td = td, .avg_msec = o->log_avg_msec, @@ -1483,6 +1465,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, .log_gz = o->log_gz, .log_gz_store = o->log_gz_store, }; + const char *pre = o->bw_log_file ? o->bw_log_file : o->name; const char *suf; if (fio_option_is_set(o, bw_avg_time)) @@ -1498,11 +1481,11 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, else suf = "log"; - gen_log_name(logname, sizeof(logname), "bw", o->bw_log_file, + gen_log_name(logname, sizeof(logname), "bw", pre, td->thread_number, suf, o->per_job_logs); setup_log(&td->bw_log, &p, logname); } - if (o->iops_log_file) { + if (o->write_iops_log) { struct log_params p = { .td = td, .avg_msec = o->log_avg_msec, @@ -1513,6 +1496,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, .log_gz = o->log_gz, .log_gz_store = o->log_gz_store, }; + const char *pre = o->iops_log_file ? o->iops_log_file : o->name; const char *suf; if (fio_option_is_set(o, iops_avg_time)) @@ -1528,7 +1512,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, else suf = "log"; - gen_log_name(logname, sizeof(logname), "iops", o->iops_log_file, + gen_log_name(logname, sizeof(logname), "iops", pre, td->thread_number, suf, o->per_job_logs); setup_log(&td->iops_log, &p, logname); } @@ -1580,49 +1564,8 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, log_info("...\n"); } - if (o->ss_dur) { - steadystate = true; - o->ss_dur /= 1000000L; - - /* put all steady state info in one place */ - td->ss.dur = o->ss_dur; - td->ss.limit = o->ss_limit.u.f; - td->ss.ramp_time = o->ss_ramp_time; - td->ss.pct = o->ss_pct; - - if (o->ss == FIO_STEADYSTATE_IOPS_SLOPE || o->ss == FIO_STEADYSTATE_BW_SLOPE) { - td->ss.check_slope = true; - td->ss.evaluate = &steadystate_slope; - } else { - td->ss.check_slope = false; - td->ss.evaluate = &steadystate_deviation; - } - - if (o->ss == FIO_STEADYSTATE_IOPS || o->ss == FIO_STEADYSTATE_IOPS_SLOPE) - td->ss.check_iops = true; - else - td->ss.check_iops = false; - - td->ss.bw_data = NULL; - td->ss.iops_data = NULL; - td->ss.ramp_time_over = (td->ss.ramp_time == 0); - td->ss.attained = 0; - td->ss.last_in_group = 0; - td->ss.head = 0; - td->ss.tail = 0; - td->ss.sum_x = o->ss_dur * (o->ss_dur - 1) / 2; - td->ss.sum_x_sq = (o->ss_dur - 1) * (o->ss_dur) * (2*o->ss_dur - 1) / 6; - td->ss.prev_bytes = 0; - td->ss.prev_iops = 0; - td->ss.sum_y = 0; - td->ss.oldest_y = 0; - td->ss.criterion = 0.0; - td->ss.slope = 0.0; - td->ss.deviation = 0.0; - td->ts.ss = &td->ss; - } - else - td->ts.ss = NULL; + if (td_steadystate_init(td)) + goto err; /* * recurse add identical jobs, clear numjobs and stonewall options @@ -1743,7 +1686,7 @@ static int is_empty_or_comment(char *line) /* * This is our [ini] type file parser. */ -int __parse_jobs_ini(struct thread_data *td, +static int __parse_jobs_ini(struct thread_data *td, char *file, int is_buf, int stonewall_flag, int type, int nested, char *name, char ***popts, int *aopts, int *nopts) { @@ -2069,7 +2012,7 @@ static void usage(const char *name) 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"); - printf(" --bandwidth-log\tGenerate per-job bandwidth logs\n"); + printf(" --bandwidth-log\tGenerate aggregate bandwidth logs\n"); printf(" --minimal\t\tMinimal (terse) output\n"); printf(" --output-format=x\tOutput format (terse,json,json+,normal)\n"); printf(" --terse-version=x\tSet terse version output format to 'x'\n"); @@ -2379,6 +2322,8 @@ int parse_cmd_line(int argc, char *argv[], int client_type) switch (c) { case 'a': smalloc_pool_size = atoi(optarg); + smalloc_pool_size <<= 10; + sinit(); break; case 't': if (check_str_time(optarg, &def_timeout, 1)) {