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