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