bdrv_acct_start() and bdrv_acct_done() must be called in order to update block device accounting information.
Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> --- hw/block/dataplane/virtio-blk.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c index 8ac6049..c5c25cb 100644 --- a/hw/block/dataplane/virtio-blk.c +++ b/hw/block/dataplane/virtio-blk.c @@ -32,6 +32,7 @@ typedef struct { struct iovec bounce_iov; /* used if guest buffers are unaligned */ QEMUIOVector bounce_qiov; /* bounce buffer iovecs */ bool read; /* read or write? */ + BlockAcctCookie acct; /* block device accounting */ } VirtIOBlockRequest; struct VirtIOBlockDataPlane { @@ -103,6 +104,9 @@ static void complete_rdwr(void *opaque, int ret) */ vring_push(&req->s->vring, req->elem, len + sizeof(hdr)); notify_guest(req->s); + if (likely(ret == 0)) { + bdrv_acct_done(req->s->blk->conf.bs, &req->acct); + } g_slice_free(VirtIOBlockRequest, req); } @@ -170,9 +174,13 @@ static void do_rdwr_cmd(VirtIOBlockDataPlane *s, bool read, nb_sectors = qiov->size / BDRV_SECTOR_SIZE; if (read) { + bdrv_acct_start(s->blk->conf.bs, &req->acct, + qiov->size, BDRV_ACCT_READ); bdrv_aio_readv(s->blk->conf.bs, sector_num, qiov, nb_sectors, complete_rdwr, req); } else { + bdrv_acct_start(s->blk->conf.bs, &req->acct, + qiov->size, BDRV_ACCT_WRITE); bdrv_aio_writev(s->blk->conf.bs, sector_num, qiov, nb_sectors, complete_rdwr, req); } @@ -185,6 +193,7 @@ static void complete_flush(void *opaque, int ret) if (ret == 0) { status = VIRTIO_BLK_S_OK; + bdrv_acct_done(req->s->blk->conf.bs, &req->acct); } else { status = VIRTIO_BLK_S_IOERR; } @@ -201,6 +210,7 @@ static void do_flush_cmd(VirtIOBlockDataPlane *s, VirtQueueElement *elem, req->elem = elem; req->inhdr = inhdr; + bdrv_acct_start(s->blk->conf.bs, &req->acct, 0, BDRV_ACCT_FLUSH); bdrv_aio_flush(s->blk->conf.bs, complete_flush, req); } -- 1.9.3