X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=options.c;h=0f2adcd454c57823e59d931ec977052ab65a058d;hp=dfa98d3e29ebeffb390bc064a2e15bfec1afafb7;hb=d694a6a7c02f577b2bb5d0ad24331b775acf6869;hpb=16e56d250f72e4fec4591d562a5f4d7a16ba1bb8 diff --git a/options.c b/options.c index dfa98d3e..0f2adcd4 100644 --- a/options.c +++ b/options.c @@ -22,7 +22,7 @@ char client_sockaddr_str[INET6_ADDRSTRLEN] = { 0 }; #define cb_data_to_td(data) container_of(data, struct thread_data, o) -struct pattern_fmt_desc fmt_desc[] = { +static struct pattern_fmt_desc fmt_desc[] = { { .fmt = "%o", .len = FIELD_SIZE(struct io_u *, offset), @@ -1063,16 +1063,14 @@ static int str_random_distribution_cb(void *data, const char *str) static int str_steadystate_cb(void *data, const char *str) { - struct thread_data *td = data; + struct thread_data *td = cb_data_to_td(data); double val; char *nr; char *pct; long long ll; - if (td->o.ss != FIO_STEADYSTATE_IOPS && - td->o.ss != FIO_STEADYSTATE_IOPS_SLOPE && - td->o.ss != FIO_STEADYSTATE_BW && - td->o.ss != FIO_STEADYSTATE_BW_SLOPE) { + if (td->o.ss_state != FIO_SS_IOPS && td->o.ss_state != FIO_SS_IOPS_SLOPE && + td->o.ss_state != FIO_SS_BW && td->o.ss_state != FIO_SS_BW_SLOPE) { /* should be impossible to get here */ log_err("fio: unknown steady state criterion\n"); return 1; @@ -1101,12 +1099,9 @@ static int str_steadystate_cb(void *data, const char *str) if (parse_dryrun()) return 0; - td->o.ss_pct = true; + td->o.ss_state |= __FIO_SS_PCT; td->o.ss_limit.u.f = val; - - - } else if (td->o.ss == FIO_STEADYSTATE_IOPS || - td->o.ss == FIO_STEADYSTATE_IOPS_SLOPE) { + } else if (td->o.ss_state & __FIO_SS_IOPS) { if (!str_to_float(nr, &val, 0)) { log_err("fio: steadystate IOPS threshold postfix parsing failed\n"); free(nr); @@ -1118,9 +1113,7 @@ static int str_steadystate_cb(void *data, const char *str) if (parse_dryrun()) return 0; - td->o.ss_pct = false; td->o.ss_limit.u.f = val; - } else { /* bandwidth criterion */ if (str_to_decimal(nr, &ll, 1, td, 0, 0)) { log_err("fio: steadystate BW threshold postfix parsing failed\n"); @@ -1133,11 +1126,10 @@ static int str_steadystate_cb(void *data, const char *str) if (parse_dryrun()) return 0; - td->o.ss_pct = false; td->o.ss_limit.u.f = (double) ll; - } + td->ss.state = td->o.ss_state; return 0; } @@ -1391,6 +1383,50 @@ static int str_size_cb(void *data, unsigned long long *__val) return 0; } +static int str_write_bw_log_cb(void *data, const char *str) +{ + struct thread_data *td = cb_data_to_td(data); + + if (str) + td->o.bw_log_file = strdup(str); + + td->o.write_bw_log = 1; + return 0; +} + +static int str_write_lat_log_cb(void *data, const char *str) +{ + struct thread_data *td = cb_data_to_td(data); + + if (str) + td->o.lat_log_file = strdup(str); + + td->o.write_lat_log = 1; + return 0; +} + +static int str_write_iops_log_cb(void *data, const char *str) +{ + struct thread_data *td = cb_data_to_td(data); + + if (str) + td->o.iops_log_file = strdup(str); + + td->o.write_iops_log = 1; + return 0; +} + +static int str_write_hist_log_cb(void *data, const char *str) +{ + struct thread_data *td = cb_data_to_td(data); + + if (str) + td->o.hist_log_file = strdup(str); + + td->o.write_hist_log = 1; + return 0; +} + static int rw_verify(struct fio_option *o, void *data) { struct thread_data *td = cb_data_to_td(data); @@ -1733,6 +1769,11 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "NVML libpmemblk based IO engine", }, +#endif +#ifdef CONFIG_LINUX_DEVDAX + { .ival = "dev-dax", + .help = "DAX Device based IO engine", + }, #endif { .ival = "external", .help = "Load external engine (append name)", @@ -1924,7 +1965,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .off3 = offsetof(struct thread_options, bs[DDIR_TRIM]), .minval = 1, .help = "Block size unit", - .def = "4k", + .def = "4096", .parent = "rw", .hide = 1, .interval = 512, @@ -2193,7 +2234,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { }, { .ival = "gauss", .oval = FIO_FSERVICE_GAUSS, - .help = "Normal (guassian) distribution", + .help = "Normal (gaussian) distribution", }, { .ival = "roundrobin", .oval = FIO_FSERVICE_RR, @@ -2254,8 +2295,26 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { { .name = "fadvise_hint", .lname = "Fadvise hint", - .type = FIO_OPT_BOOL, + .type = FIO_OPT_STR, .off1 = offsetof(struct thread_options, fadvise_hint), + .posval = { + { .ival = "0", + .oval = F_ADV_NONE, + .help = "Don't issue fadvise", + }, + { .ival = "1", + .oval = F_ADV_TYPE, + .help = "Advise using fio IO pattern", + }, + { .ival = "random", + .oval = F_ADV_RANDOM, + .help = "Advise using FADV_RANDOM", + }, + { .ival = "sequential", + .oval = F_ADV_SEQUENTIAL, + .help = "Advise using FADV_SEQUENTIAL", + }, + }, .help = "Use fadvise() to advise the kernel on IO pattern", .def = "1", .category = FIO_OPT_C_FILE, @@ -2826,7 +2885,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .off1 = offsetof(struct thread_options, trim_percentage), .minval = 0, .maxval = 100, - .help = "Number of verify blocks to discard/trim", + .help = "Number of verify blocks to trim (i.e., discard)", .parent = "verify", .def = "0", .interval = 1, @@ -2838,7 +2897,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .name = "trim_verify_zero", .lname = "Verify trim zero", .type = FIO_OPT_BOOL, - .help = "Verify that trim/discarded blocks are returned as zeroes", + .help = "Verify that trimmed (i.e., discarded) blocks are returned as zeroes", .off1 = offsetof(struct thread_options, trim_zero), .parent = "trim_percentage", .hide = 1, @@ -3587,8 +3646,9 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { { .name = "write_bw_log", .lname = "Write bandwidth log", - .type = FIO_OPT_STR_STORE, + .type = FIO_OPT_STR, .off1 = offsetof(struct thread_options, bw_log_file), + .cb = str_write_bw_log_cb, .help = "Write log of bandwidth during run", .category = FIO_OPT_C_LOG, .group = FIO_OPT_G_INVALID, @@ -3596,8 +3656,9 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { { .name = "write_lat_log", .lname = "Write latency log", - .type = FIO_OPT_STR_STORE, + .type = FIO_OPT_STR, .off1 = offsetof(struct thread_options, lat_log_file), + .cb = str_write_lat_log_cb, .help = "Write log of latency during run", .category = FIO_OPT_C_LOG, .group = FIO_OPT_G_INVALID, @@ -3605,8 +3666,9 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { { .name = "write_iops_log", .lname = "Write IOPS log", - .type = FIO_OPT_STR_STORE, + .type = FIO_OPT_STR, .off1 = offsetof(struct thread_options, iops_log_file), + .cb = str_write_iops_log_cb, .help = "Write log of IOPS during run", .category = FIO_OPT_C_LOG, .group = FIO_OPT_G_INVALID, @@ -3646,8 +3708,9 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { { .name = "write_hist_log", .lname = "Write latency histogram logs", - .type = FIO_OPT_STR_STORE, + .type = FIO_OPT_STR, .off1 = offsetof(struct thread_options, hist_log_file), + .cb = str_write_hist_log_cb, .help = "Write log of latency histograms during run", .category = FIO_OPT_C_LOG, .group = FIO_OPT_G_INVALID, @@ -3727,6 +3790,15 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "Install libz-dev(el) to get compression support", }, #endif + { + .name = "log_unix_epoch", + .lname = "Log epoch unix", + .type = FIO_OPT_BOOL, + .off1 = offsetof(struct thread_options, log_unix_epoch), + .help = "Use Unix time in log files", + .category = FIO_OPT_C_LOG, + .group = FIO_OPT_G_INVALID, + }, { .name = "block_error_percentiles", .lname = "Block error percentiles", @@ -3943,6 +4015,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { }, { .name = "disable_bw_measurement", + .alias = "disable_bw", .lname = "Disable bandwidth stats", .type = FIO_OPT_BOOL, .off1 = offsetof(struct thread_options, disable_bw), @@ -4107,20 +4180,20 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .posval = { { .ival = "1024", .oval = 1024, - .help = "Use 1024 as the K base", + .help = "Inputs invert IEC and SI prefixes (for compatibility); outputs prefer binary", }, { .ival = "1000", .oval = 1000, - .help = "Use 1000 as the K base", + .help = "Inputs use IEC and SI prefixes; outputs prefer SI", }, }, - .help = "How many bytes per KB for reporting (1000 or 1024)", + .help = "Unit prefix interpretation for quantities of data (IEC and SI)", .category = FIO_OPT_C_GENERAL, .group = FIO_OPT_G_INVALID, }, { .name = "unit_base", - .lname = "Base unit for reporting (Bits or Bytes)", + .lname = "Unit for quantities of data (Bits or Bytes)", .type = FIO_OPT_INT, .off1 = offsetof(struct thread_options, unit_base), .prio = 1, @@ -4218,26 +4291,26 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .lname = "Steady state threshold", .alias = "ss", .type = FIO_OPT_STR, - .off1 = offsetof(struct thread_options, ss), + .off1 = offsetof(struct thread_options, ss_state), .cb = str_steadystate_cb, .help = "Define the criterion and limit to judge when a job has reached steady state", .def = "iops_slope:0.01%", .posval = { { .ival = "iops", - .oval = FIO_STEADYSTATE_IOPS, + .oval = FIO_SS_IOPS, .help = "maximum mean deviation of IOPS measurements", }, { .ival = "iops_slope", - .oval = FIO_STEADYSTATE_IOPS_SLOPE, + .oval = FIO_SS_IOPS_SLOPE, .help = "slope calculated from IOPS measurements", }, { .ival = "bw", - .oval = FIO_STEADYSTATE_BW, + .oval = FIO_SS_BW, .help = "maximum mean deviation of bandwidth measurements", }, { .ival = "bw_slope", - .oval = FIO_STEADYSTATE_BW_SLOPE, + .oval = FIO_SS_BW_SLOPE, .help = "slope calculated from bandwidth measurements", }, }, @@ -4248,6 +4321,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .name = "steadystate_duration", .lname = "Steady state duration", .alias = "ss_dur", + .parent = "steadystate", .type = FIO_OPT_STR_VAL_TIME, .off1 = offsetof(struct thread_options, ss_dur), .help = "Stop workload upon attaining steady state for specified duration", @@ -4261,6 +4335,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .name = "steadystate_ramp_time", .lname = "Steady state ramp time", .alias = "ss_ramp", + .parent = "steadystate", .type = FIO_OPT_STR_VAL_TIME, .off1 = offsetof(struct thread_options, ss_ramp_time), .help = "Delay before initiation of data collection for steady state job termination testing", @@ -4826,7 +4901,7 @@ void del_opt_posval(const char *optname, const char *ival) void fio_options_free(struct thread_data *td) { - options_free(fio_options, td); + options_free(fio_options, &td->o); if (td->eo && td->io_ops && td->io_ops->options) { options_free(td->io_ops->options, td->eo); free(td->eo);