block: Move BlockAcctStats into BlockBackend
As the comment above bdrv_get_stats() says, BlockAcctStats is something which belongs to the device instead of each BlockDriverState. This patch therefore moves it into the BlockBackend. Signed-off-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Alberto Garcia <berto@igalia.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
53d8f9d8fb
commit
7f0e9da6f1
11
block.c
11
block.c
|
@ -4153,14 +4153,3 @@ void bdrv_refresh_filename(BlockDriverState *bs)
|
||||||
QDECREF(json);
|
QDECREF(json);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This accessor function purpose is to allow the device models to access the
|
|
||||||
* BlockAcctStats structure embedded inside a BlockDriverState without being
|
|
||||||
* aware of the BlockDriverState structure layout.
|
|
||||||
* It will go away when the BlockAcctStats structure will be moved inside
|
|
||||||
* the device models.
|
|
||||||
*/
|
|
||||||
BlockAcctStats *bdrv_get_stats(BlockDriverState *bs)
|
|
||||||
{
|
|
||||||
return &bs->stats;
|
|
||||||
}
|
|
||||||
|
|
|
@ -34,6 +34,9 @@ struct BlockBackend {
|
||||||
|
|
||||||
/* the block size for which the guest device expects atomicity */
|
/* the block size for which the guest device expects atomicity */
|
||||||
int guest_block_size;
|
int guest_block_size;
|
||||||
|
|
||||||
|
/* I/O stats (display with "info blockstats"). */
|
||||||
|
BlockAcctStats stats;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct BlockBackendAIOCB {
|
typedef struct BlockBackendAIOCB {
|
||||||
|
@ -892,7 +895,7 @@ void blk_io_unplug(BlockBackend *blk)
|
||||||
|
|
||||||
BlockAcctStats *blk_get_stats(BlockBackend *blk)
|
BlockAcctStats *blk_get_stats(BlockBackend *blk)
|
||||||
{
|
{
|
||||||
return bdrv_get_stats(blk->bs);
|
return &blk->stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *blk_aio_get(const AIOCBInfo *aiocb_info, BlockBackend *blk,
|
void *blk_aio_get(const AIOCBInfo *aiocb_info, BlockBackend *blk,
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
#include "sysemu/block-backend.h"
|
||||||
#include "block/blockjob.h"
|
#include "block/blockjob.h"
|
||||||
#include "block/block_int.h"
|
#include "block/block_int.h"
|
||||||
#include "block/throttle-groups.h"
|
#include "block/throttle-groups.h"
|
||||||
|
@ -1905,7 +1906,10 @@ static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
block_acct_merge_done(&bs->stats, BLOCK_ACCT_WRITE, num_reqs - outidx - 1);
|
if (bs->blk) {
|
||||||
|
block_acct_merge_done(blk_get_stats(bs->blk), BLOCK_ACCT_WRITE,
|
||||||
|
num_reqs - outidx - 1);
|
||||||
|
}
|
||||||
|
|
||||||
return outidx + 1;
|
return outidx + 1;
|
||||||
}
|
}
|
||||||
|
|
24
block/qapi.c
24
block/qapi.c
|
@ -344,16 +344,20 @@ static BlockStats *bdrv_query_stats(const BlockDriverState *bs,
|
||||||
}
|
}
|
||||||
|
|
||||||
s->stats = g_malloc0(sizeof(*s->stats));
|
s->stats = g_malloc0(sizeof(*s->stats));
|
||||||
s->stats->rd_bytes = bs->stats.nr_bytes[BLOCK_ACCT_READ];
|
if (bs->blk) {
|
||||||
s->stats->wr_bytes = bs->stats.nr_bytes[BLOCK_ACCT_WRITE];
|
BlockAcctStats *stats = blk_get_stats(bs->blk);
|
||||||
s->stats->rd_operations = bs->stats.nr_ops[BLOCK_ACCT_READ];
|
|
||||||
s->stats->wr_operations = bs->stats.nr_ops[BLOCK_ACCT_WRITE];
|
s->stats->rd_bytes = stats->nr_bytes[BLOCK_ACCT_READ];
|
||||||
s->stats->rd_merged = bs->stats.merged[BLOCK_ACCT_READ];
|
s->stats->wr_bytes = stats->nr_bytes[BLOCK_ACCT_WRITE];
|
||||||
s->stats->wr_merged = bs->stats.merged[BLOCK_ACCT_WRITE];
|
s->stats->rd_operations = stats->nr_ops[BLOCK_ACCT_READ];
|
||||||
s->stats->flush_operations = bs->stats.nr_ops[BLOCK_ACCT_FLUSH];
|
s->stats->wr_operations = stats->nr_ops[BLOCK_ACCT_WRITE];
|
||||||
s->stats->wr_total_time_ns = bs->stats.total_time_ns[BLOCK_ACCT_WRITE];
|
s->stats->rd_merged = stats->merged[BLOCK_ACCT_READ];
|
||||||
s->stats->rd_total_time_ns = bs->stats.total_time_ns[BLOCK_ACCT_READ];
|
s->stats->wr_merged = stats->merged[BLOCK_ACCT_WRITE];
|
||||||
s->stats->flush_total_time_ns = bs->stats.total_time_ns[BLOCK_ACCT_FLUSH];
|
s->stats->flush_operations = stats->nr_ops[BLOCK_ACCT_FLUSH];
|
||||||
|
s->stats->wr_total_time_ns = stats->total_time_ns[BLOCK_ACCT_WRITE];
|
||||||
|
s->stats->rd_total_time_ns = stats->total_time_ns[BLOCK_ACCT_READ];
|
||||||
|
s->stats->flush_total_time_ns = stats->total_time_ns[BLOCK_ACCT_FLUSH];
|
||||||
|
}
|
||||||
|
|
||||||
s->stats->wr_highest_offset = bs->wr_highest_offset;
|
s->stats->wr_highest_offset = bs->wr_highest_offset;
|
||||||
|
|
||||||
|
|
|
@ -621,6 +621,4 @@ void bdrv_io_plug(BlockDriverState *bs);
|
||||||
void bdrv_io_unplug(BlockDriverState *bs);
|
void bdrv_io_unplug(BlockDriverState *bs);
|
||||||
void bdrv_flush_io_queue(BlockDriverState *bs);
|
void bdrv_flush_io_queue(BlockDriverState *bs);
|
||||||
|
|
||||||
BlockAcctStats *bdrv_get_stats(BlockDriverState *bs);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -399,9 +399,6 @@ struct BlockDriverState {
|
||||||
unsigned pending_reqs[2];
|
unsigned pending_reqs[2];
|
||||||
QLIST_ENTRY(BlockDriverState) round_robin;
|
QLIST_ENTRY(BlockDriverState) round_robin;
|
||||||
|
|
||||||
/* I/O stats (display with "info blockstats"). */
|
|
||||||
BlockAcctStats stats;
|
|
||||||
|
|
||||||
/* Offset after the highest byte written to */
|
/* Offset after the highest byte written to */
|
||||||
uint64_t wr_highest_offset;
|
uint64_t wr_highest_offset;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue