17c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe#ifndef FIO_DISKUTIL_H 27c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe#define FIO_DISKUTIL_H 3cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#include "json.h" 4d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe#define FIO_DU_NAME_SZ 64 5d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe 67fe36313273ef051670d16aa27953699fd5cdf06Jens Axboeextern volatile int helper_exit; 727357187b0899380bae5c6748f2b2d034502e162Jens Axboe 8a3b4cf7dcae447729f0f4a4ea122f605b909ed70Jens Axboestruct disk_util_stats { 92a3bf76465a94399b3cb5ced55ddf98d81125fa3Jens Axboe uint64_t ios[2]; 102a3bf76465a94399b3cb5ced55ddf98d81125fa3Jens Axboe uint64_t merges[2]; 11d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe uint64_t sectors[2]; 122a3bf76465a94399b3cb5ced55ddf98d81125fa3Jens Axboe uint64_t ticks[2]; 132a3bf76465a94399b3cb5ced55ddf98d81125fa3Jens Axboe uint64_t io_ticks; 142a3bf76465a94399b3cb5ced55ddf98d81125fa3Jens Axboe uint64_t time_in_queue; 15d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe uint64_t msec; 16d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe}; 17d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe 18a3b4cf7dcae447729f0f4a4ea122f605b909ed70Jens Axboe/* 19a3b4cf7dcae447729f0f4a4ea122f605b909ed70Jens Axboe * Disk utils as read in /sys/block/<dev>/stat 20a3b4cf7dcae447729f0f4a4ea122f605b909ed70Jens Axboe */ 21a3b4cf7dcae447729f0f4a4ea122f605b909ed70Jens Axboestruct disk_util_stat { 22a3b4cf7dcae447729f0f4a4ea122f605b909ed70Jens Axboe uint8_t name[FIO_DU_NAME_SZ]; 23a3b4cf7dcae447729f0f4a4ea122f605b909ed70Jens Axboe struct disk_util_stats s; 24a3b4cf7dcae447729f0f4a4ea122f605b909ed70Jens Axboe}; 25a3b4cf7dcae447729f0f4a4ea122f605b909ed70Jens Axboe 26d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboestruct disk_util_agg { 272a3bf76465a94399b3cb5ced55ddf98d81125fa3Jens Axboe uint64_t ios[2]; 282a3bf76465a94399b3cb5ced55ddf98d81125fa3Jens Axboe uint64_t merges[2]; 29d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe uint64_t sectors[2]; 302a3bf76465a94399b3cb5ced55ddf98d81125fa3Jens Axboe uint64_t ticks[2]; 312a3bf76465a94399b3cb5ced55ddf98d81125fa3Jens Axboe uint64_t io_ticks; 322a3bf76465a94399b3cb5ced55ddf98d81125fa3Jens Axboe uint64_t time_in_queue; 33d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe uint32_t slavecount; 342a3bf76465a94399b3cb5ced55ddf98d81125fa3Jens Axboe uint32_t pad; 35d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe fio_fp64_t max_util; 367c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe}; 377c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe 387c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe/* 397c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe * Per-device disk util management 407c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe */ 417c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboestruct disk_util { 427c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe struct flist_head list; 437c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe /* If this disk is a slave, hook it into the master's 447c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe * list using this head. 457c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe */ 467c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe struct flist_head slavelist; 477c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe 487c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe char *name; 497c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe char *sysfs_root; 504b919f7740f4875d73c0619a08d269d5c679e19fKen Raeburn char path[PATH_MAX]; 517c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe int major, minor; 527c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe 537c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe struct disk_util_stat dus; 547c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe struct disk_util_stat last_dus; 557c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe 56d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe struct disk_util_agg agg; 57d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe 587c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe /* For software raids, this entry maintains pointers to the 597c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe * entries for the slave devices. The disk_util entries for 607c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe * the slaves devices should primarily be maintained through 617c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe * the disk_list list, i.e. for memory allocation and 627c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe * de-allocation, etc. Whereas this list should be used only 637c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe * for aggregating a software RAID's disk util figures. 647c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe */ 657c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe struct flist_head slaves; 667c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe 677c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe struct timeval time; 687c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe 697c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe struct fio_mutex *lock; 707c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe unsigned long users; 717c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe}; 727c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe 73e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboestatic inline void disk_util_mod(struct disk_util *du, int val) 747c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe{ 757c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe if (du) { 76e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe struct flist_head *n; 77e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe 787c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe fio_mutex_down(du->lock); 79e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe du->users += val; 80e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe 81e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe flist_for_each(n, &du->slavelist) { 82e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe struct disk_util *slave; 83e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe 84e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe slave = flist_entry(n, struct disk_util, slavelist); 85e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe slave->users += val; 86e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe } 877c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe fio_mutex_up(du->lock); 887c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe } 897c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe} 90e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboestatic inline void disk_util_inc(struct disk_util *du) 91e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe{ 92e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe disk_util_mod(du, 1); 93e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe} 947c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe 957c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboestatic inline void disk_util_dec(struct disk_util *du) 967c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe{ 97e99ca81de760ab146dbba4105a8691c25cb1dec6Jens Axboe disk_util_mod(du, -1); 987c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe} 997c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe 1007c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe#define DISK_UTIL_MSEC (250) 1017c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe 102d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboeextern struct flist_head disk_list; 103d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe 1047c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe/* 1057c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe * disk util stuff 1067c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe */ 1077c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe#ifdef FIO_HAVE_DISK_UTIL 108f2f788dd732d97c2c3a5f5dd93223a7bfafcc410Jens Axboeextern void print_disk_util(struct disk_util_stat *, struct disk_util_agg *, int terse); 109cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Liextern void show_disk_util(int terse, struct json_object *parent); 110952b05e00103bf45576e1860cde0626bd42ed52aCastor Fuextern void json_array_add_disk_util(struct disk_util_stat *dus, 111952b05e00103bf45576e1860cde0626bd42ed52aCastor Fu struct disk_util_agg *agg, struct json_array *parent); 1127c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboeextern void init_disk_util(struct thread_data *); 1139ec7779f89d4dde9fe1e23d68abaefda54b35de7Jens Axboeextern int update_io_ticks(void); 1149ec7779f89d4dde9fe1e23d68abaefda54b35de7Jens Axboeextern void setup_disk_util(void); 11527357187b0899380bae5c6748f2b2d034502e162Jens Axboeextern void disk_util_prune_entries(void); 1167c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe#else 117941bda94c6b985a16999a22757e7174872682579Jens Axboestatic inline void print_disk_util(struct disk_util_stat *du, 118941bda94c6b985a16999a22757e7174872682579Jens Axboe struct disk_util_agg *agg, int terse) 119941bda94c6b985a16999a22757e7174872682579Jens Axboe{ 120941bda94c6b985a16999a22757e7174872682579Jens Axboe} 121cc372b17f2827e89da79241f1bbaca1e7c650611Shaohua Li#define show_disk_util(terse, parent) 12227357187b0899380bae5c6748f2b2d034502e162Jens Axboe#define disk_util_prune_entries() 1237c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe#define init_disk_util(td) 1249ec7779f89d4dde9fe1e23d68abaefda54b35de7Jens Axboe#define setup_disk_util() 125952b05e00103bf45576e1860cde0626bd42ed52aCastor Fu#define json_array_add_disk_util(dus, agg, parent) 126952b05e00103bf45576e1860cde0626bd42ed52aCastor Fu 1279ec7779f89d4dde9fe1e23d68abaefda54b35de7Jens Axboestatic inline int update_io_ticks(void) 1289ec7779f89d4dde9fe1e23d68abaefda54b35de7Jens Axboe{ 1297fe36313273ef051670d16aa27953699fd5cdf06Jens Axboe return helper_exit; 1309ec7779f89d4dde9fe1e23d68abaefda54b35de7Jens Axboe} 1317c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe#endif 1327c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe 1337c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe#endif 134