#include <string.h>
#include <errno.h>
#include <sys/ipc.h>
+#ifndef FIO_NO_HAVE_SHM_H
#include <sys/shm.h>
+#endif
#include <sys/types.h>
#include <sys/stat.h>
.has_arg = required_argument,
.val = 'C',
},
+ {
+ .name = (char *) "cpuclock-test",
+ .has_arg = no_argument,
+ .val = 'T',
+ },
{
.name = NULL,
},
profile_add_hooks(td);
td->thread_number = thread_number;
+
+ if (!parent || !parent->o.group_reporting)
+ stat_number++;
+
return td;
}
/*
* The low water mark cannot be bigger than the iodepth
*/
- if (o->iodepth_low > o->iodepth || !o->iodepth_low) {
- /*
- * syslet work around - if the workload is sequential,
- * we want to let the queue drain all the way down to
- * avoid seeking between async threads
- */
- if (!strcmp(td->io_ops->name, "syslet-rw") && !td_random(td))
- o->iodepth_low = 1;
- else
- o->iodepth_low = o->iodepth;
- }
+ if (o->iodepth_low > o->iodepth || !o->iodepth_low)
+ o->iodepth_low = o->iodepth;
/*
* If batch number isn't set, default to the same as iodepth
}
}
-#ifndef FIO_HAVE_FDATASYNC
+#ifndef CONFIG_FDATASYNC
if (o->fdatasync_blocks) {
log_info("fio: this platform does not support fdatasync()"
" falling back to using fsync(). Use the 'fsync'"
td->o.compress_percentage = 0;
}
+ /*
+ * Using a non-uniform random distribution excludes usage of
+ * a random map
+ */
+ if (td->o.random_distribution != FIO_RAND_DIST_RANDOM)
+ td->o.norandommap = 1;
+
return ret;
}
static void td_fill_rand_seeds_os(struct thread_data *td)
{
- os_random_seed(td->rand_seeds[0], &td->bsrange_state);
- os_random_seed(td->rand_seeds[1], &td->verify_state);
- os_random_seed(td->rand_seeds[2], &td->rwmix_state);
+ os_random_seed(td->rand_seeds[FIO_RAND_BS_OFF], &td->bsrange_state);
+ os_random_seed(td->rand_seeds[FIO_RAND_VER_OFF], &td->verify_state);
+ os_random_seed(td->rand_seeds[FIO_RAND_MIX_OFF], &td->rwmix_state);
if (td->o.file_service_type == FIO_FSERVICE_RANDOM)
- os_random_seed(td->rand_seeds[3], &td->next_file_state);
+ os_random_seed(td->rand_seeds[FIO_RAND_FILE_OFF], &td->next_file_state);
- os_random_seed(td->rand_seeds[5], &td->file_size_state);
- os_random_seed(td->rand_seeds[6], &td->trim_state);
+ os_random_seed(td->rand_seeds[FIO_RAND_FILE_SIZE_OFF], &td->file_size_state);
+ os_random_seed(td->rand_seeds[FIO_RAND_TRIM_OFF], &td->trim_state);
if (!td_random(td))
return;
if (td->o.rand_repeatable)
- td->rand_seeds[4] = FIO_RANDSEED * td->thread_number;
+ td->rand_seeds[FIO_RAND_BLOCK_OFF] = FIO_RANDSEED * td->thread_number;
- os_random_seed(td->rand_seeds[4], &td->random_state);
+ os_random_seed(td->rand_seeds[FIO_RAND_BLOCK_OFF], &td->random_state);
}
static void td_fill_rand_seeds_internal(struct thread_data *td)
{
- init_rand_seed(&td->__bsrange_state, td->rand_seeds[0]);
- init_rand_seed(&td->__verify_state, td->rand_seeds[1]);
- init_rand_seed(&td->__rwmix_state, td->rand_seeds[2]);
+ init_rand_seed(&td->__bsrange_state, td->rand_seeds[FIO_RAND_BS_OFF]);
+ init_rand_seed(&td->__verify_state, td->rand_seeds[FIO_RAND_VER_OFF]);
+ init_rand_seed(&td->__rwmix_state, td->rand_seeds[FIO_RAND_MIX_OFF]);
if (td->o.file_service_type == FIO_FSERVICE_RANDOM)
- init_rand_seed(&td->__next_file_state, td->rand_seeds[3]);
+ init_rand_seed(&td->__next_file_state, td->rand_seeds[FIO_RAND_FILE_OFF]);
- init_rand_seed(&td->__file_size_state, td->rand_seeds[5]);
- init_rand_seed(&td->__trim_state, td->rand_seeds[6]);
+ init_rand_seed(&td->__file_size_state, td->rand_seeds[FIO_RAND_FILE_SIZE_OFF]);
+ init_rand_seed(&td->__trim_state, td->rand_seeds[FIO_RAND_TRIM_OFF]);
if (!td_random(td))
return;
if (td->o.rand_repeatable)
- td->rand_seeds[4] = FIO_RANDSEED * td->thread_number;
+ td->rand_seeds[FIO_RAND_BLOCK_OFF] = FIO_RANDSEED * td->thread_number;
- init_rand_seed(&td->__random_state, td->rand_seeds[4]);
+ init_rand_seed(&td->__random_state, td->rand_seeds[FIO_RAND_BLOCK_OFF]);
}
void td_fill_rand_seeds(struct thread_data *td)
else
td_fill_rand_seeds_internal(td);
- init_rand_seed(&td->buf_state, td->rand_seeds[7]);
+ init_rand_seed(&td->buf_state, td->rand_seeds[FIO_RAND_BUF_OFF]);
}
return 0;
}
+static void init_flags(struct thread_data *td)
+{
+ struct thread_options *o = &td->o;
+
+ if (o->verify_backlog)
+ td->flags |= TD_F_VER_BACKLOG;
+ if (o->trim_backlog)
+ td->flags |= TD_F_TRIM_BACKLOG;
+ if (o->read_iolog_file)
+ td->flags |= TD_F_READ_IOLOG;
+ if (o->refill_buffers)
+ td->flags |= TD_F_REFILL_BUFFERS;
+ if (o->scramble_buffers)
+ td->flags |= TD_F_SCRAMBLE_BUFFERS;
+ if (o->verify != VERIFY_NONE)
+ td->flags |= TD_F_VER_NONE;
+}
+
/*
* Adds a job to the list of things todo. Sanitizes the various options
* to make sure we don't have conflicts, and initializes various
if (td == &def_thread)
return 0;
+ init_flags(td);
+
/*
* if we are just dumping the output command line, don't add the job
*/
printf(" --terse-version=x\tSet terse version output format to 'x'\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(" --cmdhelp=cmd\t\tPrint command help, \"all\" for all of"
" them\n");
printf(" --enghelp=engine\tPrint ioengine help, or list"
printf(" --daemonize=pidfile\tBackground fio server, write pid to file\n");
printf(" --client=hostname\tTalk to remote backend fio server at hostname\n");
printf("\nFio was written by Jens Axboe <jens.axboe@oracle.com>");
- printf("\n Jens Axboe <jaxboe@fusionio.com>\n");
+ printf("\n Jens Axboe <jaxboe@fusionio.com>\n");
}
#ifdef FIO_INC_DEBUG
optind++;
}
break;
+ case 'T':
+ do_exit++;
+ exit_val = fio_monotonic_clocktest();
+ break;
default:
do_exit++;
exit_val = 1;