Add basic memcpy test
[fio.git] / init.c
diff --git a/init.c b/init.c
index c70f6a0a125549d073d7b273b68fde8a1ae2356e..c34bd1599661597b31b4701e9c8dfa00cb06e8fa 100644 (file)
--- a/init.c
+++ b/init.c
@@ -32,6 +32,7 @@
 
 #include "crc/test.h"
 #include "lib/pow2.h"
+#include "lib/memcpy.h"
 
 const char fio_version_string[] = FIO_VERSION;
 
@@ -78,7 +79,7 @@ unsigned int fio_debug_jobno = -1;
 unsigned int *fio_debug_jobp = NULL;
 
 static char cmd_optstr[256];
-static int did_arg;
+static bool did_arg;
 
 #define FIO_CLIENT_FLAG                (1 << 16)
 
@@ -233,6 +234,11 @@ static struct option l_opts[FIO_NR_OPTIONS] = {
                .has_arg        = optional_argument,
                .val            = 'G',
        },
+       {
+               .name           = (char *) "memcpytest",
+               .has_arg        = optional_argument,
+               .val            = 'M',
+       },
        {
                .name           = (char *) "idle-prof",
                .has_arg        = required_argument,
@@ -925,6 +931,13 @@ static int fixup_options(struct thread_data *td)
                ret = 1;
        }
 
+       /*
+        * Fix these up to be nsec internally
+        */
+       o->max_latency *= 1000ULL;
+       o->latency_target *= 1000ULL;
+       o->latency_window *= 1000ULL;
+
        return ret;
 }
 
@@ -1105,6 +1118,7 @@ int ioengine_load(struct thread_data *td)
 static void init_flags(struct thread_data *td)
 {
        struct thread_options *o = &td->o;
+       int i;
 
        if (o->verify_backlog)
                td->flags |= TD_F_VER_BACKLOG;
@@ -1134,6 +1148,13 @@ static void init_flags(struct thread_data *td)
 
        if (o->mem_type == MEM_CUDA_MALLOC)
                td->flags &= ~TD_F_SCRAMBLE_BUFFERS;
+
+       for (i = 0; i < DDIR_RWDIR_CNT; i++) {
+               if (option_check_rate(td, i)) {
+                       td->flags |= TD_F_CHECK_RATE;
+                       break;
+               }
+       }
 }
 
 static int setup_random_seeds(struct thread_data *td)
@@ -2430,35 +2451,35 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        output_format |= FIO_OUTPUT_TERSE;
                        break;
                case 'h':
-                       did_arg = 1;
+                       did_arg = true;
                        if (!cur_client) {
                                usage(argv[0]);
                                do_exit++;
                        }
                        break;
                case 'c':
-                       did_arg = 1;
+                       did_arg = true;
                        if (!cur_client) {
                                fio_show_option_help(optarg);
                                do_exit++;
                        }
                        break;
                case 'i':
-                       did_arg = 1;
+                       did_arg = true;
                        if (!cur_client) {
                                fio_show_ioengine_help(optarg);
                                do_exit++;
                        }
                        break;
                case 's':
-                       did_arg = 1;
+                       did_arg = true;
                        dump_cmdline = 1;
                        break;
                case 'r':
                        read_only = 1;
                        break;
                case 'v':
-                       did_arg = 1;
+                       did_arg = true;
                        if (!cur_client) {
                                log_info("%s\n", fio_version_string);
                                do_exit++;
@@ -2494,7 +2515,7 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                                do_exit++;
                        break;
                case 'P':
-                       did_arg = 1;
+                       did_arg = true;
                        parse_only = 1;
                        break;
                case 'x': {
@@ -2516,12 +2537,12 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
 #ifdef CONFIG_ZLIB
                case 'X':
                        exit_val = iolog_file_inflate(optarg);
-                       did_arg++;
+                       did_arg = true;
                        do_exit++;
                        break;
 #endif
                case 'p':
-                       did_arg = 1;
+                       did_arg = true;
                        if (exec_profile)
                                free(exec_profile);
                        exec_profile = strdup(optarg);
@@ -2535,7 +2556,7 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                                if (ret)
                                        goto out_free;
                                td = NULL;
-                               did_arg = 1;
+                               did_arg = true;
                        }
                        if (!td) {
                                int is_section = !strncmp(opt, "name", 4);
@@ -2610,7 +2631,7 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        }
                        break;
                case 'S':
-                       did_arg = 1;
+                       did_arg = true;
 #ifndef CONFIG_NO_SHM
                        if (nr_clients) {
                                log_err("fio: can't be both client and server\n");
@@ -2636,14 +2657,14 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                case 'I':
                        if ((ret = fio_idle_prof_parse_opt(optarg))) {
                                /* exit on error and calibration only */
-                               did_arg = 1;
+                               did_arg = true;
                                do_exit++;
                                if (ret == -1)
                                        exit_val = 1;
                        }
                        break;
                case 'C':
-                       did_arg = 1;
+                       did_arg = true;
                        if (is_backend) {
                                log_err("fio: can't be both client and server\n");
                                do_exit++;
@@ -2700,22 +2721,27 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        }
                        break;
                case 'R':
-                       did_arg = 1;
+                       did_arg = true;
                        if (fio_client_add_ini_file(cur_client, optarg, true)) {
                                do_exit++;
                                exit_val = 1;
                        }
                        break;
                case 'T':
-                       did_arg = 1;
+                       did_arg = true;
                        do_exit++;
                        exit_val = fio_monotonic_clocktest(1);
                        break;
                case 'G':
-                       did_arg = 1;
+                       did_arg = true;
                        do_exit++;
                        exit_val = fio_crctest(optarg);
                        break;
+               case 'M':
+                       did_arg = true;
+                       do_exit++;
+                       exit_val = fio_memcpy_test(optarg);
+                       break;
                case 'L': {
                        long long val;