diskutil.h revision f2f788dd732d97c2c3a5f5dd93223a7bfafcc410
1b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer#ifndef FIO_DISKUTIL_H
2b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer#define FIO_DISKUTIL_H
3b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer
4b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer#define FIO_DU_NAME_SZ		64
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner/*
7b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer * Disk utils as read in /sys/block/<dev>/stat
8b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer */
9b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencerstruct disk_util_stat {
10b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint8_t name[FIO_DU_NAME_SZ];
11b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint32_t ios[2];
12b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint32_t merges[2];
13b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint64_t sectors[2];
14b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint32_t ticks[2];
15b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint32_t io_ticks;
16b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint32_t time_in_queue;
17b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson	uint64_t msec;
18cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson};
19b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson
20b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencerstruct disk_util_agg {
21b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint32_t ios[2];
22b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint32_t merges[2];
23b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint64_t sectors[2];
24b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint32_t ticks[2];
25b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson	uint32_t io_ticks;
26b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint32_t time_in_queue;
27b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	uint32_t slavecount;
28b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	fio_fp64_t max_util;
29b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer};
30b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer
31b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer/*
32b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer * Per-device disk util management
33b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer */
34b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencerstruct disk_util {
35b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	struct flist_head list;
36b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson	/* If this disk is a slave, hook it into the master's
37b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	 * list using this head.
38b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	 */
39b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	struct flist_head slavelist;
40b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson
41b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	char *name;
42b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	char *sysfs_root;
43b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	char path[256];
44b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	int major, minor;
45b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer
46b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	struct disk_util_stat dus;
47b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	struct disk_util_stat last_dus;
48b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer
49b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	struct disk_util_agg agg;
50b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer
51b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	/* For software raids, this entry maintains pointers to the
52b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	 * entries for the slave devices. The disk_util entries for
53b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	 * the slaves devices should primarily be maintained through
54b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	 * the disk_list list, i.e. for memory allocation and
559eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen	 * de-allocation, etc. Whereas this list should be used only
56b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	 * for aggregating a software RAID's disk util figures.
57b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	 */
58e98fc32b0d80663aff215e328bcd297b3141b565Dan Gohman	struct flist_head slaves;
59b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer
60b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	struct timeval time;
61b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer
62b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	struct fio_mutex *lock;
63b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	unsigned long users;
64b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer};
65b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer
66b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencerstatic inline void disk_util_mod(struct disk_util *du, int val)
679eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen{
68b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	if (du) {
69b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer		struct flist_head *n;
70b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer
71b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer		fio_mutex_down(du->lock);
726d2352249af8853c8307a7cf679017b32d27958cJeff Cohen		du->users += val;
73b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer
74b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer		flist_for_each(n, &du->slavelist) {
75b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer			struct disk_util *slave;
76b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer
779eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen			slave = flist_entry(n, struct disk_util, slavelist);
78b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson			slave->users += val;
79b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson		}
80b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer		fio_mutex_up(du->lock);
81b2164e5cb5086f0595e96fdbb5ffc614dea9c441Reid Spencer	}
82b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson}
83b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Andersonstatic inline void disk_util_inc(struct disk_util *du)
84b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson{
85b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson	disk_util_mod(du, 1);
86b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson}
87b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson
88f0eeb9b7f580a3e92c0a740893b7956801eafd52Owen Andersonstatic inline void disk_util_dec(struct disk_util *du)
89cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson{
90cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson	disk_util_mod(du, -1);
91b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson}
92cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson
93cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson#define DISK_UTIL_MSEC	(250)
94b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson
95b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Andersonextern struct flist_head disk_list;
961b19a50cdb292e144ea27bef1cd135efaa6548dfOwen Anderson
97f0eeb9b7f580a3e92c0a740893b7956801eafd52Owen Anderson/*
98cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson * disk util stuff
99cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson */
100cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson#ifdef FIO_HAVE_DISK_UTIL
101cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Andersonextern void print_disk_util(struct disk_util_stat *, struct disk_util_agg *, int terse);
102cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Andersonextern void show_disk_util(int terse);
103b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Andersonextern void free_disk_util(void);
104b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Andersonextern void init_disk_util(struct thread_data *);
105b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Andersonextern void update_io_ticks(void);
106b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson#else
107f0eeb9b7f580a3e92c0a740893b7956801eafd52Owen Anderson#define print_disk_util(dus, agg, terse)
108f0eeb9b7f580a3e92c0a740893b7956801eafd52Owen Anderson#define show_disk_util(terse)
109cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson#define free_disk_util()
110cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson#define init_disk_util(td)
111cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson#define update_io_ticks()
112cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson#endif
113cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson
114cc40f077b018e62e2e6f5dc279e3be84779569ceOwen Anderson#endif
115b849a4dd4bee9ad17e295691087ce09e8d77d685Owen Anderson