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