Sync README with fio usage output
[fio.git] / init.c
diff --git a/init.c b/init.c
index 382fa1ff6de82edc9d74644edcace6a7f233839e..d12b75d5ee33108075731d879d2870b5a11a34ff 100644 (file)
--- a/init.c
+++ b/init.c
 #include "server.h"
 #include "idletime.h"
 #include "filelock.h"
+#include "steadystate.h"
 
 #include "oslib/getopt.h"
 #include "oslib/strcasestr.h"
 
 #include "crc/test.h"
+#include "lib/pow2.h"
 
 const char fio_version_string[] = FIO_VERSION;
 
@@ -822,7 +824,8 @@ static int fixup_options(struct thread_data *td)
         * If size is set but less than the min block size, complain
         */
        if (o->size && o->size < td_min_bs(td)) {
-               log_err("fio: size too small, must be larger than the IO size: %llu\n", (unsigned long long) o->size);
+               log_err("fio: size too small, must not be less than minimum block size: %llu < %u\n",
+                       (unsigned long long) o->size, td_min_bs(td));
                ret = 1;
        }
 
@@ -863,27 +866,6 @@ static int fixup_options(struct thread_data *td)
        return ret;
 }
 
-/*
- * This function leaks the buffer
- */
-char *fio_uint_to_kmg(unsigned int val)
-{
-       char *buf = malloc(32);
-       char post[] = { 0, 'K', 'M', 'G', 'P', 'E', 0 };
-       char *p = post;
-
-       do {
-               if (val & 1023)
-                       break;
-
-               val >>= 10;
-               p++;
-       } while (*p);
-
-       snprintf(buf, 32, "%u%c", val, *p);
-       return buf;
-}
-
 /* External engines are specified by "external:name.o") */
 static const char *get_engine_name(const char *str)
 {
@@ -1526,15 +1508,16 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                        if (!td_ioengine_flagged(td, FIO_NOIO)) {
                                char *c1, *c2, *c3, *c4;
                                char *c5 = NULL, *c6 = NULL;
+                               int i2p = is_power_of_2(o->kb_base);
 
-                               c1 = fio_uint_to_kmg(o->min_bs[DDIR_READ]);
-                               c2 = fio_uint_to_kmg(o->max_bs[DDIR_READ]);
-                               c3 = fio_uint_to_kmg(o->min_bs[DDIR_WRITE]);
-                               c4 = fio_uint_to_kmg(o->max_bs[DDIR_WRITE]);
+                               c1 = num2str(o->min_bs[DDIR_READ], 4, 1, i2p, N2S_BYTE);
+                               c2 = num2str(o->max_bs[DDIR_READ], 4, 1, i2p, N2S_BYTE);
+                               c3 = num2str(o->min_bs[DDIR_WRITE], 4, 1, i2p, N2S_BYTE);
+                               c4 = num2str(o->max_bs[DDIR_WRITE], 4, 1, i2p, N2S_BYTE);
 
                                if (!o->bs_is_seq_rand) {
-                                       c5 = fio_uint_to_kmg(o->min_bs[DDIR_TRIM]);
-                                       c6 = fio_uint_to_kmg(o->max_bs[DDIR_TRIM]);
+                                       c5 = num2str(o->min_bs[DDIR_TRIM], 4, 1, i2p, N2S_BYTE);
+                                       c6 = num2str(o->max_bs[DDIR_TRIM], 4, 1, i2p, N2S_BYTE);
                                }
 
                                log_info("%s: (g=%d): rw=%s, ", td->o.name,
@@ -1542,10 +1525,10 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                                                        ddir_str(o->td_ddir));
 
                                if (o->bs_is_seq_rand)
-                                       log_info("bs(seq/rand)=%s-%s/%s-%s, ",
+                                       log_info("bs=%s-%s,%s-%s, bs_is_seq_rand, ",
                                                        c1, c2, c3, c4);
                                else
-                                       log_info("bs=%s-%s/%s-%s/%s-%s, ",
+                                       log_info("bs=%s-%s,%s-%s,%s-%s, ",
                                                        c1, c2, c3, c4, c5, c6);
 
                                log_info("ioengine=%s, iodepth=%u\n",
@@ -1562,6 +1545,9 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                        log_info("...\n");
        }
 
+       if (td_steadystate_init(td))
+               goto err;
+
        /*
         * recurse add identical jobs, clear numjobs and stonewall options
         * as they don't apply to sub-jobs
@@ -1577,6 +1563,8 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
                td_new->o.stonewall = 0;
                td_new->o.new_group = 0;
                td_new->subjob_number = numjobs;
+               td_new->o.ss_dur = o->ss_dur * 1000000l;
+               td_new->o.ss_limit = o->ss_limit;
 
                if (file_alloced) {
                        if (td_new->files) {
@@ -2007,12 +1995,13 @@ static void usage(const char *name)
        printf("  --runtime\t\tRuntime in seconds\n");
        printf("  --bandwidth-log\tGenerate aggregate bandwidth logs\n");
        printf("  --minimal\t\tMinimal (terse) output\n");
-       printf("  --output-format=x\tOutput format (terse,json,json+,normal)\n");
-       printf("  --terse-version=x\tSet terse version output format to 'x'\n");
+       printf("  --output-format=type\tOutput format (terse,json,json+,normal)\n");
+       printf("  --terse-version=type\tSet terse version output format"
+               " (default 3, or 2 or 4)\n");
        printf("  --version\t\tPrint version info and exit\n");
        printf("  --help\t\tPrint this page\n");
        printf("  --cpuclock-test\tPerform test/validation of CPU clock\n");
-       printf("  --crctest\t\tTest speed of checksum functions\n");
+       printf("  --crctest=type\tTest speed of checksum functions\n");
        printf("  --cmdhelp=cmd\t\tPrint command help, \"all\" for all of"
                " them\n");
        printf("  --enghelp=engine\tPrint ioengine help, or list"
@@ -2028,14 +2017,15 @@ static void usage(const char *name)
        printf(" 't' period passed\n");
        printf("  --readonly\t\tTurn on safety read-only checks, preventing"
                " writes\n");
-       printf("  --section=name\tOnly run specified section in job file\n");
+       printf("  --section=name\tOnly run specified section in job file,"
+               " multiple sections can be specified\n");
        printf("  --alloc-size=kb\tSet smalloc pool to this size in kb"
-               " (def 1024)\n");
+               " (def 16384)\n");
        printf("  --warnings-fatal\tFio parser warnings are fatal\n");
        printf("  --max-jobs=nr\t\tMaximum number of threads/processes to support\n");
        printf("  --server=args\t\tStart a backend fio server\n");
        printf("  --daemonize=pidfile\tBackground fio server, write pid to file\n");
-       printf("  --client=hostname\tTalk to remote backend fio server at hostname\n");
+       printf("  --client=hostname\tTalk to remote backend(s) fio server at hostname\n");
        printf("  --remote-config=file\tTell fio server to load this local job file\n");
        printf("  --idle-prof=option\tReport cpu idleness on a system or percpu basis\n"
                "\t\t\t(option=system,percpu) or run unit work\n"
@@ -2119,6 +2109,14 @@ struct debug_level debug_levels[] = {
          .help = "Log compression logging",
          .shift = FD_COMPRESS,
        },
+       { .name = "steadystate",
+         .help = "Steady state detection logging",
+         .shift = FD_STEADYSTATE,
+       },
+       { .name = "helperthread",
+         .help = "Helper thread logging",
+         .shift = FD_HELPERTHREAD,
+       },
        { .name = NULL, },
 };