stat.h revision 7fe36313273ef051670d16aa27953699fd5cdf06
1a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#ifndef FIO_STAT_H
2a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_STAT_H
3a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
4ec41265e81c70d8573d1359e27876c37c30c7d9dJens Axboe#include "iolog.h"
5ec41265e81c70d8573d1359e27876c37c30c7d9dJens Axboe
6a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct group_run_stats {
76eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint64_t max_run[DDIR_RWDIR_CNT], min_run[DDIR_RWDIR_CNT];
86eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint64_t max_bw[DDIR_RWDIR_CNT], min_bw[DDIR_RWDIR_CNT];
96eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint64_t io_kb[DDIR_RWDIR_CNT];
106eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint64_t agg[DDIR_RWDIR_CNT];
11a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint32_t kb_base;
12ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan	uint32_t unit_base;
13a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint32_t groupid;
14771e58befea806d2d881953050c4e65329eee382Jens Axboe	uint32_t unified_rw_rep;
15eb663201be7f38339e9177fbbd2b99da30f19e61Jens Axboe} __attribute__((packed));
16a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
17a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe/*
18a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * How many depth levels to log
19a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe */
20a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_MAP_NR	7
21a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_LAT_U_NR 10
22a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_LAT_M_NR 12
23a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
24a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe/*
25a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * Aggregate clat samples to report percentile(s) of them.
26a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
27a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * EXECUTIVE SUMMARY
28a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
29a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * FIO_IO_U_PLAT_BITS determines the maximum statistical error on the
30a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * value of resulting percentiles. The error will be approximately
31a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * 1/2^(FIO_IO_U_PLAT_BITS+1) of the value.
32a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
33a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * FIO_IO_U_PLAT_GROUP_NR and FIO_IO_U_PLAT_BITS determine the maximum
34a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * range being tracked for latency samples. The maximum value tracked
35a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * accurately will be 2^(GROUP_NR + PLAT_BITS -1) microseconds.
36a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
37a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * FIO_IO_U_PLAT_GROUP_NR and FIO_IO_U_PLAT_BITS determine the memory
38a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * requirement of storing those aggregate counts. The memory used will
39a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * be (FIO_IO_U_PLAT_GROUP_NR * 2^FIO_IO_U_PLAT_BITS) * sizeof(int)
40a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * bytes.
41a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
42a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * FIO_IO_U_PLAT_NR is the total number of buckets.
43a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
44a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * DETAILS
45a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
46a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * Suppose the clat varies from 0 to 999 (usec), the straightforward
47a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * method is to keep an array of (999 + 1) buckets, in which a counter
48a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * keeps the count of samples which fall in the bucket, e.g.,
49a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * {[0],[1],...,[999]}. However this consumes a huge amount of space,
50a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * and can be avoided if an approximation is acceptable.
51a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
52a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * One such method is to let the range of the bucket to be greater
53a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * than one. This method has low accuracy when the value is small. For
54a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * example, let the buckets be {[0,99],[100,199],...,[900,999]}, and
55a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * the represented value of each bucket be the mean of the range. Then
56a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * a value 0 has an round-off error of 49.5. To improve on this, we
57a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * use buckets with non-uniform ranges, while bounding the error of
58a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * each bucket within a ratio of the sample value. A simple example
59a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * would be when error_bound = 0.005, buckets are {
60a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * {[0],[1],...,[99]}, {[100,101],[102,103],...,[198,199]},..,
61a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * {[900,909],[910,919]...}  }. The total range is partitioned into
62a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * groups with different ranges, then buckets with uniform ranges. An
63a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * upper bound of the error is (range_of_bucket/2)/value_of_bucket
64a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
65a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * For better efficiency, we implement this using base two. We group
66a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * samples by their Most Significant Bit (MSB), extract the next M bit
67a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * of them as an index within the group, and discard the rest of the
68a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * bits.
69a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
70a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * E.g., assume a sample 'x' whose MSB is bit n (starting from bit 0),
71a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * and use M bit for indexing
72a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
73a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *        | n |    M bits   | bit (n-M-1) ... bit 0 |
74a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
75a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * Because x is at least 2^n, and bit 0 to bit (n-M-1) is at most
76a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * (2^(n-M) - 1), discarding bit 0 to (n-M-1) makes the round-off
77a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * error
78a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
79a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *           2^(n-M)-1    2^(n-M)    1
80a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *      e <= --------- <= ------- = ---
81a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *             2^n          2^n     2^M
82a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
83a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * Furthermore, we use "mean" of the range to represent the bucket,
84a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * the error e can be lowered by half to 1 / 2^(M+1). By using M bits
85a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * as the index, each group must contains 2^M buckets.
86a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
87a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * E.g. Let M (FIO_IO_U_PLAT_BITS) be 6
88a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *      Error bound is 1/2^(6+1) = 0.0078125 (< 1%)
89a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
90a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *	Group	MSB	#discarded	range of		#buckets
91a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *			error_bits	value
92a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *	----------------------------------------------------------------
93a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *	0*	0~5	0		[0,63]			64
94a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *	1*	6	0		[64,127]		64
95a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *	2	7	1		[128,255]		64
96a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *	3	8	2		[256,511]		64
97a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *	4	9	3		[512,1023]		64
98a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *	...	...	...		[...,...]		...
99a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *	18	23	17		[8838608,+inf]**	64
100a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
101a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *  * Special cases: when n < (M-1) or when n == (M-1), in both cases,
102a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *    the value cannot be rounded off. Use all bits of the sample as
103a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *    index.
104a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *
105a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe *  ** If a sample's MSB is greater than 23, it will be counted as 23.
106a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe */
107a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
108a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_PLAT_BITS 6
109a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_PLAT_VAL (1 << FIO_IO_U_PLAT_BITS)
110a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_PLAT_GROUP_NR 19
111a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_PLAT_NR (FIO_IO_U_PLAT_GROUP_NR * FIO_IO_U_PLAT_VAL)
112a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_IO_U_LIST_MAX_LEN 20 /* The size of the default and user-specified
113a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe					list of percentiles */
114a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
115a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define MAX_PATTERN_SIZE	512
116a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_JOBNAME_SIZE	128
1174e59d0f3a3ff569bddb31fe6927a9faf204ae9bfJens Axboe#define FIO_JOBDESC_SIZE	256
118a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#define FIO_VERROR_SIZE		128
119a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
120a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct thread_stat {
121a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	char name[FIO_JOBNAME_SIZE];
122a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	char verror[FIO_VERROR_SIZE];
123ddcc0b69aa4ed04c8681f447a1a6274bb8837a14Jens Axboe	uint32_t error;
1242f122b135b7319ff8dd04dadf31ff28b301051a3Jens Axboe	uint32_t thread_number;
125ddcc0b69aa4ed04c8681f447a1a6274bb8837a14Jens Axboe	uint32_t groupid;
126a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint32_t pid;
1274e59d0f3a3ff569bddb31fe6927a9faf204ae9bfJens Axboe	char description[FIO_JOBDESC_SIZE];
128a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint32_t members;
129771e58befea806d2d881953050c4e65329eee382Jens Axboe	uint32_t unified_rw_rep;
130a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
131a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	/*
132a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 * bandwidth and latency stats
133a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 */
1346eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	struct io_stat clat_stat[DDIR_RWDIR_CNT]; /* completion latency */
1356eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	struct io_stat slat_stat[DDIR_RWDIR_CNT]; /* submission latency */
1366eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	struct io_stat lat_stat[DDIR_RWDIR_CNT]; /* total latency */
1376eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	struct io_stat bw_stat[DDIR_RWDIR_CNT]; /* bandwidth stats */
1386eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	struct io_stat iops_stat[DDIR_RWDIR_CNT]; /* IOPS stats */
139a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
140a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	/*
141a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 * fio system usage accounting
142a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 */
143a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t usr_time;
144a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t sys_time;
145a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t ctx;
146a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t minf, majf;
147a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
148a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	/*
149a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 * IO depth and latency stats
150a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 */
151a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t clat_percentiles;
152435d195a9da120c5a618129cdb73418f4748c20aVincent Kang Fu	uint64_t percentile_precision;
153802ad4a83e92a30b5fdccf117d59fbb69068c054Jens Axboe	fio_fp64_t percentile_list[FIO_IO_U_LIST_MAX_LEN];
154a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
155a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint32_t io_u_map[FIO_IO_U_MAP_NR];
156a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint32_t io_u_submit[FIO_IO_U_MAP_NR];
157a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint32_t io_u_complete[FIO_IO_U_MAP_NR];
158a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint32_t io_u_lat_u[FIO_IO_U_LAT_U_NR];
159a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint32_t io_u_lat_m[FIO_IO_U_LAT_M_NR];
1606eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint32_t io_u_plat[DDIR_RWDIR_CNT][FIO_IO_U_PLAT_NR];
161a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t total_io_u[3];
162a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t short_io_u[3];
16367e149c4c2b580089287813246344908770c3be9Jens Axboe	uint64_t drop_io_u[3];
164a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t total_submit;
165a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t total_complete;
166a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
1676eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint64_t io_bytes[DDIR_RWDIR_CNT];
1686eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint64_t runtime[DDIR_RWDIR_CNT];
169a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t total_run_time;
170a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
171a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	/*
172a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 * IO Error related stats
173a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 */
174a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint16_t continue_on_error;
175a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t total_err_count;
176ddcc0b69aa4ed04c8681f447a1a6274bb8837a14Jens Axboe	uint32_t first_error;
177a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
178a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint32_t kb_base;
179ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan	uint32_t unit_base;
1803e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe
1813e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe	uint32_t latency_depth;
1823e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe	uint64_t latency_target;
18372d83a3352d9fb0f7b3ffa5b4a92de1f9fb02c2cJens Axboe	uint16_t pad;
1843e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe	fio_fp64_t latency_percentile;
1853e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe	uint64_t latency_window;
186eb663201be7f38339e9177fbbd2b99da30f19e61Jens Axboe} __attribute__((packed));
187a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
188b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboestruct jobs_eta {
189b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint32_t nr_running;
190b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint32_t nr_ramp;
191ce8ea6e7f0a08f282d06dd3f0890fe7128146f44Jens Axboe
192b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint32_t nr_pending;
193714e85f340194409d0abcf643cd2f154a7380a74Jens Axboe	uint32_t nr_setting_up;
194ce8ea6e7f0a08f282d06dd3f0890fe7128146f44Jens Axboe
195b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint32_t files_open;
196ce8ea6e7f0a08f282d06dd3f0890fe7128146f44Jens Axboe
197d79db1222039e906dd49ae290daa59701f4e2385Jens Axboe	uint32_t m_rate[DDIR_RWDIR_CNT], t_rate[DDIR_RWDIR_CNT];
198d79db1222039e906dd49ae290daa59701f4e2385Jens Axboe	uint32_t m_iops[DDIR_RWDIR_CNT], t_iops[DDIR_RWDIR_CNT];
1996eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint32_t rate[DDIR_RWDIR_CNT];
2006eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint32_t iops[DDIR_RWDIR_CNT];
201b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint64_t elapsed_sec;
202b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint64_t eta_sec;
203b7f05eb03c84bdc1259d1bb1c348328b16164430Jens Axboe	uint32_t is_pow2;
204ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan	uint32_t unit_base;
2051d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe
2061d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe	/*
2071d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe	 * Network 'copy' of run_str[]
2081d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe	 */
2091d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe	uint32_t nr_threads;
210372aecb9049618c1279a946b66f6b29066730951Jens Axboe	uint8_t run_str[];
211eb663201be7f38339e9177fbbd2b99da30f19e61Jens Axboe} __attribute__((packed));
212b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe
21361f6cced3dcde7e4a6fc9fca01783ec80ff269a4Jens Axboeextern struct jobs_eta *get_jobs_eta(int force, size_t *size);
21461f6cced3dcde7e4a6fc9fca01783ec80ff269a4Jens Axboe
215cef9175e52e8a240117b9f45b228fdaa0f1c0572Jens Axboeextern void stat_init(void);
216cef9175e52e8a240117b9f45b228fdaa0f1c0572Jens Axboeextern void stat_exit(void);
217cef9175e52e8a240117b9f45b228fdaa0f1c0572Jens Axboe
218952b05e00103bf45576e1860cde0626bd42ed52aCastor Fuextern struct json_object * show_thread_status(struct thread_stat *ts, struct group_run_stats *rs);
219a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern void show_group_stats(struct group_run_stats *rs);
220af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboeextern int calc_thread_status(struct jobs_eta *je, int force);
221cf451d1ede3bbbd2fed3619eb43def054d5b5a5aJens Axboeextern void display_thread_status(struct jobs_eta *je);
2225b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboeextern void show_run_stats(void);
2232e627243f7877cefb3606ef99ec24debe32ac98cJens Axboeextern void __show_run_stats(void);
2247fe36313273ef051670d16aa27953699fd5cdf06Jens Axboeextern void __show_running_run_stats(void);
225b852e7cf097cec1c7fb92305f9c3c6b394bb39adJens Axboeextern void show_running_run_stats(void);
22606464907159baf7a1eeac654a023743e33f28d86Jens Axboeextern void check_for_running_stats(void);
2275b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboeextern void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, int nr);
22837f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboeextern void sum_group_stats(struct group_run_stats *dst, struct group_run_stats *src);
22937f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboeextern void init_thread_stat(struct thread_stat *ts);
23037f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboeextern void init_group_run_stat(struct group_run_stats *gs);
2313e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboeextern void eta_to_str(char *str, unsigned long eta_sec);
232b29ad56266faa33326de00e315d2b34b735fb028Jens Axboeextern int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, double *mean, double *dev);
233a269790cd25788dd4226641a3ceab1b3c8fda14bJens Axboeextern unsigned int calc_clat_percentiles(unsigned int *io_u_plat, unsigned long nr, fio_fp64_t *plist, unsigned int **output, unsigned int *maxv, unsigned int *minv);
234e5bd13470beaeed9c4a6835b7b92265fb94173a9Jens Axboeextern void stat_calc_lat_m(struct thread_stat *ts, double *io_u_lat);
235e5bd13470beaeed9c4a6835b7b92265fb94173a9Jens Axboeextern void stat_calc_lat_u(struct thread_stat *ts, double *io_u_lat);
2362e33101f218a1603eeecca969f5b7a0e98696a01Jens Axboeextern void stat_calc_dist(unsigned int *map, unsigned long total, double *io_u_dist);
2376bb58215842760895071d9f331da4dc2dfc16f30Jens Axboeextern void reset_io_stats(struct thread_data *);
2382e33101f218a1603eeecca969f5b7a0e98696a01Jens Axboe
239b29ad56266faa33326de00e315d2b34b735fb028Jens Axboestatic inline int usec_to_msec(unsigned long *min, unsigned long *max,
240b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe			       double *mean, double *dev)
241b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe{
242b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe	if (*min > 1000 && *max > 1000 && *mean > 1000.0 && *dev > 1000.0) {
243b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe		*min /= 1000;
244b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe		*max /= 1000;
245b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe		*mean /= 1000.0;
246b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe		*dev /= 1000.0;
247b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe		return 0;
248b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe	}
249b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe
250b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe	return 1;
251b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe}
25261f6cced3dcde7e4a6fc9fca01783ec80ff269a4Jens Axboe/*
25361f6cced3dcde7e4a6fc9fca01783ec80ff269a4Jens Axboe * Worst level condensing would be 1:5, so allow enough room for that
25461f6cced3dcde7e4a6fc9fca01783ec80ff269a4Jens Axboe */
25561f6cced3dcde7e4a6fc9fca01783ec80ff269a4Jens Axboe#define __THREAD_RUNSTR_SZ(nr)	((nr) * 5)
2561814876d9e82b2b03b042581b5d2c743638726e5Jens Axboe#define THREAD_RUNSTR_SZ	__THREAD_RUNSTR_SZ(thread_number)
2571814876d9e82b2b03b042581b5d2c743638726e5Jens Axboe
258a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#endif
259