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