TD_F_PROFILE_OPS = 64,
TD_F_COMPRESS = 128,
TD_F_NOIO = 256,
+ TD_F_COMPRESS_LOG = 512,
+ TD_F_VSTATE_SAVED = 1024,
};
enum {
FIO_RAND_SEQ_RAND_WRITE_OFF,
FIO_RAND_SEQ_RAND_TRIM_OFF,
FIO_RAND_START_DELAY,
+ FIO_DEDUPE_OFF,
FIO_RAND_NR_OFFS,
};
char verror[FIO_VERROR_SIZE];
pthread_t thread;
unsigned int thread_number;
+ unsigned int subjob_number;
unsigned int groupid;
struct thread_stat ts;
struct io_log *bw_log;
struct io_log *iops_log;
+ struct tp_data *tp_data;
+
uint64_t stat_io_bytes[DDIR_RWDIR_CNT];
struct timeval bw_sample_time;
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;
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;
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;
+ struct frand_state dedupe_state;
unsigned int verify_batch;
unsigned int trim_batch;
+ struct thread_io_list *vstate;
+
int shm_id;
/*
uint64_t total_io_size;
uint64_t fill_device_size;
- unsigned long io_issues[DDIR_RWDIR_CNT];
+ uint64_t io_issues[DDIR_RWDIR_CNT];
uint64_t io_blocks[DDIR_RWDIR_CNT];
uint64_t this_io_blocks[DDIR_RWDIR_CNT];
uint64_t io_bytes[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;
unsigned int tv_cache_mask;
unsigned int ramp_time_over;
/*
* 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;
/*
* 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,
/*
* 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
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;
-static inline void fio_ro_check(struct thread_data *td, struct io_u *io_u)
+static inline void fio_ro_check(const struct thread_data *td, struct io_u *io_u)
{
assert(!(io_u->ddir == DDIR_WRITE && !td_write(td)));
}
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);
extern int td_bump_runstate(struct thread_data *, int);
extern void td_restore_runstate(struct thread_data *, int);
+/*
+ * Allow 60 seconds for a job to quit on its own, otherwise reap with
+ * a vengeance.
+ */
+#define FIO_REAP_TIMEOUT 60
+
#define TERMINATE_ALL (-1)
extern void fio_terminate_threads(int);
+extern void fio_mark_td_terminate(struct thread_data *);
/*
* Memory helpers
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));
}
FIO_RAND_DIST_PARETO,
};
+#define FIO_DEF_ZIPF 1.1
+#define FIO_DEF_PARETO 0.2
+
enum {
FIO_RAND_GEN_TAUSWORTHE = 0,
FIO_RAND_GEN_LFSR,
FIO_CPUS_SPLIT,
};
+extern void exec_trigger(const char *);
+extern void check_trigger_file(void);
+
#endif