Fix up some style
[fio.git] / options.c
index 4c4f52c001c03b89df76ee5547d391a316df2c1e..2daa983e0d9b2ef1002bd10ed6156fe8e5ba486f 100644 (file)
--- a/options.c
+++ b/options.c
@@ -1233,6 +1233,9 @@ static int str_filename_cb(void *data, const char *input)
        strip_blank_front(&str);
        strip_blank_end(str);
 
+       /*
+        * Ignore what we may already have from nrfiles option.
+        */
        if (!td->files_index)
                td->o.nr_files = 0;
 
@@ -1303,8 +1306,17 @@ static int str_buffer_pattern_cb(void *data, const char *input)
 
        assert(ret != 0);
        td->o.buffer_pattern_bytes = ret;
-       if (!td->o.compress_percentage)
+
+       /*
+        * If this job is doing any reading or has compression set,
+        * ensure that we refill buffers for writes or we could be
+        * invalidating the pattern through reads.
+        */
+       if (!td->o.compress_percentage && !td_read(td))
                td->o.refill_buffers = 0;
+       else
+               td->o.refill_buffers = 1;
+
        td->o.scramble_buffers = 0;
        td->o.zero_buffers = 0;
 
@@ -1369,6 +1381,22 @@ static int str_gtod_reduce_cb(void *data, int *il)
        return 0;
 }
 
+static int str_offset_cb(void *data, unsigned long long *__val)
+{
+       struct thread_data *td = cb_data_to_td(data);
+       unsigned long long v = *__val;
+
+       if (parse_is_percent(v)) {
+               td->o.start_offset = 0;
+               td->o.start_offset_percent = -1ULL - v;
+               dprint(FD_PARSE, "SET start_offset_percent %d\n",
+                                       td->o.start_offset_percent);
+       } else
+               td->o.start_offset = v;
+
+       return 0;
+}
+
 static int str_size_cb(void *data, unsigned long long *__val)
 {
        struct thread_data *td = cb_data_to_td(data);
@@ -1769,6 +1797,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)",
@@ -1877,7 +1910,8 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .alias  = "io_limit",
                .lname  = "IO Size",
                .type   = FIO_OPT_STR_VAL,
-               .off1   = offsetof(struct thread_options, io_limit),
+               .off1   = offsetof(struct thread_options, io_size),
+               .help   = "Total size of I/O to be performed",
                .interval = 1024 * 1024,
                .category = FIO_OPT_C_IO,
                .group  = FIO_OPT_G_INVALID,
@@ -1920,6 +1954,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .lname  = "IO offset",
                .alias  = "fileoffset",
                .type   = FIO_OPT_STR_VAL,
+               .cb     = str_offset_cb,
                .off1   = offsetof(struct thread_options, start_offset),
                .help   = "Start IO from this offset",
                .def    = "0",
@@ -1960,7 +1995,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,
@@ -2229,7 +2264,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                          },
                          { .ival = "gauss",
                            .oval = FIO_FSERVICE_GAUSS,
-                           .help = "Normal (gaussian) distribution",
+                           .help = "Normal (Gaussian) distribution",
                          },
                          { .ival = "roundrobin",
                            .oval = FIO_FSERVICE_RR,
@@ -2290,8 +2325,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,
@@ -2576,6 +2629,12 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                            .oval = MEM_MMAPHUGE,
                            .help = "Like mmap, but use huge pages",
                          },
+#endif
+#ifdef CONFIG_CUDA
+                         { .ival = "cudamalloc",
+                           .oval = MEM_CUDA_MALLOC,
+                           .help = "Allocate GPU device memory for GPUDirect RDMA",
+                         },
 #endif
                  },
        },
@@ -2647,6 +2706,22 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                            .oval = VERIFY_SHA512,
                            .help = "Use sha512 checksums for verification",
                          },
+                         { .ival = "sha3-224",
+                           .oval = VERIFY_SHA3_224,
+                           .help = "Use sha3-224 checksums for verification",
+                         },
+                         { .ival = "sha3-256",
+                           .oval = VERIFY_SHA3_256,
+                           .help = "Use sha3-256 checksums for verification",
+                         },
+                         { .ival = "sha3-384",
+                           .oval = VERIFY_SHA3_384,
+                           .help = "Use sha3-384 checksums for verification",
+                         },
+                         { .ival = "sha3-512",
+                           .oval = VERIFY_SHA3_512,
+                           .help = "Use sha3-512 checksums for verification",
+                         },
                          { .ival = "xxhash",
                            .oval = VERIFY_XXHASH,
                            .help = "Use xxhash checksums for verification",
@@ -2862,7 +2937,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,
@@ -2874,7 +2949,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,
@@ -3519,6 +3594,18 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .type   = FIO_OPT_UNSUPPORTED,
                .help   = "Build fio with libnuma-dev(el) to enable this option",
        },
+#endif
+#ifdef CONFIG_CUDA
+       {
+               .name   = "gpu_dev_id",
+               .lname  = "GPU device ID",
+               .type   = FIO_OPT_INT,
+               .off1   = offsetof(struct thread_options, gpu_dev_id),
+               .help   = "Set GPU device ID for GPUDirect RDMA",
+               .def    = "0",
+               .category = FIO_OPT_C_GENERAL,
+               .group  = FIO_OPT_G_INVALID,
+       },
 #endif
        {
                .name   = "end_fsync",
@@ -3822,6 +3909,16 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
                .category = FIO_OPT_C_STAT,
                .group  = FIO_OPT_G_INVALID,
        },
+       {
+               .name   = "stats",
+               .lname  = "Stats",
+               .type   = FIO_OPT_BOOL,
+               .off1   = offsetof(struct thread_options, stats),
+               .help   = "Enable collection of stats",
+               .def    = "1",
+               .category = FIO_OPT_C_STAT,
+               .group  = FIO_OPT_G_INVALID,
+       },
        {
                .name   = "zero_buffers",
                .lname  = "Zero I/O buffers",
@@ -4157,20 +4254,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,
@@ -4298,6 +4395,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",
@@ -4311,6 +4409,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",
@@ -4746,34 +4845,19 @@ int fio_show_option_help(const char *opt)
        return show_cmd_help(fio_options, opt);
 }
 
-void options_mem_dupe(void *data, struct fio_option *options)
-{
-       struct fio_option *o;
-       char **ptr;
-
-       for (o = &options[0]; o->name; o++) {
-               if (o->type != FIO_OPT_STR_STORE)
-                       continue;
-
-               ptr = td_var(data, o, o->off1);
-               if (*ptr)
-                       *ptr = strdup(*ptr);
-       }
-}
-
 /*
  * dupe FIO_OPT_STR_STORE options
  */
 void fio_options_mem_dupe(struct thread_data *td)
 {
-       options_mem_dupe(&td->o, fio_options);
+       options_mem_dupe(fio_options, &td->o);
 
        if (td->eo && td->io_ops) {
                void *oldeo = td->eo;
 
                td->eo = malloc(td->io_ops->option_struct_size);
                memcpy(td->eo, oldeo, td->io_ops->option_struct_size);
-               options_mem_dupe(td->eo, td->io_ops->options);
+               options_mem_dupe(td->io_ops->options, td->eo);
        }
 }