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