Add fill_device option
[fio.git] / fio.h
diff --git a/fio.h b/fio.h
index 6b111555d54363f28e1973b83c700d2b5297e35c..7c39be323f2a193c0b460213059f9545838047eb 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -13,6 +13,7 @@
 #include <string.h>
 #include <getopt.h>
 #include <inttypes.h>
+#include <assert.h>
 
 #include "compiler/compiler.h"
 #include "list.h"
 #include "os/os.h"
 #include "mutex.h"
 
-#ifdef FIO_HAVE_SYSLET
-#include "syslet.h"
-#endif
-
 #ifdef FIO_HAVE_GUASI
 #include <guasi.h>
 #endif
@@ -98,14 +95,6 @@ struct io_piece {
        };
 };
 
-#ifdef FIO_HAVE_SYSLET
-struct syslet_req {
-       struct syslet_uatom atom;       /* the atom to submit */
-       struct syslet_uatom *head;      /* head of the sequence */
-       long ret;                       /* syscall return value */
-};
-#endif
-
 enum {
        IO_U_F_FREE     = 1 << 0,
        IO_U_F_FLIGHT   = 1 << 1,
@@ -127,9 +116,6 @@ struct io_u {
 #ifdef FIO_HAVE_SGIO
                struct sg_io_hdr hdr;
 #endif
-#ifdef FIO_HAVE_SYSLET
-               struct syslet_req req;
-#endif
 #ifdef FIO_HAVE_GUASI
                guasi_req_t greq;
 #endif
@@ -198,6 +184,7 @@ enum {
        VERIFY_SHA256,                  /* sha256 sum data blocks */
        VERIFY_SHA512,                  /* sha512 sum data blocks */
        VERIFY_META,                    /* block_num, timestamp etc. */
+       VERIFY_PATTERN,                 /* verify a specific pattern */
        VERIFY_NULL,                    /* pretend to verify */
 };
 
@@ -276,6 +263,7 @@ enum fio_ioengine_flags {
        FIO_NOEXTEND    = 1 << 3,       /* engine can't extend file */
        FIO_NODISKUTIL  = 1 << 4,       /* diskutil can't handle filename */
        FIO_UNIDIR      = 1 << 5,       /* engine is uni-directional */
+       FIO_NOIO        = 1 << 6,       /* thread does only pseudo IO */
 };
 
 enum fio_file_flags {
@@ -369,6 +357,7 @@ struct thread_stat {
        unsigned long usr_time;
        unsigned long sys_time;
        unsigned long ctx;
+       unsigned long minf, majf;
 
        /*
         * IO depth and latency stats
@@ -384,6 +373,11 @@ struct thread_stat {
        unsigned long total_run_time;
 };
 
+struct bssplit {
+       unsigned int bs;
+       unsigned char perc;
+};
+
 struct thread_options {
        int pad;
        char *description;
@@ -399,6 +393,7 @@ struct thread_options {
        unsigned int iodepth_batch;
 
        unsigned long long size;
+       unsigned int fill_device;
        unsigned long long file_size_low;
        unsigned long long file_size_high;
        unsigned long long start_offset;
@@ -406,6 +401,8 @@ struct thread_options {
        unsigned int bs[2];
        unsigned int min_bs[2];
        unsigned int max_bs[2];
+       struct bssplit *bssplit;
+       unsigned int bssplit_nr;
 
        unsigned int nr_files;
        unsigned int open_files;
@@ -518,6 +515,7 @@ struct thread_data {
        volatile int terminate;
        volatile int runstate;
        unsigned int ioprio;
+       unsigned int ioprio_set;
        unsigned int last_was_sync;
 
        char *mmapfile;
@@ -626,6 +624,15 @@ enum {
        FIO_FSERVICE_RR         = 2,
 };
 
+/*
+ * when should interactive ETA output be generated
+ */
+enum {
+       FIO_ETA_AUTO,
+       FIO_ETA_ALWAYS,
+       FIO_ETA_NEVER,
+};
+
 /*
  * 30 second per-io_u timeout, with 5 second intervals to avoid resetting
  * the timer on each queue operation.
@@ -659,6 +666,8 @@ extern FILE *f_err;
 extern int temp_stall_ts;
 extern unsigned long long mlock_size;
 extern unsigned long page_mask, page_size;
+extern int read_only;
+extern int eta_print;
 
 extern struct thread_data *threads;
 
@@ -667,8 +676,13 @@ extern struct thread_data *threads;
 #define td_rw(td)              (((td)->o.td_ddir & TD_DDIR_RW) == TD_DDIR_RW)
 #define td_random(td)          ((td)->o.td_ddir & TD_DDIR_RAND)
 
+static inline void fio_ro_check(struct thread_data *td, struct io_u *io_u)
+{
+       assert(!(io_u->ddir == DDIR_WRITE && !td_write(td)));
+}
+
 #define BLOCKS_PER_MAP         (8 * sizeof(long))
-#define TO_MAP_BLOCK(td, f, b) ((b) - ((f)->file_offset / (td)->o.rw_min_bs))
+#define TO_MAP_BLOCK(td, f, b) ((b) - ((f)->file_offset / (unsigned long long) (td)->o.rw_min_bs))
 #define RAND_MAP_IDX(td, f, b) (TO_MAP_BLOCK(td, f, b) / BLOCKS_PER_MAP)
 #define RAND_MAP_BIT(td, f, b) (TO_MAP_BLOCK(td, f, b) & (BLOCKS_PER_MAP - 1))
 
@@ -756,8 +770,8 @@ extern void add_agg_sample(unsigned long, enum fio_ddir);
 /*
  * Time functions
  */
-extern unsigned long utime_since(struct timeval *, struct timeval *);
-extern unsigned long utime_since_now(struct timeval *);
+extern unsigned long long utime_since(struct timeval *, struct timeval *);
+extern unsigned long long utime_since_now(struct timeval *);
 extern unsigned long mtime_since(struct timeval *, struct timeval *);
 extern unsigned long mtime_since_now(struct timeval *);
 extern unsigned long time_since_now(struct timeval *);
@@ -877,7 +891,7 @@ extern int __must_check td_io_init(struct thread_data *);
 extern int __must_check td_io_prep(struct thread_data *, struct io_u *);
 extern int __must_check td_io_queue(struct thread_data *, struct io_u *);
 extern int __must_check td_io_sync(struct thread_data *, struct fio_file *);
-extern int __must_check td_io_getevents(struct thread_data *, int, int, struct timespec *);
+extern int __must_check td_io_getevents(struct thread_data *, unsigned int, unsigned int, struct timespec *);
 extern int __must_check td_io_commit(struct thread_data *);
 extern int __must_check td_io_open_file(struct thread_data *, struct fio_file *);
 extern void td_io_close_file(struct thread_data *, struct fio_file *);
@@ -914,7 +928,7 @@ struct ioengine_ops {
        int (*prep)(struct thread_data *, struct io_u *);
        int (*queue)(struct thread_data *, struct io_u *);
        int (*commit)(struct thread_data *);
-       int (*getevents)(struct thread_data *, int, int, struct timespec *);
+       int (*getevents)(struct thread_data *, unsigned int, unsigned int, struct timespec *);
        struct io_u *(*event)(struct thread_data *, int);
        int (*cancel)(struct thread_data *, struct io_u *);
        void (*cleanup)(struct thread_data *);
@@ -924,7 +938,7 @@ struct ioengine_ops {
        void *dlhandle;
 };
 
-#define FIO_IOOPS_VERSION      7
+#define FIO_IOOPS_VERSION      8
 
 extern struct ioengine_ops *load_ioengine(struct thread_data *, const char *);
 extern void register_ioengine(struct ioengine_ops *);