X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=fio.h;h=0a7281925d1b3e5666a7d65da2c8fe24f1d91860;hb=0a4957c60fb35db0973c15c4c2adbd3bac854ccd;hp=31164f5be6562f2b6293629d6db15756c5ee4bde;hpb=2b4f4abec640f36ccdff39de00e74b2234e27116;p=fio.git diff --git a/fio.h b/fio.h index 31164f5b..0a728192 100644 --- a/fio.h +++ b/fio.h @@ -27,6 +27,7 @@ #include "file.h" #include "io_ddir.h" #include "ioengine.h" +#include "iolog.h" #ifdef FIO_HAVE_GUASI #include @@ -36,58 +37,6 @@ #include #endif -/* - * Use for maintaining statistics - */ -struct io_stat { - unsigned long max_val; - unsigned long min_val; - unsigned long samples; - - double mean; - double S; -}; - -/* - * A single data sample - */ -struct io_sample { - unsigned long time; - unsigned long val; - enum fio_ddir ddir; - unsigned int bs; -}; - -/* - * Dynamically growing data sample log - */ -struct io_log { - unsigned long nr_samples; - unsigned long max_samples; - struct io_sample *log; -}; - -/* - * When logging io actions, this matches a single sent io_u - */ -struct io_piece { - union { - struct rb_node rb_node; - struct flist_head list; - }; - union { - int fileno; - struct fio_file *file; - }; - unsigned long long offset; - unsigned long len; - enum fio_ddir ddir; - union { - unsigned long delay; - unsigned int file_action; - }; -}; - struct group_run_stats { unsigned long long max_run[2], min_run[2]; unsigned long long max_bw[2], min_bw[2]; @@ -383,12 +332,10 @@ struct thread_data { struct timeval start; /* start of this loop */ 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; /* @@ -424,16 +371,6 @@ struct thread_data { os_random_state_t file_size_state; }; -/* - * 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, -}; - /* * when should interactive ETA output be generated */ @@ -506,112 +443,6 @@ static inline int should_fsync(struct thread_data *td) return 0; } -/* - * Disk utils as read in /sys/block//stat - */ -struct disk_util_stat { - unsigned ios[2]; - unsigned merges[2]; - unsigned long long sectors[2]; - unsigned ticks[2]; - unsigned io_ticks; - unsigned time_in_queue; -}; - -/* - * Per-device disk util management - */ -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; - char path[256]; - int major, minor; - - 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; - - struct fio_mutex *lock; - unsigned long users; -}; - -static inline void disk_util_inc(struct disk_util *du) -{ - if (du) { - fio_mutex_down(du->lock); - du->users++; - fio_mutex_up(du->lock); - } -} - -static inline void disk_util_dec(struct disk_util *du) -{ - if (du) { - fio_mutex_down(du->lock); - du->users--; - fio_mutex_up(du->lock); - } -} - -#define DISK_UTIL_MSEC (250) - -/* - * Log exports - */ -enum file_log_act { - FIO_LOG_ADD_FILE, - FIO_LOG_OPEN_FILE, - FIO_LOG_CLOSE_FILE, - FIO_LOG_UNLINK_FILE, -}; - -extern int __must_check read_iolog_get(struct thread_data *, struct io_u *); -extern void log_io_u(struct thread_data *, struct io_u *); -extern void log_file(struct thread_data *, struct fio_file *, enum file_log_act); -extern int __must_check init_iolog(struct thread_data *td); -extern void log_io_piece(struct thread_data *, struct io_u *); -extern void queue_io_piece(struct thread_data *, struct io_piece *); -extern void prune_io_piece_log(struct thread_data *); -extern void write_iolog_close(struct thread_data *); - -/* - * Logging - */ -extern void add_clat_sample(struct thread_data *, enum fio_ddir, unsigned long, - unsigned int); -extern void add_slat_sample(struct thread_data *, enum fio_ddir, unsigned long, - unsigned int); -extern void add_bw_sample(struct thread_data *, enum fio_ddir, unsigned int, - struct timeval *); -extern void show_run_stats(void); -extern void init_disk_util(struct thread_data *); -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; -extern void add_agg_sample(unsigned long, enum fio_ddir, unsigned int); - /* * Time functions */ @@ -653,19 +484,6 @@ extern void td_fill_rand_seeds(struct thread_data *); extern void print_thread_status(void); extern void print_status_init(int); -/* - * disk util stuff - */ -#ifdef FIO_HAVE_DISK_UTIL -extern void show_disk_util(void); -extern void init_disk_util(struct thread_data *); -extern void update_io_ticks(void); -#else -#define show_disk_util() -#define init_disk_util(td) -#define update_io_ticks() -#endif - /* * Thread life cycle. Once a thread has a runstate beyond TD_INITIALIZED, it * will never back again. It may cycle between running/verififying/fsyncing. @@ -733,39 +551,6 @@ extern int load_blktrace(struct thread_data *, const char *); } \ } while (0) -static inline void fio_file_reset(struct fio_file *f) -{ - f->last_free_lookup = 0; - f->last_pos = f->file_offset; - if (f->file_map) - memset(f->file_map, 0, f->num_maps * sizeof(int)); -} - -static inline void clear_error(struct thread_data *td) -{ - td->error = 0; - td->verror[0] = '\0'; -} - -#ifdef FIO_INC_DEBUG -static inline void dprint_io_u(struct io_u *io_u, const char *p) -{ - struct fio_file *f = io_u->file; - - dprint(FD_IO, "%s: io_u %p: off=%llu/len=%lu/ddir=%d", p, io_u, - (unsigned long long) io_u->offset, - io_u->buflen, io_u->ddir); - if (fio_debug & (1 << FD_IO)) { - if (f) - log_info("/%s", f->file_name); - - log_info("\n"); - } -} -#else -#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 ||