Unify options with gfio
[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
7 /*
8  * Use for maintaining statistics
9  */
10 struct io_stat {
11         uint64_t max_val;
12         uint64_t min_val;
13         uint64_t samples;
14
15         fio_fp64_t mean;
16         fio_fp64_t S;
17 };
18
19 /*
20  * A single data sample
21  */
22 struct io_sample {
23         unsigned long time;
24         unsigned long val;
25         enum fio_ddir ddir;
26         unsigned int bs;
27 };
28
29 /*
30  * Dynamically growing data sample log
31  */
32 struct io_log {
33         /*
34          * Entries already logged
35          */
36         unsigned long nr_samples;
37         unsigned long max_samples;
38         struct io_sample *log;
39
40         /*
41          * Windowed average, for logging single entries average over some
42          * period of time.
43          */
44         struct io_stat avg_window[DDIR_RWDIR_CNT];
45         unsigned long avg_msec;
46         unsigned long avg_last;
47 };
48
49 enum {
50         IP_F_ONRB       = 1,
51         IP_F_ONLIST     = 2,
52         IP_F_TRIMMED    = 4,
53 };
54
55 /*
56  * When logging io actions, this matches a single sent io_u
57  */
58 struct io_piece {
59         union {
60                 struct rb_node rb_node;
61                 struct flist_head list;
62         };
63         struct flist_head trim_list;
64         union {
65                 int fileno;
66                 struct fio_file *file;
67         };
68         unsigned long long offset;
69         unsigned long len;
70         unsigned int flags;
71         enum fio_ddir ddir;
72         union {
73                 unsigned long delay;
74                 unsigned int file_action;
75         };
76 };
77
78 /*
79  * Log exports
80  */
81 enum file_log_act {
82         FIO_LOG_ADD_FILE,
83         FIO_LOG_OPEN_FILE,
84         FIO_LOG_CLOSE_FILE,
85         FIO_LOG_UNLINK_FILE,
86 };
87
88 struct io_u;
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 setup_log(struct io_log **, unsigned long);
113 extern void finish_log(struct thread_data *, struct io_log *, const char *);
114 extern void finish_log_named(struct thread_data *, struct io_log *, const char *, const char *);
115 extern void __finish_log(struct io_log *, const char *);
116 extern struct io_log *agg_io_log[DDIR_RWDIR_CNT];
117 extern int write_bw_log;
118 extern void add_agg_sample(unsigned long, enum fio_ddir, unsigned int);
119
120 static inline void init_ipo(struct io_piece *ipo)
121 {
122         memset(ipo, 0, sizeof(*ipo));
123         INIT_FLIST_HEAD(&ipo->trim_list);
124 }
125
126 #endif