stats: Add a function to report completion latency percentiles
[fio.git] / init.c
diff --git a/init.c b/init.c
index 26e42ef64fd018c1219f8112929fbd7f91f8a942..a920c6ed87e71e8b0399708fcb12ac0d6361c88a 100644 (file)
--- a/init.c
+++ b/init.c
 
 #include "lib/getopt.h"
 
-static char fio_version_string[] = "fio 1.53";
+static char fio_version_string[] = "fio 1.57";
 
 #define FIO_RANDSEED           (0xb1899bedUL)
 
 static char **ini_file;
-static int max_jobs = MAX_JOBS;
+static int max_jobs = FIO_MAX_JOBS;
 static int dump_cmdline;
 
 static struct thread_data def_thread;
@@ -47,7 +47,6 @@ int warnings_fatal = 0;
 int write_bw_log = 0;
 int read_only = 0;
 
-static int def_timeout;
 static int write_lat_log;
 
 static int prev_group_jobs;
@@ -143,6 +142,11 @@ static struct option l_opts[FIO_NR_OPTIONS] = {
                .has_arg        = no_argument,
                .val            = 'w',
        },
+       {
+               .name           = (char *) "max-jobs",
+               .has_arg        = required_argument,
+               .val            = 'j',
+       },
        {
                .name           = NULL,
        },
@@ -612,6 +616,12 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
 
        td->mutex = fio_mutex_init(0);
 
+       td->ts.clat_percentiles = td->o.clat_percentiles;
+       if (td->o.overwrite_plist)
+               td->ts.percentile_list = td->o.percentile_list;
+       else
+               td->ts.percentile_list = NULL;
+
        td->ts.clat_stat[0].min_val = td->ts.clat_stat[1].min_val = ULONG_MAX;
        td->ts.slat_stat[0].min_val = td->ts.slat_stat[1].min_val = ULONG_MAX;
        td->ts.lat_stat[0].min_val = td->ts.lat_stat[1].min_val = ULONG_MAX;
@@ -771,7 +781,7 @@ static int is_empty_or_comment(char *line)
                        return 1;
                if (line[i] == '#')
                        return 1;
-               if (!isspace(line[i]) && !iscntrl(line[i]))
+               if (!isspace((int) line[i]) && !iscntrl((int) line[i]))
                        return 0;
        }
 
@@ -946,8 +956,6 @@ static int fill_def_thread(void)
         * fill default options
         */
        fio_fill_default_options(&def_thread);
-
-       def_thread.o.timeout = def_timeout;
        return 0;
 }
 
@@ -1019,6 +1027,7 @@ static int setup_thread_area(void)
 
 static void usage(const char *name)
 {
+       printf("%s\n", fio_version_string);
        printf("%s [options] [job options] <job file(s)>\n", name);
        printf("\t--debug=options\tEnable debug logging\n");
        printf("\t--output\tWrite output to file\n");
@@ -1039,6 +1048,7 @@ static void usage(const char *name)
        printf("\t--alloc-size=kb\tSet smalloc pool to this size in kb"
                " (def 1024)\n");
        printf("\t--warnings-fatal Fio parser warnings are fatal\n");
+       printf("\t--max-jobs\tMaximum number of threads/processes to support\n");
        printf("\nFio was written by Jens Axboe <jens.axboe@oracle.com>");
        printf("\n                   Jens Axboe <jaxboe@fusionio.com>\n");
 }
@@ -1154,7 +1164,7 @@ static int parse_cmd_line(int argc, char *argv[])
                        smalloc_pool_size = atoi(optarg);
                        break;
                case 't':
-                       def_timeout = atoi(optarg);
+                       def_thread.o.timeout = atoi(optarg);
                        break;
                case 'l':
                        write_lat_log = 1;
@@ -1247,6 +1257,14 @@ static int parse_cmd_line(int argc, char *argv[])
                case 'w':
                        warnings_fatal = 1;
                        break;
+               case 'j':
+                       max_jobs = atoi(optarg);
+                       if (!max_jobs || max_jobs > REAL_MAX_JOBS) {
+                               log_err("fio: invalid max jobs: %d\n", max_jobs);
+                               do_exit++;
+                               exit_val = 1;
+                       }
+                       break;
                default:
                        do_exit++;
                        exit_val = 1;