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;
15a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe};
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];
163a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t total_submit;
164a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t total_complete;
165a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
1666eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint64_t io_bytes[DDIR_RWDIR_CNT];
1676eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint64_t runtime[DDIR_RWDIR_CNT];
168a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t total_run_time;
169a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
170a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	/*
171a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 * IO Error related stats
172a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 */
173a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint16_t continue_on_error;
174a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint64_t total_err_count;
175ddcc0b69aa4ed04c8681f447a1a6274bb8837a14Jens Axboe	uint32_t first_error;
176a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
177a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	uint32_t kb_base;
178ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan	uint32_t unit_base;
1793e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe
1803e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe	uint32_t latency_depth;
1813e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe	uint64_t latency_target;
1823e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe	fio_fp64_t latency_percentile;
1833e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboe	uint64_t latency_window;
184a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe};
185a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
186b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboestruct jobs_eta {
187b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint32_t nr_running;
188b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint32_t nr_ramp;
189b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint32_t nr_pending;
190714e85f340194409d0abcf643cd2f154a7380a74Jens Axboe	uint32_t nr_setting_up;
191b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint32_t files_open;
192d79db1222039e906dd49ae290daa59701f4e2385Jens Axboe	uint32_t m_rate[DDIR_RWDIR_CNT], t_rate[DDIR_RWDIR_CNT];
193d79db1222039e906dd49ae290daa59701f4e2385Jens Axboe	uint32_t m_iops[DDIR_RWDIR_CNT], t_iops[DDIR_RWDIR_CNT];
1946eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint32_t rate[DDIR_RWDIR_CNT];
1956eaf09d6e9ca1f8accb057cdb18620b7e53ae33fShaohua Li	uint32_t iops[DDIR_RWDIR_CNT];
196b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint64_t elapsed_sec;
197b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe	uint64_t eta_sec;
198b7f05eb03c84bdc1259d1bb1c348328b16164430Jens Axboe	uint32_t is_pow2;
199ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan	uint32_t unit_base;
2001d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe
2011d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe	/*
2021d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe	 * Network 'copy' of run_str[]
2031d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe	 */
2041d1f45aec4bd2c1168ed5539174a821555db6f65Jens Axboe	uint32_t nr_threads;
205372aecb9049618c1279a946b66f6b29066730951Jens Axboe	uint8_t run_str[];
206b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe};
207b75a394fd0e9455ab71912d4462aaae7e6e4366bJens Axboe
208cef9175e52e8a240117b9f45b228fdaa0f1c0572Jens Axboeextern void stat_init(void);
209cef9175e52e8a240117b9f45b228fdaa0f1c0572Jens Axboeextern void stat_exit(void);
210cef9175e52e8a240117b9f45b228fdaa0f1c0572Jens Axboe
211952b05e00103bf45576e1860cde0626bd42ed52aCastor Fuextern struct json_object * show_thread_status(struct thread_stat *ts, struct group_run_stats *rs);
212a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern void show_group_stats(struct group_run_stats *rs);
213af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboeextern int calc_thread_status(struct jobs_eta *je, int force);
214cf451d1ede3bbbd2fed3619eb43def054d5b5a5aJens Axboeextern void display_thread_status(struct jobs_eta *je);
2155b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboeextern void show_run_stats(void);
216b852e7cf097cec1c7fb92305f9c3c6b394bb39adJens Axboeextern void show_running_run_stats(void);
21706464907159baf7a1eeac654a023743e33f28d86Jens Axboeextern void check_for_running_stats(void);
2185b9babb7fb9ac46c0e960ccd88c2d85ba3065c01Jens Axboeextern void sum_thread_stats(struct thread_stat *dst, struct thread_stat *src, int nr);
21937f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboeextern void sum_group_stats(struct group_run_stats *dst, struct group_run_stats *src);
22037f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboeextern void init_thread_stat(struct thread_stat *ts);
22137f0c1ae23ad1716403d3d113c3dfdf41c47e329Jens Axboeextern void init_group_run_stat(struct group_run_stats *gs);
2223e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboeextern void eta_to_str(char *str, unsigned long eta_sec);
223b29ad56266faa33326de00e315d2b34b735fb028Jens Axboeextern int calc_lat(struct io_stat *is, unsigned long *min, unsigned long *max, double *mean, double *dev);
224a269790cd25788dd4226641a3ceab1b3c8fda14bJens 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);
225e5bd13470beaeed9c4a6835b7b92265fb94173a9Jens Axboeextern void stat_calc_lat_m(struct thread_stat *ts, double *io_u_lat);
226e5bd13470beaeed9c4a6835b7b92265fb94173a9Jens Axboeextern void stat_calc_lat_u(struct thread_stat *ts, double *io_u_lat);
2272e33101f218a1603eeecca969f5b7a0e98696a01Jens Axboeextern void stat_calc_dist(unsigned int *map, unsigned long total, double *io_u_dist);
2286bb58215842760895071d9f331da4dc2dfc16f30Jens Axboeextern void reset_io_stats(struct thread_data *);
2292e33101f218a1603eeecca969f5b7a0e98696a01Jens Axboe
230b29ad56266faa33326de00e315d2b34b735fb028Jens Axboestatic inline int usec_to_msec(unsigned long *min, unsigned long *max,
231b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe			       double *mean, double *dev)
232b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe{
233b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe	if (*min > 1000 && *max > 1000 && *mean > 1000.0 && *dev > 1000.0) {
234b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe		*min /= 1000;
235b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe		*max /= 1000;
236b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe		*mean /= 1000.0;
237b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe		*dev /= 1000.0;
238b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe		return 0;
239b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe	}
240b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe
241b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe	return 1;
242b29ad56266faa33326de00e315d2b34b735fb028Jens Axboe}
243a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
244a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#endif
245