[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 13/38] block: Remove wr_highest_sector from Block
From: |
Max Reitz |
Subject: |
[Qemu-devel] [PATCH v4 13/38] block: Remove wr_highest_sector from BlockAcctStats |
Date: |
Mon, 20 Jul 2015 19:45:40 +0200 |
BlockAcctStats contains statistics about the data transferred from and
to the device; wr_highest_sector does not fit in with the rest.
Furthermore, those statistics are supposed to be specific for a certain
device and not necessarily for a BDS (see the comment above
bdrv_get_stats()); on the other hand, wr_highest_sector may be a rather
important information to know for each BDS. When BlockAcctStats is
finally removed from the BDS, we will want to keep wr_highest_sector in
the BDS.
Finally, wr_highest_sector is renamed to wr_highest_offset and given the
appropriate meaning. Externally, it is represented as an offset so there
is no point in doing something different internally. Its definition is
changed to match that in qapi/block-core.json which is "the offset after
the greatest byte written to". Doing so should not cause any harm since
if external programs tried to calculate the volume usage by
(wr_highest_offset + 512) / volume_size, after this patch they will just
assume the volume to be full slightly earlier than before.
Signed-off-by: Max Reitz <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Reviewed-by: Alberto Garcia <address@hidden>
---
block/accounting.c | 8 --------
block/io.c | 4 +++-
block/qapi.c | 4 ++--
include/block/accounting.h | 3 ---
include/block/block_int.h | 3 +++
qmp-commands.hx | 4 ++--
6 files changed, 10 insertions(+), 16 deletions(-)
diff --git a/block/accounting.c b/block/accounting.c
index 01d594f..a423560 100644
--- a/block/accounting.c
+++ b/block/accounting.c
@@ -47,14 +47,6 @@ void block_acct_done(BlockAcctStats *stats, BlockAcctCookie
*cookie)
}
-void block_acct_highest_sector(BlockAcctStats *stats, int64_t sector_num,
- unsigned int nb_sectors)
-{
- if (stats->wr_highest_sector < sector_num + nb_sectors - 1) {
- stats->wr_highest_sector = sector_num + nb_sectors - 1;
- }
-}
-
void block_acct_merge_done(BlockAcctStats *stats, enum BlockAcctType type,
int num_requests)
{
diff --git a/block/io.c b/block/io.c
index d4bc83b..21cc82a 100644
--- a/block/io.c
+++ b/block/io.c
@@ -1141,7 +1141,9 @@ static int coroutine_fn
bdrv_aligned_pwritev(BlockDriverState *bs,
bdrv_set_dirty(bs, sector_num, nb_sectors);
- block_acct_highest_sector(&bs->stats, sector_num, nb_sectors);
+ if (bs->wr_highest_offset < offset + bytes) {
+ bs->wr_highest_offset = offset + bytes;
+ }
if (ret >= 0) {
bs->total_sectors = MAX(bs->total_sectors, sector_num + nb_sectors);
diff --git a/block/qapi.c b/block/qapi.c
index 2ce5097..d3cbc80 100644
--- a/block/qapi.c
+++ b/block/qapi.c
@@ -350,13 +350,13 @@ static BlockStats *bdrv_query_stats(const
BlockDriverState *bs,
s->stats->wr_operations = bs->stats.nr_ops[BLOCK_ACCT_WRITE];
s->stats->rd_merged = bs->stats.merged[BLOCK_ACCT_READ];
s->stats->wr_merged = bs->stats.merged[BLOCK_ACCT_WRITE];
- s->stats->wr_highest_offset =
- bs->stats.wr_highest_sector * BDRV_SECTOR_SIZE;
s->stats->flush_operations = bs->stats.nr_ops[BLOCK_ACCT_FLUSH];
s->stats->wr_total_time_ns = bs->stats.total_time_ns[BLOCK_ACCT_WRITE];
s->stats->rd_total_time_ns = bs->stats.total_time_ns[BLOCK_ACCT_READ];
s->stats->flush_total_time_ns = bs->stats.total_time_ns[BLOCK_ACCT_FLUSH];
+ s->stats->wr_highest_offset = bs->wr_highest_offset;
+
if (bs->file) {
s->has_parent = true;
s->parent = bdrv_query_stats(bs->file, query_backing);
diff --git a/include/block/accounting.h b/include/block/accounting.h
index 4c406cf..66637cd 100644
--- a/include/block/accounting.h
+++ b/include/block/accounting.h
@@ -40,7 +40,6 @@ typedef struct BlockAcctStats {
uint64_t nr_ops[BLOCK_MAX_IOTYPE];
uint64_t total_time_ns[BLOCK_MAX_IOTYPE];
uint64_t merged[BLOCK_MAX_IOTYPE];
- uint64_t wr_highest_sector;
} BlockAcctStats;
typedef struct BlockAcctCookie {
@@ -52,8 +51,6 @@ typedef struct BlockAcctCookie {
void block_acct_start(BlockAcctStats *stats, BlockAcctCookie *cookie,
int64_t bytes, enum BlockAcctType type);
void block_acct_done(BlockAcctStats *stats, BlockAcctCookie *cookie);
-void block_acct_highest_sector(BlockAcctStats *stats, int64_t sector_num,
- unsigned int nb_sectors);
void block_acct_merge_done(BlockAcctStats *stats, enum BlockAcctType type,
int num_requests);
diff --git a/include/block/block_int.h b/include/block/block_int.h
index b7e1e16..67e05ac 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -403,6 +403,9 @@ struct BlockDriverState {
/* I/O stats (display with "info blockstats"). */
BlockAcctStats stats;
+ /* Offset after the highest byte written to */
+ uint64_t wr_highest_offset;
+
/* I/O Limits */
BlockLimits bl;
diff --git a/qmp-commands.hx b/qmp-commands.hx
index ba630b1..df3b116 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -2456,8 +2456,8 @@ Each json-object contain the following:
- "wr_total_time_ns": total time spend on writes in nano-seconds (json-int)
- "rd_total_time_ns": total time spend on reads in nano-seconds (json-int)
- "flush_total_time_ns": total time spend on cache flushes in nano-seconds
(json-int)
- - "wr_highest_offset": Highest offset of a sector written since the
- BlockDriverState has been opened (json-int)
+ - "wr_highest_offset": The offset after the greatest byte written to the
+ BlockDriverState since it has been opened (json-int)
- "rd_merged": number of read requests that have been merged into
another request (json-int)
- "wr_merged": number of write requests that have been merged into
--
2.4.6
- [Qemu-devel] [PATCH v4 03/38] iotests: Only create BB if necessary, (continued)
- [Qemu-devel] [PATCH v4 03/38] iotests: Only create BB if necessary, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 05/38] block: Add blk_is_available(), Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 06/38] block: Make bdrv_is_inserted() recursive, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 04/38] block: Make bdrv_is_inserted() return a bool, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 07/38] block/quorum: Implement bdrv_is_inserted(), Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 08/38] block: Invoke change media CB before NULLing drv, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 10/38] hw/usb-storage: Check whether BB is inserted, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 09/38] hw/block/fdc: Implement tray status, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 11/38] block: Fix BB AIOCB AioContext without BDS, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 12/38] block: Move guest_block_size into BlockBackend, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 13/38] block: Remove wr_highest_sector from BlockAcctStats,
Max Reitz <=
- [Qemu-devel] [PATCH v4 14/38] block: Move BlockAcctStats into BlockBackend, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 16/38] block: Add BlockBackendRootState, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 15/38] block: Move I/O status and error actions into BB, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 17/38] block: Make some BB functions fall back to BBRS, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 18/38] block: Fail requests to empty BlockBackend, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 20/38] block: Add blk_insert_bs(), Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 22/38] blockdev: Do not create BDS for empty drive, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 21/38] block: Prepare for NULL BDS, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 23/38] blockdev: Pull out blockdev option extraction, Max Reitz, 2015/07/20
- [Qemu-devel] [PATCH v4 24/38] blockdev: Allow more options for BB-less BDS tree, Max Reitz, 2015/07/20