X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=init.c;h=a04198f3e08c77a02a3d2286c350091106e9b086;hb=3d43382c7864753728b181ac356222d67bdd4a3f;hp=3d90c8a5f6f70fa91147243f88f1052f08b01633;hpb=b7cfb2e18ba4815aa74eaf5d8637d466a51b712d;p=fio.git diff --git a/init.c b/init.c index 3d90c8a5..a04198f3 100644 --- a/init.c +++ b/init.c @@ -25,14 +25,7 @@ #include "fio_version.h" -#if FIO_PATCH > 0 -const char fio_version_string[] = __fio_stringify(FIO_MAJOR) "." \ - __fio_stringify(FIO_MINOR) "." \ - __fio_stringify(FIO_PATCH); -#else -const char fio_version_string[] = __fio_stringify(FIO_MAJOR) "." \ - __fio_stringify(FIO_MINOR); -#endif +const char fio_version_string[] = FIO_VERSION; #define FIO_RANDSEED (0xb1899bedUL) @@ -74,21 +67,23 @@ static char cmd_optstr[256]; static int did_arg; const fio_fp64_t def_percentile_list[FIO_IO_U_LIST_MAX_LEN] = { - { .u.f = 1.0 }, - { .u.f = 5.0 }, - { .u.f = 10.0 }, - { .u.f = 20.0 }, - { .u.f = 30.0 }, - { .u.f = 40.0 }, - { .u.f = 50.0 }, - { .u.f = 60.0 }, - { .u.f = 70.0 }, - { .u.f = 80.0 }, - { .u.f = 90.0 }, - { .u.f = 95.0 }, - { .u.f = 99.0 }, - { .u.f = 99.5 }, - { .u.f = 99.9 }, + { .u.f = 1.00 }, + { .u.f = 5.00 }, + { .u.f = 10.00 }, + { .u.f = 20.00 }, + { .u.f = 30.00 }, + { .u.f = 40.00 }, + { .u.f = 50.00 }, + { .u.f = 60.00 }, + { .u.f = 70.00 }, + { .u.f = 80.00 }, + { .u.f = 90.00 }, + { .u.f = 95.00 }, + { .u.f = 99.00 }, + { .u.f = 99.50 }, + { .u.f = 99.90 }, + { .u.f = 99.95 }, + { .u.f = 99.99 }, }; #define FIO_CLIENT_FLAG (1 << 16) @@ -568,13 +563,22 @@ static int fixup_options(struct thread_data *td) } #endif + /* + * For fully compressible data, just zero them at init time. + * It's faster than repeatedly filling it. + */ + if (td->o.compress_percentage == 100) { + td->o.zero_buffers = 1; + td->o.compress_percentage = 0; + } + return ret; } /* * This function leaks the buffer */ -static char *to_kmg(unsigned int val) +char *fio_uint_to_kmg(unsigned int val) { char *buf = malloc(32); char post[] = { 0, 'K', 'M', 'G', 'P', 'E', 0 }; @@ -736,7 +740,7 @@ int ioengine_load(struct thread_data *td) * members of td. */ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, - int recursed) + int recursed, int client_type) { unsigned int i; char fname[PATH_MAX]; @@ -756,17 +760,14 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, return 0; } + td->client_type = client_type; + if (profile_td_init(td)) goto err; if (ioengine_load(td)) goto err; - if (td->o.use_thread) - nr_thread++; - else - nr_process++; - if (td->o.odirect) td->io_ops->flags |= FIO_RAWIO; @@ -835,14 +836,14 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, goto err; if (td->o.write_lat_log) { - setup_log(&td->lat_log, td->o.log_avg_msec); - setup_log(&td->slat_log, td->o.log_avg_msec); - setup_log(&td->clat_log, td->o.log_avg_msec); + setup_log(&td->lat_log, td->o.log_avg_msec, IO_LOG_TYPE_LAT); + setup_log(&td->slat_log, td->o.log_avg_msec, IO_LOG_TYPE_SLAT); + setup_log(&td->clat_log, td->o.log_avg_msec, IO_LOG_TYPE_CLAT); } if (td->o.write_bw_log) - setup_log(&td->bw_log, td->o.log_avg_msec); + setup_log(&td->bw_log, td->o.log_avg_msec, IO_LOG_TYPE_BW); if (td->o.write_iops_log) - setup_log(&td->iops_log, td->o.log_avg_msec); + setup_log(&td->iops_log, td->o.log_avg_msec, IO_LOG_TYPE_IOPS); if (!td->o.name) td->o.name = strdup(jobname); @@ -850,20 +851,15 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, if (!terse_output) { if (!job_add_num) { if (is_backend && !recursed) - fio_server_send_add_job(&td->o, td->io_ops->name); + fio_server_send_add_job(td); - if (!strcmp(td->io_ops->name, "cpuio")) { - log_info("%s: ioengine=cpu, cpuload=%u," - " cpucycle=%u\n", td->o.name, - td->o.cpuload, - td->o.cpucycle); - } else { + if (!(td->io_ops->flags & FIO_NOIO)) { char *c1, *c2, *c3, *c4; - c1 = to_kmg(td->o.min_bs[DDIR_READ]); - c2 = to_kmg(td->o.max_bs[DDIR_READ]); - c3 = to_kmg(td->o.min_bs[DDIR_WRITE]); - c4 = to_kmg(td->o.max_bs[DDIR_WRITE]); + c1 = fio_uint_to_kmg(td->o.min_bs[DDIR_READ]); + c2 = fio_uint_to_kmg(td->o.max_bs[DDIR_READ]); + c3 = fio_uint_to_kmg(td->o.min_bs[DDIR_WRITE]); + c4 = fio_uint_to_kmg(td->o.max_bs[DDIR_WRITE]); log_info("%s: (g=%d): rw=%s, bs=%s-%s/%s-%s," " ioengine=%s, iodepth=%u\n", @@ -906,7 +902,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num, job_add_num = numjobs - 1; - if (add_job(td_new, jobname, job_add_num, 1)) + if (add_job(td_new, jobname, job_add_num, 1, client_type)) goto err; } @@ -919,7 +915,7 @@ err: /* * Parse as if 'o' was a command line */ -void add_job_opts(const char **o) +void add_job_opts(const char **o, int client_type) { struct thread_data *td, *td_parent; int i, in_global = 1; @@ -931,7 +927,7 @@ void add_job_opts(const char **o) if (!strncmp(o[i], "name", 4)) { in_global = 0; if (td) - add_job(td, jobname, 0, 0); + add_job(td, jobname, 0, 0, client_type); td = NULL; sprintf(jobname, "%s", o[i] + 5); } @@ -950,7 +946,7 @@ void add_job_opts(const char **o) } if (td) - add_job(td, jobname, 0, 0); + add_job(td, jobname, 0, 0, client_type); } static int skip_this_section(const char *name) @@ -988,7 +984,7 @@ static int is_empty_or_comment(char *line) /* * This is our [ini] type file parser. */ -int parse_jobs_ini(char *file, int is_buf, int stonewall_flag) +int parse_jobs_ini(char *file, int is_buf, int stonewall_flag, int type) { unsigned int global; struct thread_data *td; @@ -1132,7 +1128,7 @@ int parse_jobs_ini(char *file, int is_buf, int stonewall_flag) for (i = 0; i < num_opts; i++) log_info("--%s ", opts[i]); - ret = add_job(td, name, 0, 0); + ret = add_job(td, name, 0, 0, type); } else { log_err("fio: job %s dropped\n", name); put_job(td); @@ -1179,7 +1175,7 @@ static int fill_def_thread(void) static void usage(const char *name) { - printf("fio %s\n", fio_version_string); + 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" @@ -1379,7 +1375,7 @@ void parse_cmd_client(void *client, char *opt) fio_client_add_cmd_option(client, opt); } -int parse_cmd_line(int argc, char *argv[]) +int parse_cmd_line(int argc, char *argv[], int client_type) { struct thread_data *td = NULL; int c, ini_idx = 0, lidx, ret = 0, do_exit = 0, exit_val = 0; @@ -1452,7 +1448,7 @@ int parse_cmd_line(int argc, char *argv[]) break; case 'v': if (!cur_client) { - log_info("fio %s\n", fio_version_string); + log_info("%s\n", fio_version_string); do_exit++; } break; @@ -1498,7 +1494,7 @@ int parse_cmd_line(int argc, char *argv[]) char *val = optarg; if (!strncmp(opt, "name", 4) && td) { - ret = add_job(td, td->o.name ?: "fio", 0, 0); + ret = add_job(td, td->o.name ?: "fio", 0, 0, client_type); if (ret) return 0; td = NULL; @@ -1602,7 +1598,7 @@ int parse_cmd_line(int argc, char *argv[]) if (td) { if (!ret) - ret = add_job(td, td->o.name ?: "fio", 0, 0); + ret = add_job(td, td->o.name ?: "fio", 0, 0, client_type); } while (!ret && optind < argc) { @@ -1635,6 +1631,7 @@ extern int fio_check_options(struct thread_options *); int parse_options(int argc, char *argv[]) { + const int type = FIO_CLIENT_TYPE_CLI; int job_files, i; if (fio_init_options()) @@ -1642,7 +1639,7 @@ int parse_options(int argc, char *argv[]) if (fio_test_cconv(&def_thread.o)) log_err("fio: failed internal cconv test\n"); - job_files = parse_cmd_line(argc, argv); + job_files = parse_cmd_line(argc, argv, type); if (job_files > 0) { for (i = 0; i < job_files; i++) { @@ -1653,7 +1650,7 @@ int parse_options(int argc, char *argv[]) return 1; free(ini_file[i]); } else if (!is_backend) { - if (parse_jobs_ini(ini_file[i], 0, i)) + if (parse_jobs_ini(ini_file[i], 0, i, type)) return 1; free(ini_file[i]); } @@ -1690,7 +1687,12 @@ int parse_options(int argc, char *argv[]) } if (!terse_output) - log_info("fio %s\n", fio_version_string); + log_info("%s\n", fio_version_string); return 0; } + +void options_default_fill(struct thread_options *o) +{ + memcpy(o, &def_thread.o, sizeof(*o)); +}