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