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
*/
.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",
.type = FIO_OPT_INT,
.off1 = td_var_offset(gid),
.help = "Run job with this group ID",
- .verify = kb_base_verify,
+ .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),
+ .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",