The BlockBackend reference is required to be able to generate the QOM path as part of emitted events.
A weak reference is enough because BlockAcctStats is tied directly to one BlockBackend, and will be deleted via block_acct_cleanup() before the BlockBackend is truly deleted. Signed-off-by: Hanna Czenczek <[email protected]> --- include/block/accounting.h | 3 ++- block/accounting.c | 7 ++++++- block/block-backend.c | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/block/accounting.h b/include/block/accounting.h index 9386440ec89..025536239e6 100644 --- a/include/block/accounting.h +++ b/include/block/accounting.h @@ -81,6 +81,7 @@ typedef struct BlockLatencyHistogram { struct BlockAcctStats { QemuMutex lock; + BlockBackend *blk; uint64_t nr_bytes[BLOCK_MAX_IOTYPE]; uint64_t nr_ops[BLOCK_MAX_IOTYPE]; uint64_t invalid_ops[BLOCK_MAX_IOTYPE]; @@ -101,7 +102,7 @@ typedef struct BlockAcctCookie { enum BlockAcctType type; } BlockAcctCookie; -void block_acct_init(BlockAcctStats *stats); +void block_acct_init(BlockBackend *blk, BlockAcctStats *stats); bool block_acct_setup(BlockAcctStats *stats, enum OnOffAuto account_invalid, enum OnOffAuto account_failed, uint32_t *stats_intervals, uint32_t num_stats_intervals, Error **errp); diff --git a/block/accounting.c b/block/accounting.c index 66e5001403f..a74551d41f2 100644 --- a/block/accounting.c +++ b/block/accounting.c @@ -33,7 +33,7 @@ static QEMUClockType clock_type = QEMU_CLOCK_REALTIME; static const int qtest_latency_ns = NANOSECONDS_PER_SECOND / 1000; -void block_acct_init(BlockAcctStats *stats) +void block_acct_init(BlockBackend *blk, BlockAcctStats *stats) { qemu_mutex_init(&stats->lock); if (qtest_enabled()) { @@ -41,6 +41,11 @@ void block_acct_init(BlockAcctStats *stats) } stats->account_invalid = true; stats->account_failed = true; + /* + * No need to blk_ref() because block_acct_cleanup() is called exactly when + * the BB is deleted. + */ + stats->blk = blk; } static bool bool_from_onoffauto(OnOffAuto val, bool def) diff --git a/block/block-backend.c b/block/block-backend.c index 164bda846f4..ca091a8bf5d 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -369,7 +369,7 @@ BlockBackend *blk_new(AioContext *ctx, uint64_t perm, uint64_t shared_perm) blk->on_read_error = BLOCKDEV_ON_ERROR_REPORT; blk->on_write_error = BLOCKDEV_ON_ERROR_ENOSPC; - block_acct_init(&blk->stats); + block_acct_init(blk, &blk->stats); qemu_mutex_init(&blk->queued_requests_lock); qemu_co_queue_init(&blk->queued_requests); -- 2.55.0
