log: add support for logging max instead of averages
[fio.git] / options.c
index 49d66002602de97baf7899d643cb755c6ec1b204..390208729f0db12955cc3a19f72f1d04d9a40b1f 100644 (file)
--- a/options.c
+++ b/options.c
 #include "lib/fls.h"
 #include "lib/pattern.h"
 #include "options.h"
-
-#include "crc/crc32c.h"
+#include "optgroup.h"
 
 char client_sockaddr_str[INET6_ADDRSTRLEN] = { 0 };
 
-struct pattern_fmt_desc fmt_desc[] = {
-       {
-               .fmt   = "%o",
-               .len   = FIELD_SIZE(struct io_u *, offset),
-               .paste = paste_blockoff
-       }
-};
-
 /*
  * Check if mmap/mmaphuge has a :/foo/bar/file at the end. If so, return that.
  */
@@ -50,7 +41,7 @@ static int bs_cmp(const void *p1, const void *p2)
        const struct bssplit *bsp1 = p1;
        const struct bssplit *bsp2 = p2;
 
-       return bsp1->perc < bsp2->perc;
+       return (int) bsp1->perc - (int) bsp2->perc;
 }
 
 static int bssplit_ddir(struct thread_options *o, int ddir, char *str)
@@ -963,13 +954,20 @@ static int str_dedupe_cb(void *data, unsigned long long *il)
 
 static int str_verify_pattern_cb(void *data, const char *input)
 {
+       struct pattern_fmt_desc fmt_desc[] = {
+               {
+                       .fmt   = "%o",
+                       .len   = FIELD_SIZE(struct io_u *, offset),
+                       .paste = paste_blockoff
+               }
+       };
        struct thread_data *td = data;
        int ret;
 
        td->o.verify_fmt_sz = ARRAY_SIZE(td->o.verify_fmt);
        ret = parse_and_fill_pattern(input, strlen(input), td->o.verify_pattern,
-                                    MAX_PATTERN_SIZE, fmt_desc, sizeof(fmt_desc),
-                                    td->o.verify_fmt, &td->o.verify_fmt_sz);
+                       MAX_PATTERN_SIZE, fmt_desc, sizeof(fmt_desc),
+                       td->o.verify_fmt, &td->o.verify_fmt_sz);
        if (ret < 0)
                return 1;
 
@@ -1042,170 +1040,6 @@ static int gtod_cpu_verify(struct fio_option *o, void *data)
        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,
-                                              uint64_t *mask,
-                                              uint64_t 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(uint64_t *mask)
-{
-       return __opt_group_from_mask(fio_opt_groups, mask, FIO_OPT_C_INVALID);
-}
-
-static struct opt_group fio_opt_cat_groups[] = {
-       {
-               .name   = "Latency profiling",
-               .mask   = FIO_OPT_G_LATPROF,
-       },
-       {
-               .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   = "MTD",
-               .mask   = FIO_OPT_G_MTD,
-       },
-
-       {
-               .name   = NULL,
-       }
-};
-
-struct opt_group *opt_group_cat_from_mask(uint64_t *mask)
-{
-       return __opt_group_from_mask(fio_opt_cat_groups, mask, FIO_OPT_G_INVALID);
-}
-
 /*
  * Map of job/command line options
  */
@@ -3239,6 +3073,16 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_LOG,
                .group  = FIO_OPT_G_INVALID,
        },
+       {
+               .name   = "log_max_value",
+               .lname  = "Log maximum instead of average",
+               .type   = FIO_OPT_BOOL,
+               .off1   = td_var_offset(log_max),
+               .help   = "Log max sample in a window instead of average",
+               .def    = "0",
+               .category = FIO_OPT_C_LOG,
+               .group  = FIO_OPT_G_INVALID,
+       },
        {
                .name   = "log_offset",
                .lname  = "Log offset of IO",