Merge branch 'master' of ssh://brick.kernel.dk/data/git/fio
authorJens Axboe <jens.axboe@oracle.com>
Sun, 9 Aug 2009 20:40:50 +0000 (22:40 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Sun, 9 Aug 2009 20:40:50 +0000 (22:40 +0200)
1  2 
HOWTO
options.c

diff --combined HOWTO
index bc23052d61e568434b23488c150e525d0ee48407,662ebe32acf2e10c1956f8f768171da2f92de244..eb8f453ca309b156d279ce1c7a678cefccb6eb6b
--- 1/HOWTO
--- 2/HOWTO
+++ b/HOWTO
@@@ -158,6 -158,9 +158,9 @@@ specify
  
  $ fio --name=random-writers --ioengine=libaio --iodepth=4 --rw=randwrite --bs=32k --direct=0 --size=64m --numjobs=4
  
+ 4.1 Environment variables
+ -------------------------
  fio also supports environment variable expansion in job files. Any
  substring of the form "${VARNAME}" as part of an option value (in other
  words, on the right of the `='), will be expanded to the value of the
@@@ -188,6 -191,20 +191,20 @@@ numjobs=
  fio ships with a few example job files, you can also look there for
  inspiration.
  
+ 4.2 Reserved keywords
+ ---------------------
+ Additionally, fio has a set of reserved keywords that will be replaced
+ internally with the appropriate value. Those keywords are:
+ $pagesize     The architecture page size of the running system
+ $mb_memory    Megabytes of total memory in the system
+ $ncpus                Number of online available CPUs
+ These can be used on the command line or in the job file, and will be
+ automatically substituted with the current system values when the job
+ is run.
  
  5.0 Detailed list of parameters
  -------------------------------
@@@ -794,8 -811,6 +811,8 @@@ verify=str If writing to a file, fio ca
  
                        sha256  Use sha256 as the checksum function.
  
 +                      sha1    Use optimized sha1 as the checksum function.
 +
                        meta    Write extra information about each io
                                (timestamp, block number etc.). The block
                                number is verified.
diff --combined options.c
index ef20c24bdc2c51e9083c37e51204c93dd8716fac,e085f6ce9c075acd44c6778daee312abda4343e6..ebf5d2e6b240932ae5cbcfa04963e4c16ff26c85
+++ b/options.c
@@@ -1206,10 -1206,6 +1206,10 @@@ static struct fio_option options[] = 
                            .oval = VERIFY_CRC7,
                            .help = "Use crc7 checksums for verification",
                          },
 +                        { .ival = "sha1",
 +                          .oval = VERIFY_SHA1,
 +                          .help = "Use sha1 checksums for verification",
 +                        },
                          { .ival = "sha256",
                            .oval = VERIFY_SHA256,
                            .help = "Use sha256 checksums for verification",
@@@ -1702,14 -1698,102 +1702,102 @@@ void fio_options_dup_and_init(struct op
        }
  }
  
+ struct fio_keyword {
+       const char *word;
+       const char *desc;
+       char *replace;
+ };
+ static struct fio_keyword fio_keywords[] = {
+       {
+               .word   = "$pagesize",
+               .desc   = "Page size in the system",
+       },
+       {
+               .word   = "$mb_memory",
+               .desc   = "Megabytes of memory online",
+       },
+       {
+               .word   = "$ncpus",
+               .desc   = "Number of CPUs online in the system",
+       },
+       {
+               .word   = NULL,
+       },
+ };
+ void fio_keywords_init(void)
+ {
+       unsigned long mb_memory;
+       char buf[128];
+       long l;
+       sprintf(buf, "%lu", page_size);
+       fio_keywords[0].replace = strdup(buf);
+       l = sysconf(_SC_PHYS_PAGES);
+       mb_memory = l * (page_size / 1024UL);
+       sprintf(buf, "%lu", mb_memory);
+       fio_keywords[1].replace = strdup(buf);
+       l = sysconf(_SC_NPROCESSORS_ONLN);
+       sprintf(buf, "%lu", l);
+       fio_keywords[2].replace = strdup(buf);
+ }
+ /*
+  * Look for reserved variable names and replace them with real values
+  */
+ static char *fio_keyword_replace(char *opt)
+ {
+       char *s;
+       int i;
+       for (i = 0; fio_keywords[i].word != NULL; i++) {
+               struct fio_keyword *kw = &fio_keywords[i];
+               while ((s = strstr(opt, kw->word)) != NULL) {
+                       char *new = malloc(strlen(opt) + 1);
+                       char *o_org = opt;
+                       int olen = s - opt;
+                       int len;
+                       /*
+                        * Copy part of the string before the keyword and
+                        * sprintf() the replacement after it.
+                        */
+                       memcpy(new, opt, olen);
+                       len = sprintf(new + olen, "%s", kw->replace);
+                       /*
+                        * If there's more in the original string, copy that
+                        * in too
+                        */
+                       opt += strlen(kw->word) + olen;
+                       if (strlen(opt))
+                               memcpy(new + olen + len, opt, opt - o_org - 1);
+                       /*
+                        * replace opt and free the old opt
+                        */
+                       opt = new;
+                       free(o_org);
+               }
+       }
+       return opt;
+ }
  int fio_options_parse(struct thread_data *td, char **opts, int num_opts)
  {
        int i, ret;
  
        sort_options(opts, options, num_opts);
  
-       for (ret = 0, i = 0; i < num_opts; i++)
+       for (ret = 0, i = 0; i < num_opts; i++) {
+               opts[i] = fio_keyword_replace(opts[i]);
                ret |= parse_option(opts[i], options, td);
+       }
  
        return ret;
  }