Add ->bytes_done[] to struct thread_data
[fio.git] / fio.h
diff --git a/fio.h b/fio.h
index f981739e8fc261285056da4bdc65a50bc8757fdb..446482354fd909125c911defe6f27b9ceb83fee9 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -74,6 +74,7 @@ enum {
        TD_F_COMPRESS           = 128,
        TD_F_NOIO               = 256,
        TD_F_COMPRESS_LOG       = 512,
+       TD_F_VSTATE_SAVED       = 1024,
 };
 
 enum {
@@ -123,6 +124,13 @@ struct thread_data {
        uint64_t stat_io_blocks[DDIR_RWDIR_CNT];
        struct timeval iops_sample_time;
 
+       /*
+        * Tracks the last iodepth number of completed writes, if data
+        * verification is enabled
+        */
+       uint64_t *last_write_comp;
+       unsigned int last_write_idx;
+
        volatile int update_rusage;
        struct fio_mutex *rusage_sem;
        struct rusage ru_start;
@@ -137,12 +145,12 @@ struct thread_data {
        unsigned int nr_normal_files;
        union {
                unsigned int next_file;
-               os_random_state_t next_file_state;
-               struct frand_state __next_file_state;
+               struct frand_state next_file_state;
        };
        int error;
        int sig;
        int done;
+       int stop_io;
        pid_t pid;
        char *orig_buffer;
        size_t orig_buffer_size;
@@ -160,22 +168,10 @@ struct thread_data {
 
        unsigned long rand_seeds[FIO_RAND_NR_OFFS];
 
-       union {
-               os_random_state_t bsrange_state;
-               struct frand_state __bsrange_state;
-       };
-       union {
-               os_random_state_t verify_state;
-               struct frand_state __verify_state;
-       };
-       union {
-               os_random_state_t trim_state;
-               struct frand_state __trim_state;
-       };
-       union {
-               os_random_state_t delay_state;
-               struct frand_state __delay_state;
-       };
+       struct frand_state bsrange_state;
+       struct frand_state verify_state;
+       struct frand_state trim_state;
+       struct frand_state delay_state;
 
        struct frand_state buf_state;
        struct frand_state buf_state_prev;
@@ -184,6 +180,8 @@ struct thread_data {
        unsigned int verify_batch;
        unsigned int trim_batch;
 
+       struct thread_io_list *vstate;
+
        int shm_id;
 
        /*
@@ -237,26 +235,34 @@ struct thread_data {
        uint64_t total_io_size;
        uint64_t fill_device_size;
 
-       unsigned long io_issues[DDIR_RWDIR_CNT];
+       /*
+        * Issue side
+        */
+       uint64_t io_issues[DDIR_RWDIR_CNT];
+       uint64_t io_issue_bytes[DDIR_RWDIR_CNT];
+       uint64_t loops;
+
+       /*
+        * Completions
+        */
        uint64_t io_blocks[DDIR_RWDIR_CNT];
        uint64_t this_io_blocks[DDIR_RWDIR_CNT];
        uint64_t io_bytes[DDIR_RWDIR_CNT];
-       uint64_t io_skip_bytes;
        uint64_t this_io_bytes[DDIR_RWDIR_CNT];
+       uint64_t io_skip_bytes;
        uint64_t zone_bytes;
        struct fio_mutex *mutex;
+       uint64_t bytes_done[DDIR_RWDIR_CNT];
 
        /*
         * State for random io, a bitmap of blocks done vs not done
         */
-       union {
-               os_random_state_t random_state;
-               struct frand_state __random_state;
-       };
+       struct frand_state random_state;
 
        struct timeval start;   /* start of this loop */
        struct timeval epoch;   /* time job was started */
        struct timeval last_issue;
+       long time_offset;
        struct timeval tv_cache;
        struct timeval terminate_time;
        unsigned int tv_cache_nr;
@@ -277,10 +283,7 @@ struct thread_data {
        /*
         * read/write mixed workload state
         */
-       union {
-               os_random_state_t rwmix_state;
-               struct frand_state __rwmix_state;
-       };
+       struct frand_state rwmix_state;
        unsigned long rwmix_issues;
        enum fio_ddir rwmix_ddir;
        unsigned int ddir_seq_nr;
@@ -288,10 +291,7 @@ struct thread_data {
        /*
         * rand/seq mixed workload state
         */
-       union {
-               os_random_state_t seq_rand_state[DDIR_RWDIR_CNT];
-               struct frand_state __seq_rand_state[DDIR_RWDIR_CNT];
-       };
+       struct frand_state seq_rand_state[DDIR_RWDIR_CNT];
 
        /*
         * IO history logs for verification. We use a tree for sorting,
@@ -326,10 +326,7 @@ struct thread_data {
        /*
         * For generating file sizes
         */
-       union {
-               os_random_state_t file_size_state;
-               struct frand_state __file_size_state;
-       };
+       struct frand_state file_size_state;
 
        /*
         * Error counts
@@ -403,6 +400,12 @@ extern int nr_clients;
 extern int log_syslog;
 extern int status_interval;
 extern const char fio_version_string[];
+extern int helper_do_stat;
+extern pthread_cond_t helper_cond;
+extern char *trigger_file;
+extern char *trigger_cmd;
+extern char *trigger_remote_cmd;
+extern long long trigger_timeout;
 
 extern struct thread_data *threads;
 
@@ -445,7 +448,7 @@ extern void fio_options_mem_dupe(struct thread_data *);
 extern void options_mem_dupe(void *data, struct fio_option *options);
 extern void td_fill_rand_seeds(struct thread_data *);
 extern void add_job_opts(const char **, int);
-extern char *num2str(unsigned long, int, int, int, int);
+extern char *num2str(uint64_t, int, int, int, int);
 extern int ioengine_load(struct thread_data *);
 extern int parse_dryrun(void);
 extern int fio_running_or_pending_io_threads(void);
@@ -572,16 +575,15 @@ static inline int __should_check_rate(struct thread_data *td,
        return 0;
 }
 
-static inline int should_check_rate(struct thread_data *td,
-                                   uint64_t *bytes_done)
+static inline int should_check_rate(struct thread_data *td)
 {
        int ret = 0;
 
-       if (bytes_done[DDIR_READ])
+       if (td->bytes_done[DDIR_READ])
                ret |= __should_check_rate(td, DDIR_READ);
-       if (bytes_done[DDIR_WRITE])
+       if (td->bytes_done[DDIR_WRITE])
                ret |= __should_check_rate(td, DDIR_WRITE);
-       if (bytes_done[DDIR_TRIM])
+       if (td->bytes_done[DDIR_TRIM])
                ret |= __should_check_rate(td, DDIR_TRIM);
 
        return ret;
@@ -603,7 +605,7 @@ static inline unsigned int td_min_bs(struct thread_data *td)
        return min(td->o.min_bs[DDIR_TRIM], min_bs);
 }
 
-static inline int is_power_of_2(unsigned long val)
+static inline int is_power_of_2(uint64_t val)
 {
        return (val != 0 && ((val & (val - 1)) == 0));
 }
@@ -647,8 +649,12 @@ enum {
        FIO_RAND_DIST_RANDOM    = 0,
        FIO_RAND_DIST_ZIPF,
        FIO_RAND_DIST_PARETO,
+       FIO_RAND_DIST_GAUSS,
 };
 
+#define FIO_DEF_ZIPF           1.1
+#define FIO_DEF_PARETO         0.2
+
 enum {
        FIO_RAND_GEN_TAUSWORTHE = 0,
        FIO_RAND_GEN_LFSR,
@@ -659,4 +665,7 @@ enum {
        FIO_CPUS_SPLIT,
 };
 
+extern void exec_trigger(const char *);
+extern void check_trigger_file(void);
+
 #endif