X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.h;h=22fecd9e23c0a8bf52978e546a3c17933f8e6808;hp=a0c1109ab97a8a9d4bb96c8ad9910408a9615266;hb=4e6ea2f1e9b7da6d7d1057670fcc19f063e46fd4;hpb=721938ae7fae0f6d470a7e32e177ea5dce480229 diff --git a/fio.h b/fio.h index a0c1109a..22fecd9e 100644 --- a/fio.h +++ b/fio.h @@ -443,6 +443,7 @@ struct thread_options { unsigned int invalidate_cache; unsigned int create_serialize; unsigned int create_fsync; + unsigned int create_on_open; unsigned int end_fsync; unsigned int sync_io; unsigned int verify; @@ -496,9 +497,17 @@ 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; + unsigned int gtod_cpu; + unsigned int gtod_offload; char *read_iolog_file; char *write_iolog_file; + char *bw_log_file; + char *lat_log_file; /* * Pre-run and post-run shell @@ -534,6 +543,7 @@ struct thread_data { int groupid; struct thread_stat ts; struct fio_file **files; + unsigned int files_size; unsigned int files_index; unsigned int nr_open_files; unsigned int nr_done_files; @@ -609,6 +619,9 @@ 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; @@ -632,12 +645,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 */ @@ -652,11 +659,13 @@ struct thread_data { }; /* - * roundrobin available files, or choose one at random. + * roundrobin available files, or choose one at random, or do each one + * serially. */ enum { FIO_FSERVICE_RANDOM = 1, FIO_FSERVICE_RR = 2, + FIO_FSERVICE_SEQ = 3, }; /* @@ -668,13 +677,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) \ @@ -703,6 +705,8 @@ extern int read_only; extern int eta_print; extern unsigned long done_secs; extern char *job_section; +extern int fio_gtod_offload; +extern int fio_gtod_cpu; extern struct thread_data *threads; @@ -753,6 +757,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; @@ -762,6 +770,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; }; @@ -799,6 +816,7 @@ extern void update_rusage_stat(struct thread_data *); extern void update_io_ticks(void); extern void setup_log(struct io_log **); extern void finish_log(struct thread_data *, struct io_log *, const char *); +extern void finish_log_named(struct thread_data *, struct io_log *, const char *, const char *); extern void __finish_log(struct io_log *, const char *); extern struct io_log *agg_io_log[2]; extern int write_bw_log; @@ -813,13 +831,16 @@ 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 *); extern unsigned long mtime_since_genesis(void); -extern void __usec_sleep(unsigned int); +extern void usec_spin(unsigned int); extern void usec_sleep(struct thread_data *, unsigned long); 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 fio_gtod_init(void); +extern void fio_gtod_update(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 @@ -886,6 +907,7 @@ enum { TD_NOT_CREATED = 0, TD_CREATED, TD_INITIALIZED, + TD_RAMP, TD_RUNNING, TD_VERIFYING, TD_FSYNCING, @@ -893,6 +915,8 @@ enum { TD_REAPED, }; +extern void td_set_runstate(struct thread_data *, int); + /* * Verify helpers */ @@ -920,13 +944,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 */ @@ -1030,4 +1057,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