summaryrefslogtreecommitdiff
path: root/blockdev.c
diff options
context:
space:
mode:
authorAlberto Garcia <berto@igalia.com>2015-10-28 17:33:07 +0200
committerKevin Wolf <kwolf@redhat.com>2015-11-12 16:22:46 +0100
commit2be5506fc85d5fef1abdb2128d446cb0b14b12bc (patch)
treeee078635b9ad2b7eabc67cb8a0f9d53a75fb9709 /blockdev.c
parent96e4dedaff9922f87e4ec351d51d3f093198382a (diff)
block: New option to define the intervals for collecting I/O statistics
The BlockAcctStats structure contains a list of BlockAcctTimedStats. Each one of these collects statistics about the minimum, maximum and average latencies of all I/O operations in a certain interval of time. This patch adds a new "stats-intervals" option that allows defining these intervals. Signed-off-by: Alberto Garcia <berto@igalia.com> Message-id: 41cbcd334a61c6157f0f495cdfd21eff6c156f2a.1446044837.git.berto@igalia.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'blockdev.c')
-rw-r--r--blockdev.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/blockdev.c b/blockdev.c
index 17029fd6c0..fc85128e94 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -442,6 +442,7 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
int bdrv_flags = 0;
int on_read_error, on_write_error;
bool account_invalid, account_failed;
+ const char *stats_intervals;
BlockBackend *blk;
BlockDriverState *bs;
ThrottleConfig cfg;
@@ -481,6 +482,8 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
account_invalid = qemu_opt_get_bool(opts, "stats-account-invalid", true);
account_failed = qemu_opt_get_bool(opts, "stats-account-failed", true);
+ stats_intervals = qemu_opt_get(opts, "stats-intervals");
+
extract_common_blockdev_options(opts, &bdrv_flags, &throttling_group, &cfg,
&detect_zeroes, &error);
if (error) {
@@ -579,6 +582,35 @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
}
block_acct_init(blk_get_stats(blk), account_invalid, account_failed);
+
+ if (stats_intervals) {
+ char **intervals = g_strsplit(stats_intervals, ":", 0);
+ unsigned i;
+
+ if (*stats_intervals == '\0') {
+ error_setg(&error, "stats-intervals can't have an empty value");
+ }
+
+ for (i = 0; !error && intervals[i] != NULL; i++) {
+ unsigned long long val;
+ if (parse_uint_full(intervals[i], &val, 10) == 0 &&
+ val > 0 && val <= UINT_MAX) {
+ block_acct_add_interval(blk_get_stats(blk), val);
+ } else {
+ error_setg(&error, "Invalid interval length: '%s'",
+ intervals[i]);
+ }
+ }
+
+ g_strfreev(intervals);
+
+ if (error) {
+ error_propagate(errp, error);
+ blk_unref(blk);
+ blk = NULL;
+ goto err_no_bs_opts;
+ }
+ }
}
blk_set_on_error(blk, on_read_error, on_write_error);
@@ -3916,6 +3948,11 @@ QemuOptsList qemu_common_drive_opts = {
.type = QEMU_OPT_BOOL,
.help = "whether to account for failed I/O operations "
"in the statistics",
+ },{
+ .name = "stats-intervals",
+ .type = QEMU_OPT_STRING,
+ .help = "colon-separated list of intervals "
+ "for collecting I/O statistics, in seconds",
},
{ /* end of list */ }
},