qapi: add unmap to BlockDeviceStats

Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-id: 20190923121737.83281-3-anton.nefedov@virtuozzo.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
Anton Nefedov 2019-09-23 15:17:30 +03:00 committed by Max Reitz
parent 329d27e38c
commit 159f85ddc8
4 changed files with 48 additions and 6 deletions

View File

@ -440,24 +440,30 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)
ds->rd_bytes = stats->nr_bytes[BLOCK_ACCT_READ]; ds->rd_bytes = stats->nr_bytes[BLOCK_ACCT_READ];
ds->wr_bytes = stats->nr_bytes[BLOCK_ACCT_WRITE]; ds->wr_bytes = stats->nr_bytes[BLOCK_ACCT_WRITE];
ds->unmap_bytes = stats->nr_bytes[BLOCK_ACCT_UNMAP];
ds->rd_operations = stats->nr_ops[BLOCK_ACCT_READ]; ds->rd_operations = stats->nr_ops[BLOCK_ACCT_READ];
ds->wr_operations = stats->nr_ops[BLOCK_ACCT_WRITE]; ds->wr_operations = stats->nr_ops[BLOCK_ACCT_WRITE];
ds->unmap_operations = stats->nr_ops[BLOCK_ACCT_UNMAP];
ds->failed_rd_operations = stats->failed_ops[BLOCK_ACCT_READ]; ds->failed_rd_operations = stats->failed_ops[BLOCK_ACCT_READ];
ds->failed_wr_operations = stats->failed_ops[BLOCK_ACCT_WRITE]; ds->failed_wr_operations = stats->failed_ops[BLOCK_ACCT_WRITE];
ds->failed_flush_operations = stats->failed_ops[BLOCK_ACCT_FLUSH]; ds->failed_flush_operations = stats->failed_ops[BLOCK_ACCT_FLUSH];
ds->failed_unmap_operations = stats->failed_ops[BLOCK_ACCT_UNMAP];
ds->invalid_rd_operations = stats->invalid_ops[BLOCK_ACCT_READ]; ds->invalid_rd_operations = stats->invalid_ops[BLOCK_ACCT_READ];
ds->invalid_wr_operations = stats->invalid_ops[BLOCK_ACCT_WRITE]; ds->invalid_wr_operations = stats->invalid_ops[BLOCK_ACCT_WRITE];
ds->invalid_flush_operations = ds->invalid_flush_operations =
stats->invalid_ops[BLOCK_ACCT_FLUSH]; stats->invalid_ops[BLOCK_ACCT_FLUSH];
ds->invalid_unmap_operations = stats->invalid_ops[BLOCK_ACCT_UNMAP];
ds->rd_merged = stats->merged[BLOCK_ACCT_READ]; ds->rd_merged = stats->merged[BLOCK_ACCT_READ];
ds->wr_merged = stats->merged[BLOCK_ACCT_WRITE]; ds->wr_merged = stats->merged[BLOCK_ACCT_WRITE];
ds->unmap_merged = stats->merged[BLOCK_ACCT_UNMAP];
ds->flush_operations = stats->nr_ops[BLOCK_ACCT_FLUSH]; ds->flush_operations = stats->nr_ops[BLOCK_ACCT_FLUSH];
ds->wr_total_time_ns = stats->total_time_ns[BLOCK_ACCT_WRITE]; ds->wr_total_time_ns = stats->total_time_ns[BLOCK_ACCT_WRITE];
ds->rd_total_time_ns = stats->total_time_ns[BLOCK_ACCT_READ]; ds->rd_total_time_ns = stats->total_time_ns[BLOCK_ACCT_READ];
ds->flush_total_time_ns = stats->total_time_ns[BLOCK_ACCT_FLUSH]; ds->flush_total_time_ns = stats->total_time_ns[BLOCK_ACCT_FLUSH];
ds->unmap_total_time_ns = stats->total_time_ns[BLOCK_ACCT_UNMAP];
ds->has_idle_time_ns = stats->last_access_time_ns > 0; ds->has_idle_time_ns = stats->last_access_time_ns > 0;
if (ds->has_idle_time_ns) { if (ds->has_idle_time_ns) {

View File

@ -36,6 +36,7 @@ enum BlockAcctType {
BLOCK_ACCT_READ, BLOCK_ACCT_READ,
BLOCK_ACCT_WRITE, BLOCK_ACCT_WRITE,
BLOCK_ACCT_FLUSH, BLOCK_ACCT_FLUSH,
BLOCK_ACCT_UNMAP,
BLOCK_MAX_IOTYPE, BLOCK_MAX_IOTYPE,
}; };

View File

@ -860,6 +860,8 @@
# #
# @wr_bytes: The number of bytes written by the device. # @wr_bytes: The number of bytes written by the device.
# #
# @unmap_bytes: The number of bytes unmapped by the device (Since 4.2)
#
# @rd_operations: The number of read operations performed by the device. # @rd_operations: The number of read operations performed by the device.
# #
# @wr_operations: The number of write operations performed by the device. # @wr_operations: The number of write operations performed by the device.
@ -867,6 +869,9 @@
# @flush_operations: The number of cache flush operations performed by the # @flush_operations: The number of cache flush operations performed by the
# device (since 0.15.0) # device (since 0.15.0)
# #
# @unmap_operations: The number of unmap operations performed by the device
# (Since 4.2)
#
# @rd_total_time_ns: Total time spent on reads in nanoseconds (since 0.15.0). # @rd_total_time_ns: Total time spent on reads in nanoseconds (since 0.15.0).
# #
# @wr_total_time_ns: Total time spent on writes in nanoseconds (since 0.15.0). # @wr_total_time_ns: Total time spent on writes in nanoseconds (since 0.15.0).
@ -874,6 +879,9 @@
# @flush_total_time_ns: Total time spent on cache flushes in nanoseconds # @flush_total_time_ns: Total time spent on cache flushes in nanoseconds
# (since 0.15.0). # (since 0.15.0).
# #
# @unmap_total_time_ns: Total time spent on unmap operations in nanoseconds
# (Since 4.2)
#
# @wr_highest_offset: The offset after the greatest byte written to the # @wr_highest_offset: The offset after the greatest byte written to the
# device. The intended use of this information is for # device. The intended use of this information is for
# growable sparse files (like qcow2) that are used on top # growable sparse files (like qcow2) that are used on top
@ -885,6 +893,9 @@
# @wr_merged: Number of write requests that have been merged into another # @wr_merged: Number of write requests that have been merged into another
# request (Since 2.3). # request (Since 2.3).
# #
# @unmap_merged: Number of unmap requests that have been merged into another
# request (Since 4.2)
#
# @idle_time_ns: Time since the last I/O operation, in # @idle_time_ns: Time since the last I/O operation, in
# nanoseconds. If the field is absent it means that # nanoseconds. If the field is absent it means that
# there haven't been any operations yet (Since 2.5). # there haven't been any operations yet (Since 2.5).
@ -898,6 +909,9 @@
# @failed_flush_operations: The number of failed flush operations # @failed_flush_operations: The number of failed flush operations
# performed by the device (Since 2.5) # performed by the device (Since 2.5)
# #
# @failed_unmap_operations: The number of failed unmap operations performed
# by the device (Since 4.2)
#
# @invalid_rd_operations: The number of invalid read operations # @invalid_rd_operations: The number of invalid read operations
# performed by the device (Since 2.5) # performed by the device (Since 2.5)
# #
@ -907,6 +921,9 @@
# @invalid_flush_operations: The number of invalid flush operations # @invalid_flush_operations: The number of invalid flush operations
# performed by the device (Since 2.5) # performed by the device (Since 2.5)
# #
# @invalid_unmap_operations: The number of invalid unmap operations performed
# by the device (Since 4.2)
#
# @account_invalid: Whether invalid operations are included in the # @account_invalid: Whether invalid operations are included in the
# last access statistics (Since 2.5) # last access statistics (Since 2.5)
# #
@ -925,18 +942,18 @@
# Since: 0.14.0 # Since: 0.14.0
## ##
{ 'struct': 'BlockDeviceStats', { 'struct': 'BlockDeviceStats',
'data': {'rd_bytes': 'int', 'wr_bytes': 'int', 'data': {'rd_bytes': 'int', 'wr_bytes': 'int', 'unmap_bytes' : 'int',
'rd_operations': 'int', 'wr_operations': 'int', 'rd_operations': 'int', 'wr_operations': 'int',
'flush_operations': 'int', 'flush_operations': 'int', 'unmap_operations': 'int',
'rd_total_time_ns': 'int', 'wr_total_time_ns': 'int', 'rd_total_time_ns': 'int', 'wr_total_time_ns': 'int',
'flush_total_time_ns': 'int', 'flush_total_time_ns': 'int', 'unmap_total_time_ns': 'int',
'wr_highest_offset': 'int', 'wr_highest_offset': 'int',
'rd_merged': 'int', 'wr_merged': 'int', 'rd_merged': 'int', 'wr_merged': 'int', 'unmap_merged': 'int',
'*idle_time_ns': 'int', '*idle_time_ns': 'int',
'failed_rd_operations': 'int', 'failed_wr_operations': 'int', 'failed_rd_operations': 'int', 'failed_wr_operations': 'int',
'failed_flush_operations': 'int', 'failed_flush_operations': 'int', 'failed_unmap_operations': 'int',
'invalid_rd_operations': 'int', 'invalid_wr_operations': 'int', 'invalid_rd_operations': 'int', 'invalid_wr_operations': 'int',
'invalid_flush_operations': 'int', 'invalid_flush_operations': 'int', 'invalid_unmap_operations': 'int',
'account_invalid': 'bool', 'account_failed': 'bool', 'account_invalid': 'bool', 'account_failed': 'bool',
'timed_stats': ['BlockDeviceTimedStats'], 'timed_stats': ['BlockDeviceTimedStats'],
'*rd_latency_histogram': 'BlockLatencyHistogramInfo', '*rd_latency_histogram': 'BlockLatencyHistogramInfo',

View File

@ -15,6 +15,8 @@ Testing: -drive driver=null-co,read-zeroes=on,if=virtio
{ {
"device": "virtio0", "device": "virtio0",
"stats": { "stats": {
"unmap_operations": 0,
"unmap_merged": 0,
"flush_total_time_ns": 0, "flush_total_time_ns": 0,
"wr_highest_offset": 0, "wr_highest_offset": 0,
"wr_total_time_ns": 0, "wr_total_time_ns": 0,
@ -24,13 +26,17 @@ Testing: -drive driver=null-co,read-zeroes=on,if=virtio
"wr_bytes": 0, "wr_bytes": 0,
"timed_stats": [ "timed_stats": [
], ],
"failed_unmap_operations": 0,
"failed_flush_operations": 0, "failed_flush_operations": 0,
"account_invalid": true, "account_invalid": true,
"rd_total_time_ns": 0, "rd_total_time_ns": 0,
"invalid_unmap_operations": 0,
"flush_operations": 0, "flush_operations": 0,
"wr_operations": 0, "wr_operations": 0,
"unmap_bytes": 0,
"rd_merged": 0, "rd_merged": 0,
"rd_bytes": 0, "rd_bytes": 0,
"unmap_total_time_ns": 0,
"invalid_flush_operations": 0, "invalid_flush_operations": 0,
"account_failed": true, "account_failed": true,
"rd_operations": 0, "rd_operations": 0,
@ -74,6 +80,8 @@ Testing: -drive driver=null-co,if=none
{ {
"device": "none0", "device": "none0",
"stats": { "stats": {
"unmap_operations": 0,
"unmap_merged": 0,
"flush_total_time_ns": 0, "flush_total_time_ns": 0,
"wr_highest_offset": 0, "wr_highest_offset": 0,
"wr_total_time_ns": 0, "wr_total_time_ns": 0,
@ -83,13 +91,17 @@ Testing: -drive driver=null-co,if=none
"wr_bytes": 0, "wr_bytes": 0,
"timed_stats": [ "timed_stats": [
], ],
"failed_unmap_operations": 0,
"failed_flush_operations": 0, "failed_flush_operations": 0,
"account_invalid": true, "account_invalid": true,
"rd_total_time_ns": 0, "rd_total_time_ns": 0,
"invalid_unmap_operations": 0,
"flush_operations": 0, "flush_operations": 0,
"wr_operations": 0, "wr_operations": 0,
"unmap_bytes": 0,
"rd_merged": 0, "rd_merged": 0,
"rd_bytes": 0, "rd_bytes": 0,
"unmap_total_time_ns": 0,
"invalid_flush_operations": 0, "invalid_flush_operations": 0,
"account_failed": true, "account_failed": true,
"rd_operations": 0, "rd_operations": 0,
@ -163,6 +175,8 @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device virtio-b
{ {
"device": "", "device": "",
"stats": { "stats": {
"unmap_operations": 0,
"unmap_merged": 0,
"flush_total_time_ns": 0, "flush_total_time_ns": 0,
"wr_highest_offset": 0, "wr_highest_offset": 0,
"wr_total_time_ns": 0, "wr_total_time_ns": 0,
@ -172,13 +186,17 @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device virtio-b
"wr_bytes": 0, "wr_bytes": 0,
"timed_stats": [ "timed_stats": [
], ],
"failed_unmap_operations": 0,
"failed_flush_operations": 0, "failed_flush_operations": 0,
"account_invalid": false, "account_invalid": false,
"rd_total_time_ns": 0, "rd_total_time_ns": 0,
"invalid_unmap_operations": 0,
"flush_operations": 0, "flush_operations": 0,
"wr_operations": 0, "wr_operations": 0,
"unmap_bytes": 0,
"rd_merged": 0, "rd_merged": 0,
"rd_bytes": 0, "rd_bytes": 0,
"unmap_total_time_ns": 0,
"invalid_flush_operations": 0, "invalid_flush_operations": 0,
"account_failed": false, "account_failed": false,
"rd_operations": 0, "rd_operations": 0,