server: add missing IOLOG command to text list
[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         uint64_t time;
25         uint64_t val;
26         uint32_t ddir;
27         uint32_t bs;
28 };
29
30 enum {
31         IO_LOG_TYPE_LAT = 1,
32         IO_LOG_TYPE_CLAT,
33         IO_LOG_TYPE_SLAT,
34         IO_LOG_TYPE_BW,
35         IO_LOG_TYPE_IOPS,
36 };
37
38 /*
39  * Dynamically growing data sample log
40  */
41 struct io_log {
42         /*
43          * Entries already logged
44          */
45         unsigned long nr_samples;
46         unsigned long max_samples;
47         struct io_sample *log;
48
49         unsigned int log_type;
50
51         /*
52          * Windowed average, for logging single entries average over some
53          * period of time.
54          */
55         struct io_stat avg_window[2];
56         unsigned long avg_msec;
57         unsigned long avg_last;
58 };
59
60 enum {
61         IP_F_ONRB       = 1,
62         IP_F_ONLIST     = 2,
63         IP_F_TRIMMED    = 4,
64 };
65
66 /*
67  * When logging io actions, this matches a single sent io_u
68  */
69 struct io_piece {
70         union {
71                 struct rb_node rb_node;
72                 struct flist_head list;
73         };
74         struct flist_head trim_list;
75         union {
76                 int fileno;
77                 struct fio_file *file;
78         };
79         unsigned long long offset;
80         unsigned long len;
81         unsigned int flags;
82         enum fio_ddir ddir;
83         union {
84                 unsigned long delay;
85                 unsigned int file_action;
86         };
87 };
88
89 /*
90  * Log exports
91  */
92 enum file_log_act {
93         FIO_LOG_ADD_FILE,
94         FIO_LOG_OPEN_FILE,
95         FIO_LOG_CLOSE_FILE,
96         FIO_LOG_UNLINK_FILE,
97 };
98
99 extern int __must_check read_iolog_get(struct thread_data *, struct io_u *);
100 extern void log_io_u(struct thread_data *, struct io_u *);
101 extern void log_file(struct thread_data *, struct fio_file *, enum file_log_act);
102 extern int __must_check init_iolog(struct thread_data *td);
103 extern void log_io_piece(struct thread_data *, struct io_u *);
104 extern void queue_io_piece(struct thread_data *, struct io_piece *);
105 extern void prune_io_piece_log(struct thread_data *);
106 extern void write_iolog_close(struct thread_data *);
107
108 /*
109  * Logging
110  */
111 extern void add_lat_sample(struct thread_data *, enum fio_ddir, unsigned long,
112                                 unsigned int);
113 extern void add_clat_sample(struct thread_data *, enum fio_ddir, unsigned long,
114                                 unsigned int);
115 extern void add_slat_sample(struct thread_data *, enum fio_ddir, unsigned long,
116                                 unsigned int);
117 extern void add_bw_sample(struct thread_data *, enum fio_ddir, unsigned int,
118                                 struct timeval *);
119 extern void add_iops_sample(struct thread_data *, enum fio_ddir, struct timeval *);
120 extern void init_disk_util(struct thread_data *);
121 extern void update_rusage_stat(struct thread_data *);
122 extern void update_io_ticks(void);
123 extern void setup_log(struct io_log **, unsigned long, int);
124 extern void finish_log(struct thread_data *, struct io_log *, const char *);
125 extern void finish_log_named(struct thread_data *, struct io_log *, const char *, const char *);
126 extern void __finish_log(struct io_log *, const char *);
127 extern struct io_log *agg_io_log[2];
128 extern int write_bw_log;
129 extern void add_agg_sample(unsigned long, enum fio_ddir, unsigned int);
130
131 static inline void init_ipo(struct io_piece *ipo)
132 {
133         memset(ipo, 0, sizeof(*ipo));
134         INIT_FLIST_HEAD(&ipo->trim_list);
135 }
136
137 #endif