1 #ifndef FIO_IOLOG_H 2 #define FIO_IOLOG_H 3 4 #include "lib/rbtree.h" 5 #include "lib/ieee754.h" 6 #include "flist.h" 7 #include "ioengine.h" 8 9 /* 10 * Use for maintaining statistics 11 */ 12 struct io_stat { 13 uint64_t max_val; 14 uint64_t min_val; 15 uint64_t samples; 16 17 fio_fp64_t mean; 18 fio_fp64_t S; 19 }; 20 21 /* 22 * A single data sample 23 */ 24 struct io_sample { 25 uint64_t time; 26 uint64_t val; 27 uint32_t ddir; 28 uint32_t bs; 29 }; 30 31 enum { 32 IO_LOG_TYPE_LAT = 1, 33 IO_LOG_TYPE_CLAT, 34 IO_LOG_TYPE_SLAT, 35 IO_LOG_TYPE_BW, 36 IO_LOG_TYPE_IOPS, 37 }; 38 39 /* 40 * Dynamically growing data sample log 41 */ 42 struct io_log { 43 /* 44 * Entries already logged 45 */ 46 unsigned long nr_samples; 47 unsigned long max_samples; 48 struct io_sample *log; 49 50 unsigned int log_type; 51 52 /* 53 * If we fail extending the log, stop collecting more entries. 54 */ 55 unsigned int disabled; 56 57 /* 58 * Windowed average, for logging single entries average over some 59 * period of time. 60 */ 61 struct io_stat avg_window[DDIR_RWDIR_CNT]; 62 unsigned long avg_msec; 63 unsigned long avg_last; 64 }; 65 66 enum { 67 IP_F_ONRB = 1, 68 IP_F_ONLIST = 2, 69 IP_F_TRIMMED = 4, 70 IP_F_IN_FLIGHT = 8, 71 }; 72 73 /* 74 * When logging io actions, this matches a single sent io_u 75 */ 76 struct io_piece { 77 union { 78 struct rb_node rb_node; 79 struct flist_head list; 80 }; 81 struct flist_head trim_list; 82 union { 83 int fileno; 84 struct fio_file *file; 85 }; 86 unsigned long long offset; 87 unsigned short numberio; 88 unsigned long len; 89 unsigned int flags; 90 enum fio_ddir ddir; 91 union { 92 unsigned long delay; 93 unsigned int file_action; 94 }; 95 }; 96 97 /* 98 * Log exports 99 */ 100 enum file_log_act { 101 FIO_LOG_ADD_FILE, 102 FIO_LOG_OPEN_FILE, 103 FIO_LOG_CLOSE_FILE, 104 FIO_LOG_UNLINK_FILE, 105 }; 106 107 struct io_u; 108 extern int __must_check read_iolog_get(struct thread_data *, struct io_u *); 109 extern void log_io_u(struct thread_data *, struct io_u *); 110 extern void log_file(struct thread_data *, struct fio_file *, enum file_log_act); 111 extern int __must_check init_iolog(struct thread_data *td); 112 extern void log_io_piece(struct thread_data *, struct io_u *); 113 extern void unlog_io_piece(struct thread_data *, struct io_u *); 114 extern void trim_io_piece(struct thread_data *, struct io_u *); 115 extern void queue_io_piece(struct thread_data *, struct io_piece *); 116 extern void prune_io_piece_log(struct thread_data *); 117 extern void write_iolog_close(struct thread_data *); 118 119 /* 120 * Logging 121 */ 122 extern void finalize_logs(struct thread_data *td); 123 extern void add_lat_sample(struct thread_data *, enum fio_ddir, unsigned long, 124 unsigned int); 125 extern void add_clat_sample(struct thread_data *, enum fio_ddir, unsigned long, 126 unsigned int); 127 extern void add_slat_sample(struct thread_data *, enum fio_ddir, unsigned long, 128 unsigned int); 129 extern void add_bw_sample(struct thread_data *, enum fio_ddir, unsigned int, 130 struct timeval *); 131 extern void add_iops_sample(struct thread_data *, enum fio_ddir, unsigned int, 132 struct timeval *); 133 extern void init_disk_util(struct thread_data *); 134 extern void update_rusage_stat(struct thread_data *); 135 extern void setup_log(struct io_log **, unsigned long, int); 136 extern void __finish_log(struct io_log *, const char *); 137 extern struct io_log *agg_io_log[DDIR_RWDIR_CNT]; 138 extern int write_bw_log; 139 extern void add_agg_sample(unsigned long, enum fio_ddir, unsigned int); 140 extern void fio_writeout_logs(struct thread_data *); 141 142 static inline void init_ipo(struct io_piece *ipo) 143 { 144 memset(ipo, 0, sizeof(*ipo)); 145 INIT_FLIST_HEAD(&ipo->trim_list); 146 } 147 148 #endif 149