t/nvmept_trim: increase transfer size for some tests
[fio.git] / init.c
diff --git a/init.c b/init.c
index e020d452f973413950a70f855a49b35684f686dc..ff3e9a90d551500b3880df95c2505e3a7df9e684 100644 (file)
--- a/init.c
+++ b/init.c
@@ -618,6 +618,19 @@ static int fixup_options(struct thread_data *td)
                ret |= 1;
        }
 
+       if (td_trimwrite(td) && o->num_range > 1) {
+               log_err("fio: trimwrite cannot be used with multiple"
+                       " ranges.\n");
+               ret |= 1;
+       }
+
+       if (td_trim(td) && o->num_range > 1 &&
+           !td_ioengine_flagged(td, FIO_MULTI_RANGE_TRIM)) {
+               log_err("fio: can't use multiple ranges with IO engine %s\n",
+                       td->io_ops->name);
+               ret |= 1;
+       }
+
 #ifndef CONFIG_PSHARED
        if (!o->use_thread) {
                log_info("fio: this platform does not support process shared"
@@ -951,13 +964,16 @@ static int fixup_options(struct thread_data *td)
        if (o->disable_slat)
                o->slat_percentiles = 0;
 
-       /*
-        * Fix these up to be nsec internally
-        */
-       for_each_rw_ddir(ddir)
-               o->max_latency[ddir] *= 1000ULL;
+       /* Do this only for the parent job */
+       if (!td->subjob_number) {
+               /*
+                * Fix these up to be nsec internally
+                */
+               for_each_rw_ddir(ddir)
+                       o->max_latency[ddir] *= 1000ULL;
 
-       o->latency_target *= 1000ULL;
+               o->latency_target *= 1000ULL;
+       }
 
        /*
         * Dedupe working set verifications
@@ -999,7 +1015,15 @@ static int fixup_options(struct thread_data *td)
                ret |= 1;
        }
 
-
+       if (td->o.fdp) {
+               if (fio_option_is_set(&td->o, dp_type) &&
+                       (td->o.dp_type == FIO_DP_STREAMS || td->o.dp_type == FIO_DP_NONE)) {
+                       log_err("fio: fdp=1 is not compatible with dataplacement={streams, none}\n");
+                       ret |= 1;
+               } else {
+                       td->o.dp_type = FIO_DP_FDP;
+               }
+       }
        return ret;
 }
 
@@ -1020,12 +1044,18 @@ static void init_rand_file_service(struct thread_data *td)
        }
 }
 
-static void td_fill_rand_seeds_internal(struct thread_data *td, bool use64)
+void td_fill_rand_seeds(struct thread_data *td)
 {
        uint64_t read_seed = td->rand_seeds[FIO_RAND_BS_OFF];
        uint64_t write_seed = td->rand_seeds[FIO_RAND_BS1_OFF];
        uint64_t trim_seed = td->rand_seeds[FIO_RAND_BS2_OFF];
        int i;
+       bool use64;
+
+       if (td->o.random_generator == FIO_RAND_GEN_TAUSWORTHE64)
+               use64 = true;
+       else
+               use64 = false;
 
        /*
         * trimwrite is special in that we need to generate the same
@@ -1073,22 +1103,8 @@ static void td_fill_rand_seeds_internal(struct thread_data *td, bool use64)
 
        init_rand_seed(&td->buf_state, td->rand_seeds[FIO_RAND_BUF_OFF], use64);
        frand_copy(&td->buf_state_prev, &td->buf_state);
-}
-
-void td_fill_rand_seeds(struct thread_data *td)
-{
-       bool use64;
-
-       if (td->o.random_generator == FIO_RAND_GEN_TAUSWORTHE64)
-               use64 = true;
-       else
-               use64 = false;
 
-       td_fill_rand_seeds_internal(td, use64);
-
-       dprint(FD_RANDOM, "FIO_RAND_NR_OFFS=%d\n", FIO_RAND_NR_OFFS);
-       for (int i = 0; i < FIO_RAND_NR_OFFS; i++)
-               dprint(FD_RANDOM, "rand_seeds[%d]=%" PRIu64 "\n", i, td->rand_seeds[i]);
+       init_rand_seed(&td->fdp_state, td->rand_seeds[FIO_RAND_FDP_OFF], use64);
 }
 
 static int setup_random_seeds(struct thread_data *td)
@@ -1098,6 +1114,7 @@ static int setup_random_seeds(struct thread_data *td)
 
        if (!td->o.rand_repeatable && !fio_option_is_set(&td->o, rand_seed)) {
                int ret = init_random_seeds(td->rand_seeds, sizeof(td->rand_seeds));
+               dprint(FD_RANDOM, "using system RNG for random seeds\n");
                if (ret)
                        return ret;
        } else {
@@ -1111,17 +1128,12 @@ static int setup_random_seeds(struct thread_data *td)
                }
        }
 
-       if (td->o.allrand_repeatable) {
-               unsigned int i;
-
-               for (i = 0; i < FIO_RAND_NR_OFFS; i++)
-                       td->rand_seeds[i] = FIO_RANDSEED * td->thread_number + i;
-       }
+       td_fill_rand_seeds(td);
 
-       if (td->o.rand_repeatable)
-               td->rand_seeds[FIO_RAND_BLOCK_OFF] = FIO_RANDSEED * td->thread_number;
+       dprint(FD_RANDOM, "FIO_RAND_NR_OFFS=%d\n", FIO_RAND_NR_OFFS);
+       for (int i = 0; i < FIO_RAND_NR_OFFS; i++)
+               dprint(FD_RANDOM, "rand_seeds[%d]=%" PRIu64 "\n", i, td->rand_seeds[i]);
 
-       td_fill_rand_seeds(td);
        return 0;
 }
 
@@ -1960,8 +1972,7 @@ static int __parse_jobs_ini(struct thread_data *td,
         * it's really 256 + small bit, 280 should suffice
         */
        if (!nested) {
-               name = malloc(280);
-               memset(name, 0, 280);
+               name = calloc(1, 280);
        }
 
        opts = NULL;