client: fix missing pdu->log_offset endianness conversion
[fio.git] / iolog.h
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 struct io_sample_offset {
32         struct io_sample s;
33         uint64_t offset;
34 };
35
36 enum {
37         IO_LOG_TYPE_LAT = 1,
38         IO_LOG_TYPE_CLAT,
39         IO_LOG_TYPE_SLAT,
40         IO_LOG_TYPE_BW,
41         IO_LOG_TYPE_IOPS,
42 };
43
44 /*
45  * Dynamically growing data sample log
46  */
47 struct io_log {
48         /*
49          * Entries already logged
50          */
51         uint64_t nr_samples;
52         uint64_t max_samples;
53         void *log;
54
55         unsigned int log_type;
56
57         /*
58          * If we fail extending the log, stop collecting more entries.
59          */
60         unsigned int disabled;
61
62         /*
63          * Log offsets
64          */
65         unsigned int log_offset;
66
67         /*
68          * Windowed average, for logging single entries average over some
69          * period of time.
70          */
71         struct io_stat avg_window[DDIR_RWDIR_CNT];
72         unsigned long avg_msec;
73         unsigned long avg_last;
74 };
75
76 static inline size_t __log_entry_sz(int log_offset)
77 {
78         if (log_offset)
79                 return sizeof(struct io_sample_offset);
80         else
81                 return sizeof(struct io_sample);
82 }
83
84 static inline size_t log_entry_sz(struct io_log *log)
85 {
86         return __log_entry_sz(log->log_offset);
87 }
88
89 static inline struct io_sample *__get_sample(void *samples, int log_offset,
90                                              uint64_t sample)
91 {
92         return samples + sample * __log_entry_sz(log_offset);
93 }
94
95 static inline struct io_sample *get_sample(struct io_log *iolog,
96                                            uint64_t sample)
97 {
98         return __get_sample(iolog->log, iolog->log_offset, sample);
99 }
100
101 enum {
102         IP_F_ONRB       = 1,
103         IP_F_ONLIST     = 2,
104         IP_F_TRIMMED    = 4,
105         IP_F_IN_FLIGHT  = 8,
106 };
107
108 /*
109  * When logging io actions, this matches a single sent io_u
110  */
111 struct io_piece {
112         union {
113                 struct rb_node rb_node;
114                 struct flist_head list;
115         };
116         struct flist_head trim_list;
117         union {
118                 int fileno;
119                 struct fio_file *file;
120         };
121         unsigned long long offset;
122         unsigned short numberio;
123         unsigned long len;
124         unsigned int flags;
125         enum fio_ddir ddir;
126         union {
127                 unsigned long delay;
128                 unsigned int file_action;
129         };
130 };
131
132 /*
133  * Log exports
134  */
135 enum file_log_act {
136         FIO_LOG_ADD_FILE,
137         FIO_LOG_OPEN_FILE,
138         FIO_LOG_CLOSE_FILE,
139         FIO_LOG_UNLINK_FILE,
140 };
141
142 struct io_u;
143 extern int __must_check read_iolog_get(struct thread_data *, struct io_u *);
144 extern void log_io_u(struct thread_data *, struct io_u *);
145 extern void log_file(struct thread_data *, struct fio_file *, enum file_log_act);
146 extern int __must_check init_iolog(struct thread_data *td);
147 extern void log_io_piece(struct thread_data *, struct io_u *);
148 extern void unlog_io_piece(struct thread_data *, struct io_u *);
149 extern void trim_io_piece(struct thread_data *, struct io_u *);
150 extern void queue_io_piece(struct thread_data *, struct io_piece *);
151 extern void prune_io_piece_log(struct thread_data *);
152 extern void write_iolog_close(struct thread_data *);
153
154 /*
155  * Logging
156  */
157 extern void finalize_logs(struct thread_data *td);
158 extern void add_lat_sample(struct thread_data *, enum fio_ddir, unsigned long,
159                                 unsigned int, uint64_t);
160 extern void add_clat_sample(struct thread_data *, enum fio_ddir, unsigned long,
161                                 unsigned int, uint64_t);
162 extern void add_slat_sample(struct thread_data *, enum fio_ddir, unsigned long,
163                                 unsigned int, uint64_t);
164 extern void add_bw_sample(struct thread_data *, enum fio_ddir, unsigned int,
165                                 struct timeval *);
166 extern void add_iops_sample(struct thread_data *, enum fio_ddir, unsigned int,
167                                 struct timeval *);
168 extern void init_disk_util(struct thread_data *);
169 extern void update_rusage_stat(struct thread_data *);
170 extern void setup_log(struct io_log **, unsigned long, int, int);
171 extern void __finish_log(struct io_log *, const char *);
172 extern struct io_log *agg_io_log[DDIR_RWDIR_CNT];
173 extern int write_bw_log;
174 extern void add_agg_sample(unsigned long, enum fio_ddir, unsigned int);
175 extern void fio_writeout_logs(struct thread_data *);
176
177 static inline void init_ipo(struct io_piece *ipo)
178 {
179         memset(ipo, 0, sizeof(*ipo));
180         INIT_FLIST_HEAD(&ipo->trim_list);
181 }
182
183 #endif