Add gtod_reduce option
[fio.git] / fio.h
diff --git a/fio.h b/fio.h
index 25318ae52511b90d513c8c387e52b488f2e92174..3e39aeae315b5f05831cd13fedefd0f26b790b02 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -164,6 +164,7 @@ struct io_u {
        union {
                unsigned int index;
                unsigned int seen;
+               void *engine_data;
        };
 
        unsigned int flags;
@@ -194,6 +195,8 @@ enum {
        VERIFY_MD5,                     /* md5 sum data blocks */
        VERIFY_CRC64,                   /* crc64 sum data blocks */
        VERIFY_CRC32,                   /* crc32 sum data blocks */
+       VERIFY_CRC32C,                  /* crc32c sum data blocks */
+       VERIFY_CRC32C_INTEL,            /* crc32c sum data blocks with hw */
        VERIFY_CRC16,                   /* crc16 sum data blocks */
        VERIFY_CRC7,                    /* crc7 sum data blocks */
        VERIFY_SHA256,                  /* sha256 sum data blocks */
@@ -417,6 +420,7 @@ struct thread_options {
        unsigned int iodepth;
        unsigned int iodepth_low;
        unsigned int iodepth_batch;
+       unsigned int iodepth_batch_complete;
 
        unsigned long long size;
        unsigned int fill_device;
@@ -469,6 +473,7 @@ struct thread_options {
        unsigned int fsync_blocks;
        unsigned int start_delay;
        unsigned long long timeout;
+       unsigned long long ramp_time;
        unsigned int overwrite;
        unsigned int bw_avg_time;
        unsigned int loops;
@@ -491,6 +496,10 @@ struct thread_options {
        unsigned int zero_buffers;
        unsigned int refill_buffers;
        unsigned int time_based;
+       unsigned int disable_clat;
+       unsigned int disable_slat;
+       unsigned int disable_bw;
+       unsigned int gtod_reduce;
 
        char *read_iolog_file;
        char *write_iolog_file;
@@ -604,7 +613,11 @@ struct thread_data {
        struct timeval epoch;   /* time job was started */
        struct timeval rw_end[2];
        struct timeval last_issue;
+       struct timeval tv_cache;
+       unsigned int tv_cache_nr;
+       unsigned int tv_cache_mask;
        unsigned int rw_end_set[2];
+       unsigned int ramp_time_over;
 
        /*
         * read/write mixed workload state
@@ -626,12 +639,6 @@ struct thread_data {
         */
        struct flist_head io_log_list;
 
-       /*
-        * timeout handling
-        */
-       struct timeval timeout_end;
-       struct itimerval timer;
-
        /*
         * for fileservice, how often to switch to a new file
         */
@@ -662,13 +669,6 @@ enum {
        FIO_ETA_NEVER,
 };
 
-/*
- * 30 second per-io_u timeout, with 5 second intervals to avoid resetting
- * the timer on each queue operation.
- */
-#define IO_U_TIMEOUT_INC       5
-#define IO_U_TIMEOUT           30
-
 #define __td_verror(td, err, msg, func)                                        \
        do {                                                            \
                if ((td)->error)                                        \
@@ -747,6 +747,10 @@ struct disk_util_stat {
  */
 struct disk_util {
        struct flist_head list;
+       /* If this disk is a slave, hook it into the master's
+        * list using this head.
+        */
+       struct flist_head slavelist;
 
        char *name;
        char *sysfs_root;
@@ -756,6 +760,15 @@ struct disk_util {
        struct disk_util_stat dus;
        struct disk_util_stat last_dus;
 
+       /* For software raids, this entry maintains pointers to the
+        * entries for the slave devices. The disk_util entries for
+        * the slaves devices should primarily be maintained through
+        * the disk_list list, i.e. for memory allocation and
+        * de-allocation, etc. Whereas this list should be used only
+        * for aggregating a software RAID's disk util figures.
+        */
+       struct flist_head slaves;
+
        unsigned long msec;
        struct timeval time;
 };
@@ -813,12 +826,14 @@ extern void rate_throttle(struct thread_data *, unsigned long, unsigned int);
 extern void fill_start_time(struct timeval *);
 extern void fio_gettime(struct timeval *, void *);
 extern void set_genesis_time(void);
+extern int ramp_time_over(struct thread_data *);
+extern int in_ramp_time(struct thread_data *);
 
 /*
  * Init/option functions
  */
 extern int __must_check parse_options(int, char **);
-extern int fio_option_parse(struct thread_data *, const char *);
+extern int fio_options_parse(struct thread_data *, char **, int);
 extern int fio_cmd_option_parse(struct thread_data *, const char *, char *);
 extern void fio_fill_default_options(struct thread_data *);
 extern int fio_show_option_help(const char *);
@@ -879,6 +894,7 @@ enum {
        TD_NOT_CREATED = 0,
        TD_CREATED,
        TD_INITIALIZED,
+       TD_RAMP,
        TD_RUNNING,
        TD_VERIFYING,
        TD_FSYNCING,
@@ -886,6 +902,8 @@ enum {
        TD_REAPED,
 };
 
+extern void td_set_runstate(struct thread_data *, int);
+
 /*
  * Verify helpers
  */
@@ -913,13 +931,16 @@ extern long __must_check io_u_sync_complete(struct thread_data *, struct io_u *)
 extern long __must_check io_u_queued_complete(struct thread_data *, int);
 extern void io_u_queued(struct thread_data *, struct io_u *);
 extern void io_u_log_error(struct thread_data *, struct io_u *);
-extern void io_u_init_timeout(void);
-extern void io_u_set_timeout(struct thread_data *);
 extern void io_u_mark_depth(struct thread_data *, unsigned int);
 extern void io_u_fill_buffer(struct thread_data *td, struct io_u *, unsigned int);
 void io_u_mark_complete(struct thread_data *, unsigned int);
 void io_u_mark_submit(struct thread_data *, unsigned int);
 
+/*
+ * Reset stats after ramp time completes
+ */
+extern void reset_all_stats(struct thread_data *);
+
 /*
  * io engine entry points
  */
@@ -1023,4 +1044,13 @@ static inline void dprint_io_u(struct io_u *io_u, const char *p)
 #define dprint_io_u(io_u, p)
 #endif
 
+static inline int fio_fill_issue_time(struct thread_data *td)
+{
+       if (td->o.read_iolog_file ||
+           !td->o.disable_clat || !td->o.disable_slat || !td->o.disable_bw)
+               return 1;
+
+       return 0;
+}
+
 #endif