From: Jens Axboe Date: Wed, 10 Apr 2013 09:12:21 +0000 (+0200) Subject: Merge branch 'master' into gfio X-Git-Tag: fio-2.1~57^2~7 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=ba9c7219eefcc04e84a4fb4970f4b5caeaf48aa6 Merge branch 'master' into gfio Conflicts: options.c parse.c server.h Signed-off-by: Jens Axboe --- ba9c7219eefcc04e84a4fb4970f4b5caeaf48aa6 diff --cc options.c index c838ee00,193bdbc1..688d28bd --- a/options.c +++ b/options.c @@@ -936,174 -1087,6 +936,161 @@@ static int gtod_cpu_verify(struct fio_o return 0; } - static int kb_base_verify(struct fio_option *o, void *data) - { - struct thread_data *td = data; - - if (td->o.kb_base != 1024 && td->o.kb_base != 1000) { - log_err("fio: kb_base set to nonsensical value: %u\n", - td->o.kb_base); - return 1; - } - - return 0; - } - +/* + * Option grouping + */ +static struct opt_group fio_opt_groups[] = { + { + .name = "General", + .mask = FIO_OPT_C_GENERAL, + }, + { + .name = "I/O", + .mask = FIO_OPT_C_IO, + }, + { + .name = "File", + .mask = FIO_OPT_C_FILE, + }, + { + .name = "Statistics", + .mask = FIO_OPT_C_STAT, + }, + { + .name = "Logging", + .mask = FIO_OPT_C_LOG, + }, + { + .name = "Profiles", + .mask = FIO_OPT_C_PROFILE, + }, + { + .name = NULL, + }, +}; + +static struct opt_group *__opt_group_from_mask(struct opt_group *ogs, unsigned int *mask, + unsigned int inv_mask) +{ + struct opt_group *og; + int i; + + if (*mask == inv_mask || !*mask) + return NULL; + + for (i = 0; ogs[i].name; i++) { + og = &ogs[i]; + + if (*mask & og->mask) { + *mask &= ~(og->mask); + return og; + } + } + + return NULL; +} + +struct opt_group *opt_group_from_mask(unsigned int *mask) +{ + return __opt_group_from_mask(fio_opt_groups, mask, FIO_OPT_C_INVALID); +} + +static struct opt_group fio_opt_cat_groups[] = { + { + .name = "Rate", + .mask = FIO_OPT_G_RATE, + }, + { + .name = "Zone", + .mask = FIO_OPT_G_ZONE, + }, + { + .name = "Read/write mix", + .mask = FIO_OPT_G_RWMIX, + }, + { + .name = "Verify", + .mask = FIO_OPT_G_VERIFY, + }, + { + .name = "Trim", + .mask = FIO_OPT_G_TRIM, + }, + { + .name = "I/O Logging", + .mask = FIO_OPT_G_IOLOG, + }, + { + .name = "I/O Depth", + .mask = FIO_OPT_G_IO_DEPTH, + }, + { + .name = "I/O Flow", + .mask = FIO_OPT_G_IO_FLOW, + }, + { + .name = "Description", + .mask = FIO_OPT_G_DESC, + }, + { + .name = "Filename", + .mask = FIO_OPT_G_FILENAME, + }, + { + .name = "General I/O", + .mask = FIO_OPT_G_IO_BASIC, + }, + { + .name = "Cgroups", + .mask = FIO_OPT_G_CGROUP, + }, + { + .name = "Runtime", + .mask = FIO_OPT_G_RUNTIME, + }, + { + .name = "Process", + .mask = FIO_OPT_G_PROCESS, + }, + { + .name = "Job credentials / priority", + .mask = FIO_OPT_G_CRED, + }, + { + .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 = "Tiobench profile", + .mask = FIO_OPT_G_TIOBENCH, + }, + + { + .name = NULL, + } +}; + +struct opt_group *opt_group_cat_from_mask(unsigned int *mask) +{ + return __opt_group_from_mask(fio_opt_cat_groups, mask, FIO_OPT_G_INVALID); +} + /* * Map of job/command line options */ @@@ -1154,12 -1125,48 +1141,10 @@@ struct fio_option fio_options[FIO_MAX_O .prio = -1, /* must come after "directory" */ .help = "Override default $jobname.$jobnum.$filenum naming", .def = "$jobname.$jobnum.$filenum", - .category = FIO_OPT_C_FILE, - .group = FIO_OPT_G_FILENAME, }, - { - .name = "kb_base", - .type = FIO_OPT_INT, - .off1 = td_var_offset(kb_base), - .prio = 1, - .def = "1024", - .posval = { - { .ival = "1024", - .oval = 1024, - .help = "Use 1024 as the K base", - }, - { .ival = "1000", - .oval = 1000, - .help = "Use 1000 as the K base", - }, - }, - .help = "How many bytes per KB for reporting (1000 or 1024)", - }, - { - .name = "unit_base", - .type = FIO_OPT_INT, - .off1 = td_var_offset(unit_base), - .prio = 1, - .posval = { - { .ival = "0", - .oval = 0, - .help = "Auto-detect", - }, - { .ival = "8", - .oval = 8, - .help = "Normal (byte based)", - }, - { .ival = "1", - .oval = 1, - .help = "Bit based", - }, - }, - .help = "Bit multiple of result summary data (8 for byte, 1 for bit)", - }, { .name = "lockfile", + .lname = "Lockfile", .type = FIO_OPT_STR, .off1 = td_var_offset(file_lock_mode), .help = "Lock file when doing IO to it", @@@ -3064,54 -2608,6 +3049,64 @@@ .type = FIO_OPT_INT, .off1 = td_var_offset(gid), .help = "Run job with this group ID", + .category = FIO_OPT_C_GENERAL, + .group = FIO_OPT_G_CRED, + }, + { + .name = "kb_base", + .lname = "KB Base", + .type = FIO_OPT_INT, + .off1 = td_var_offset(kb_base), - .verify = kb_base_verify, + .prio = 1, + .def = "1024", ++ .posval = { ++ { .ival = "1024", ++ .oval = 1024, ++ .help = "Use 1024 as the K base", ++ }, ++ { .ival = "1000", ++ .oval = 1000, ++ .help = "Use 1000 as the K base", ++ }, ++ }, + .help = "How many bytes per KB for reporting (1000 or 1024)", + .category = FIO_OPT_C_GENERAL, + .group = FIO_OPT_G_INVALID, + }, + { + .name = "unit_base", ++ .lname = "Base unit for reporting (Bits or Bytes)", + .type = FIO_OPT_INT, + .off1 = td_var_offset(unit_base), + .prio = 1, + .posval = { + { .ival = "0", + .oval = 0, + .help = "Auto-detect", + }, + { .ival = "8", + .oval = 8, + .help = "Normal (byte based)", + }, + { .ival = "1", + .oval = 1, + .help = "Bit based", + }, + }, + .help = "Bit multiple of result summary data (8 for byte, 1 for bit)", + .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",