X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=options.c;h=5b668e5d1226a57878b0cfdad739be57738e6553;hp=88b9142e809271f9d95b2e0f660e99f26ebf6806;hb=d31e26d0a575f91db96bda4d76b36fe38996d5f8;hpb=a01a1bc58d096dd593fa458f99f3c6f423c4b69a diff --git a/options.c b/options.c index 88b9142e..5b668e5d 100644 --- a/options.c +++ b/options.c @@ -37,7 +37,7 @@ static int converthexchartoint(char a) { int base; - switch(a) { + switch (a) { case '0'...'9': base = '0'; break; @@ -50,7 +50,7 @@ static int converthexchartoint(char a) default: base = 0; } - return (a - base); + return a - base; } static int bs_cmp(const void *p1, const void *p2) @@ -61,7 +61,7 @@ static int bs_cmp(const void *p1, const void *p2) return bsp1->perc < bsp2->perc; } -static int bssplit_ddir(struct thread_data *td, int ddir, char *str) +static int bssplit_ddir(struct thread_options *o, int ddir, char *str) { struct bssplit *bssplit; unsigned int i, perc, perc_missing; @@ -69,7 +69,7 @@ static int bssplit_ddir(struct thread_data *td, int ddir, char *str) long long val; char *fname; - td->o.bssplit_nr[ddir] = 4; + o->bssplit_nr[ddir] = 4; bssplit = malloc(4 * sizeof(struct bssplit)); i = 0; @@ -84,9 +84,9 @@ static int bssplit_ddir(struct thread_data *td, int ddir, char *str) /* * grow struct buffer, if needed */ - if (i == td->o.bssplit_nr[ddir]) { - td->o.bssplit_nr[ddir] <<= 1; - bssplit = realloc(bssplit, td->o.bssplit_nr[ddir] + if (i == o->bssplit_nr[ddir]) { + o->bssplit_nr[ddir] <<= 1; + bssplit = realloc(bssplit, o->bssplit_nr[ddir] * sizeof(struct bssplit)); } @@ -102,9 +102,9 @@ static int bssplit_ddir(struct thread_data *td, int ddir, char *str) } else perc = -1; - if (str_to_decimal(fname, &val, 1, td)) { + if (str_to_decimal(fname, &val, 1, o)) { log_err("fio: bssplit conversion failed\n"); - free(td->o.bssplit); + free(o->bssplit); return 1; } @@ -118,13 +118,13 @@ static int bssplit_ddir(struct thread_data *td, int ddir, char *str) i++; } - td->o.bssplit_nr[ddir] = i; + o->bssplit_nr[ddir] = i; /* * Now check if the percentages add up, and how much is missing */ perc = perc_missing = 0; - for (i = 0; i < td->o.bssplit_nr[ddir]; i++) { + for (i = 0; i < o->bssplit_nr[ddir]; i++) { struct bssplit *bsp = &bssplit[i]; if (bsp->perc == (unsigned char) -1) @@ -143,7 +143,7 @@ static int bssplit_ddir(struct thread_data *td, int ddir, char *str) * them. */ if (perc_missing) { - for (i = 0; i < td->o.bssplit_nr[ddir]; i++) { + for (i = 0; i < o->bssplit_nr[ddir]; i++) { struct bssplit *bsp = &bssplit[i]; if (bsp->perc == (unsigned char) -1) @@ -151,14 +151,14 @@ static int bssplit_ddir(struct thread_data *td, int ddir, char *str) } } - td->o.min_bs[ddir] = min_bs; - td->o.max_bs[ddir] = max_bs; + o->min_bs[ddir] = min_bs; + o->max_bs[ddir] = max_bs; /* * now sort based on percentages, for ease of lookup */ - qsort(bssplit, td->o.bssplit_nr[ddir], sizeof(struct bssplit), bs_cmp); - td->o.bssplit[ddir] = bssplit; + qsort(bssplit, o->bssplit_nr[ddir], sizeof(struct bssplit), bs_cmp); + o->bssplit[ddir] = bssplit; return 0; } @@ -175,19 +175,19 @@ static int str_bssplit_cb(void *data, const char *input) odir = strchr(str, ','); if (odir) { - ret = bssplit_ddir(td, DDIR_WRITE, odir + 1); + ret = bssplit_ddir(&td->o, DDIR_WRITE, odir + 1); if (!ret) { *odir = '\0'; - ret = bssplit_ddir(td, DDIR_READ, str); + ret = bssplit_ddir(&td->o, DDIR_READ, str); } } else { char *op; op = strdup(str); - ret = bssplit_ddir(td, DDIR_READ, str); + ret = bssplit_ddir(&td->o, DDIR_READ, str); if (!ret) - ret = bssplit_ddir(td, DDIR_WRITE, op); + ret = bssplit_ddir(&td->o, DDIR_WRITE, op); free(op); } @@ -199,26 +199,27 @@ static int str_bssplit_cb(void *data, const char *input) static int str_rw_cb(void *data, const char *str) { struct thread_data *td = data; + struct thread_options *o = &td->o; char *nr = get_opt_postfix(str); - td->o.ddir_seq_nr = 1; - td->o.ddir_seq_add = 0; + o->ddir_seq_nr = 1; + o->ddir_seq_add = 0; if (!nr) return 0; if (td_random(td)) - td->o.ddir_seq_nr = atoi(nr); + o->ddir_seq_nr = atoi(nr); else { long long val; - if (str_to_decimal(nr, &val, 1, td)) { + if (str_to_decimal(nr, &val, 1, o)) { log_err("fio: rw postfix parsing failed\n"); free(nr); return 1; } - td->o.ddir_seq_add = val; + o->ddir_seq_add = val; } free(nr); @@ -228,10 +229,11 @@ static int str_rw_cb(void *data, const char *str) static int str_mem_cb(void *data, const char *mem) { struct thread_data *td = data; + struct thread_options *o = &td->o; - if (td->o.mem_type == MEM_MMAPHUGE || td->o.mem_type == MEM_MMAP) { - td->mmapfile = get_opt_postfix(mem); - if (td->o.mem_type == MEM_MMAPHUGE && !td->mmapfile) { + if (o->mem_type == MEM_MMAPHUGE || o->mem_type == MEM_MMAP) { + o->mmapfile = get_opt_postfix(mem); + if (o->mem_type == MEM_MMAPHUGE && !o->mmapfile) { log_err("fio: mmaphuge:/path/to/file\n"); return 1; } @@ -240,18 +242,6 @@ static int str_mem_cb(void *data, const char *mem) return 0; } -static int str_verify_cb(void *data, const char *mem) -{ - struct thread_data *td = data; - - if (td->o.verify == VERIFY_CRC32C_INTEL || - td->o.verify == VERIFY_CRC32C) { - crc32c_intel_probe(); - } - - return 0; -} - static int fio_clock_source_cb(void *data, const char *str) { struct thread_data *td = data; @@ -261,12 +251,6 @@ static int fio_clock_source_cb(void *data, const char *str) return 0; } -static int str_lockmem_cb(void fio_unused *data, unsigned long long *val) -{ - mlock_size = *val; - return 0; -} - static int str_rwmix_read_cb(void *data, unsigned long long *val) { struct thread_data *td = data; @@ -652,7 +636,7 @@ static int str_verify_pattern_cb(void *data, const char *input) struct thread_data *td = data; long off; int i = 0, j = 0, len, k, base = 10; - char* loc1, * loc2; + char *loc1, *loc2; loc1 = strstr(input, "0x"); loc2 = strstr(input, "0X"); @@ -962,6 +946,22 @@ static struct opt_group fio_opt_cat_groups[] = { .name = "Clock settings", .mask = FIO_OPT_G_CLOCK, }, + { + .name = "I/O Type", + .mask = FIO_OPT_G_IO_TYPE, + }, + { + .name = "I/O Thinktime", + .mask = FIO_OPT_G_THINKTIME, + }, + { + .name = "Randomizations", + .mask = FIO_OPT_G_RANDOM, + }, + { + .name = "I/O buffers", + .mask = FIO_OPT_G_IO_BUF, + }, { .name = NULL, } @@ -1394,7 +1394,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .parent = "rw", .hide = 1, .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_RANDOM, }, { .name = "use_os_rand", @@ -1406,7 +1406,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .parent = "rw", .hide = 1, .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_RANDOM, }, { .name = "norandommap", @@ -1416,8 +1416,9 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "Accept potential duplicate random blocks", .parent = "rw", .hide = 1, + .hide_on_set = 1, .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_RANDOM, }, { .name = "softrandommap", @@ -1429,7 +1430,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .hide = 1, .def = "0", .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_RANDOM, }, { .name = "nrfiles", @@ -1598,7 +1599,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .def = "0", .inverse = "buffered", .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_IO_TYPE, }, { .name = "buffered", @@ -1610,7 +1611,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .def = "1", .inverse = "direct", .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_IO_TYPE, }, { .name = "overwrite", @@ -1767,10 +1768,9 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .type = FIO_OPT_STR, .off1 = td_var_offset(verify), .help = "Verify data written", - .cb = str_verify_cb, .def = "0", .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_VERIFY, .posval = { { .ival = "0", .oval = VERIFY_NONE, @@ -2118,7 +2118,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .name = "lockmem", .lname = "Lock memory", .type = FIO_OPT_STR_VAL, - .cb = str_lockmem_cb, + .off1 = td_var_offset(lockmem), .help = "Lock down this amount of memory", .def = "0", .interval = 1024 * 1024, @@ -2205,7 +2205,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "Idle time between IO buffers (usec)", .def = "0", .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_THINKTIME, }, { .name = "thinktime_spin", @@ -2217,7 +2217,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .parent = "thinktime", .hide = 1, .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_THINKTIME, }, { .name = "thinktime_blocks", @@ -2229,7 +2229,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .parent = "thinktime", .hide = 1, .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_THINKTIME, }, { .name = "rate", @@ -2296,7 +2296,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "Invalidate buffer/page cache prior to running job", .def = "1", .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_IO_TYPE, }, { .name = "sync", @@ -2308,34 +2308,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .parent = "buffered", .hide = 1, .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, - }, - { - .name = "bwavgtime", - .lname = "Bandwidth average time", - .type = FIO_OPT_INT, - .off1 = td_var_offset(bw_avg_time), - .help = "Time window over which to calculate bandwidth" - " (msec)", - .def = "500", - .parent = "write_bw_log", - .hide = 1, - .interval = 100, - .category = FIO_OPT_C_LOG, - .group = FIO_OPT_G_INVALID, - }, - { - .name = "iopsavgtime", - .lname = "IOPS average time", - .type = FIO_OPT_INT, - .off1 = td_var_offset(iops_avg_time), - .help = "Time window over which to calculate IOPS (msec)", - .def = "500", - .parent = "write_iops_log", - .hide = 1, - .interval = 100, - .category = FIO_OPT_C_LOG, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_IO_TYPE, }, { .name = "create_serialize", @@ -2377,27 +2350,6 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .category = FIO_OPT_C_FILE, .group = FIO_OPT_G_INVALID, }, - { - .name = "cpuload", - .lname = "CPU load", - .type = FIO_OPT_INT, - .off1 = td_var_offset(cpuload), - .help = "Use this percentage of CPU", - .category = FIO_OPT_C_GENERAL, - .group = FIO_OPT_G_INVALID, - }, - { - .name = "cpuchunks", - .lname = "CPU chunk", - .type = FIO_OPT_INT, - .off1 = td_var_offset(cpucycle), - .help = "Length of the CPU burn cycles (usecs)", - .def = "50000", - .parent = "cpuload", - .hide = 1, - .category = FIO_OPT_C_GENERAL, - .group = FIO_OPT_G_INVALID, - }, #ifdef FIO_HAVE_CPU_AFFINITY { .name = "cpumask", @@ -2526,14 +2478,30 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .group = FIO_OPT_G_INVALID, }, { - .name = "hugepage-size", - .lname = "Hugepage size", + .name = "bwavgtime", + .lname = "Bandwidth average time", .type = FIO_OPT_INT, - .off1 = td_var_offset(hugepage_size), - .help = "When using hugepages, specify size of each page", - .def = __fio_stringify(FIO_HUGE_PAGE), - .interval = 1024 * 1024, - .category = FIO_OPT_C_GENERAL, + .off1 = td_var_offset(bw_avg_time), + .help = "Time window over which to calculate bandwidth" + " (msec)", + .def = "500", + .parent = "write_bw_log", + .hide = 1, + .interval = 100, + .category = FIO_OPT_C_LOG, + .group = FIO_OPT_G_INVALID, + }, + { + .name = "iopsavgtime", + .lname = "IOPS average time", + .type = FIO_OPT_INT, + .off1 = td_var_offset(iops_avg_time), + .help = "Time window over which to calculate IOPS (msec)", + .def = "500", + .parent = "write_iops_log", + .hide = 1, + .interval = 100, + .category = FIO_OPT_C_LOG, .group = FIO_OPT_G_INVALID, }, { @@ -2553,7 +2521,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .off1 = td_var_offset(zero_buffers), .help = "Init IO buffers to all zeroes", .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_IO_BUF, }, { .name = "refill_buffers", @@ -2562,7 +2530,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .off1 = td_var_offset(refill_buffers), .help = "Refill IO buffers on every IO submit", .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_IO_BUF, }, { .name = "scramble_buffers", @@ -2572,7 +2540,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "Slightly scramble buffers on every IO submit", .def = "1", .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_IO_BUF, }, { .name = "buffer_compress_percentage", @@ -2584,7 +2552,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "How compressible the buffer is (approximately)", .interval = 5, .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_IO_BUF, }, { .name = "buffer_compress_chunk", @@ -2596,7 +2564,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "Size of compressible region in buffer", .interval = 256, .category = FIO_OPT_C_IO, - .group = FIO_OPT_G_INVALID, + .group = FIO_OPT_G_IO_BUF, }, { .name = "clat_percentiles", @@ -2641,6 +2609,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "Greatly reduce number of gettimeofday() calls", .cb = str_gtod_reduce_cb, .def = "0", + .hide_on_set = 1, .category = FIO_OPT_C_STAT, .group = FIO_OPT_G_INVALID, }, @@ -2817,6 +2786,17 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .category = FIO_OPT_C_GENERAL, .group = FIO_OPT_G_INVALID, }, + { + .name = "hugepage-size", + .lname = "Hugepage size", + .type = FIO_OPT_INT, + .off1 = td_var_offset(hugepage_size), + .help = "When using hugepages, specify size of each page", + .def = __fio_stringify(FIO_HUGE_PAGE), + .interval = 1024 * 1024, + .category = FIO_OPT_C_GENERAL, + .group = FIO_OPT_G_INVALID, + }, { .name = "flow_id", .lname = "I/O flow ID", @@ -3017,14 +2997,12 @@ static char *bc_calc(char *str) sprintf(buf, "echo '%s' | %s", tmp, BC_APP); f = popen(buf, "r"); - if (!f) { + if (!f) return NULL; - } ret = fread(&buf[tmp - str], 1, 128 - (tmp - str), f); - if (ret <= 0) { + if (ret <= 0) return NULL; - } pclose(f); buf[(tmp - str) + ret - 1] = '\0'; @@ -3261,11 +3239,11 @@ void fio_options_mem_dupe(struct thread_data *td) unsigned int fio_get_kb_base(void *data) { - struct thread_data *td = data; + struct thread_options *o = data; unsigned int kb_base = 0; - if (td) - kb_base = td->o.kb_base; + if (o) + kb_base = o->kb_base; if (!kb_base) kb_base = 1024; @@ -3349,3 +3327,9 @@ void fio_options_free(struct thread_data *td) td->eo = NULL; } } + +struct fio_option *fio_option_find(const char *name) +{ + return find_option(fio_options, name); +} +