1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#ifndef BLOCK_ACCOUNTING_H
26#define BLOCK_ACCOUNTING_H
27
28#include "qemu/timed-average.h"
29
30typedef struct BlockAcctTimedStats BlockAcctTimedStats;
31
32enum BlockAcctType {
33 BLOCK_ACCT_READ,
34 BLOCK_ACCT_WRITE,
35 BLOCK_ACCT_FLUSH,
36 BLOCK_MAX_IOTYPE,
37};
38
39struct BlockAcctTimedStats {
40 TimedAverage latency[BLOCK_MAX_IOTYPE];
41 unsigned interval_length;
42 QSLIST_ENTRY(BlockAcctTimedStats) entries;
43};
44
45typedef struct BlockAcctStats {
46 uint64_t nr_bytes[BLOCK_MAX_IOTYPE];
47 uint64_t nr_ops[BLOCK_MAX_IOTYPE];
48 uint64_t invalid_ops[BLOCK_MAX_IOTYPE];
49 uint64_t failed_ops[BLOCK_MAX_IOTYPE];
50 uint64_t total_time_ns[BLOCK_MAX_IOTYPE];
51 uint64_t merged[BLOCK_MAX_IOTYPE];
52 int64_t last_access_time_ns;
53 QSLIST_HEAD(, BlockAcctTimedStats) intervals;
54 bool account_invalid;
55 bool account_failed;
56} BlockAcctStats;
57
58typedef struct BlockAcctCookie {
59 int64_t bytes;
60 int64_t start_time_ns;
61 enum BlockAcctType type;
62} BlockAcctCookie;
63
64void block_acct_init(BlockAcctStats *stats, bool account_invalid,
65 bool account_failed);
66void block_acct_cleanup(BlockAcctStats *stats);
67void block_acct_add_interval(BlockAcctStats *stats, unsigned interval_length);
68BlockAcctTimedStats *block_acct_interval_next(BlockAcctStats *stats,
69 BlockAcctTimedStats *s);
70void block_acct_start(BlockAcctStats *stats, BlockAcctCookie *cookie,
71 int64_t bytes, enum BlockAcctType type);
72void block_acct_done(BlockAcctStats *stats, BlockAcctCookie *cookie);
73void block_acct_failed(BlockAcctStats *stats, BlockAcctCookie *cookie);
74void block_acct_invalid(BlockAcctStats *stats, enum BlockAcctType type);
75void block_acct_merge_done(BlockAcctStats *stats, enum BlockAcctType type,
76 int num_requests);
77int64_t block_acct_idle_time_ns(BlockAcctStats *stats);
78double block_acct_queue_depth(BlockAcctTimedStats *stats,
79 enum BlockAcctType type);
80
81#endif
82