From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38767) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XSTE2-0000M6-09 for qemu-devel@nongnu.org; Fri, 12 Sep 2014 11:57:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XSTDy-0000kl-0O for qemu-devel@nongnu.org; Fri, 12 Sep 2014 11:57:29 -0400 Received: from mx1.redhat.com ([209.132.183.28]:62959) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XSTDx-0000kY-Lk for qemu-devel@nongnu.org; Fri, 12 Sep 2014 11:57:25 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s8CFvP9H013247 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 12 Sep 2014 11:57:25 -0400 From: Kevin Wolf Date: Fri, 12 Sep 2014 17:56:55 +0200 Message-Id: <1410537426-9917-12-git-send-email-kwolf@redhat.com> In-Reply-To: <1410537426-9917-1-git-send-email-kwolf@redhat.com> References: <1410537426-9917-1-git-send-email-kwolf@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 11/22] block: Make the block accounting functions operate on BlockAcctStats List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com From: Beno=C3=AEt Canet This is the next step for decoupling block accounting functions from BlockDriverState. In a future commit the BlockAcctStats structure will be moved from BlockDriverState to the device models structures. Note that bdrv_get_stats was introduced so device models can retrieve the BlockAcctStats structure of a BlockDriverState without being aware of it'= s layout. This function should go away when BlockAcctStats will be embedded in the = device models structures. CC: Kevin Wolf CC: Stefan Hajnoczi CC: Keith Busch CC: Anthony Liguori CC: "Michael S. Tsirkin" CC: Paolo Bonzini CC: Eric Blake CC: Peter Maydell CC: Michael Tokarev CC: John Snow CC: Markus Armbruster CC: Alexander Graf CC: Max Reitz Signed-off-by: Beno=C3=AEt Canet Signed-off-by: Kevin Wolf --- block.c | 13 ++++++++++++- block/accounting.c | 23 ++++++++++------------- dma-helpers.c | 2 +- hw/block/nvme.c | 2 +- hw/block/virtio-blk.c | 15 +++++++++------ hw/block/xen_disk.c | 10 +++++----- hw/ide/ahci.c | 3 ++- hw/ide/atapi.c | 18 +++++++++++------- hw/ide/core.c | 24 +++++++++++++----------- hw/ide/macio.c | 19 +++++++++++-------- hw/scsi/scsi-disk.c | 45 +++++++++++++++++++++++++---------------= ----- include/block/accounting.h | 10 +++++----- include/block/block.h | 3 +++ 13 files changed, 108 insertions(+), 79 deletions(-) diff --git a/block.c b/block.c index 1fac189..dda5ae9 100644 --- a/block.c +++ b/block.c @@ -3363,7 +3363,7 @@ static int coroutine_fn bdrv_aligned_pwritev(BlockD= riverState *bs, =20 bdrv_set_dirty(bs, sector_num, nb_sectors); =20 - bdrv_acct_highest_sector(bs, sector_num, nb_sectors); + block_acct_highest_sector(&bs->stats, sector_num, nb_sectors); =20 if (bs->growable && ret >=3D 0) { bs->total_sectors =3D MAX(bs->total_sectors, sector_num + nb_sec= tors); @@ -6087,3 +6087,14 @@ void bdrv_refresh_filename(BlockDriverState *bs) QDECREF(json); } } + +/* This accessor function purpose is to allow the device models to acces= s the + * BlockAcctStats structure embedded inside a BlockDriverState without b= eing + * aware of the BlockDriverState structure layout. + * It will go away when the BlockAcctStats structure will be moved insid= e + * the device models. + */ +BlockAcctStats *bdrv_get_stats(BlockDriverState *bs) +{ + return &bs->stats; +} diff --git a/block/accounting.c b/block/accounting.c index 38932ca..edbb1cc 100644 --- a/block/accounting.c +++ b/block/accounting.c @@ -25,9 +25,8 @@ #include "block/accounting.h" #include "block/block_int.h" =20 -void -bdrv_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie, int64_t b= ytes, - enum BlockAcctType type) +void block_acct_start(BlockAcctStats *stats, BlockAcctCookie *cookie, + int64_t bytes, enum BlockAcctType type) { assert(type < BLOCK_MAX_IOTYPE); =20 @@ -36,22 +35,20 @@ bdrv_acct_start(BlockDriverState *bs, BlockAcctCookie= *cookie, int64_t bytes, cookie->type =3D type; } =20 -void -bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie) +void block_acct_done(BlockAcctStats *stats, BlockAcctCookie *cookie) { assert(cookie->type < BLOCK_MAX_IOTYPE); =20 - bs->stats.nr_bytes[cookie->type] +=3D cookie->bytes; - bs->stats.nr_ops[cookie->type]++; - bs->stats.total_time_ns[cookie->type] +=3D get_clock() - - cookie->start_time_ns; + stats->nr_bytes[cookie->type] +=3D cookie->bytes; + stats->nr_ops[cookie->type]++; + stats->total_time_ns[cookie->type] +=3D get_clock() - cookie->start_= time_ns; } =20 =20 -void bdrv_acct_highest_sector(BlockDriverState *bs, int64_t sector_num, - unsigned int nb_sectors) +void block_acct_highest_sector(BlockAcctStats *stats, int64_t sector_num= , + unsigned int nb_sectors) { - if (bs->stats.wr_highest_sector < sector_num + nb_sectors - 1) { - bs->stats.wr_highest_sector =3D sector_num + nb_sectors - 1; + if (stats->wr_highest_sector < sector_num + nb_sectors - 1) { + stats->wr_highest_sector =3D sector_num + nb_sectors - 1; } } diff --git a/dma-helpers.c b/dma-helpers.c index 499b52b..f6811fa 100644 --- a/dma-helpers.c +++ b/dma-helpers.c @@ -277,5 +277,5 @@ uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEM= USGList *sg) void dma_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie, QEMUSGList *sg, enum BlockAcctType type) { - bdrv_acct_start(bs, cookie, sg->size, type); + block_acct_start(bdrv_get_stats(bs), cookie, sg->size, type); } diff --git a/hw/block/nvme.c b/hw/block/nvme.c index f9aec24..b010c9b 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -197,7 +197,7 @@ static void nvme_rw_cb(void *opaque, int ret) NvmeCtrl *n =3D sq->ctrl; NvmeCQueue *cq =3D n->cq[sq->cqid]; =20 - bdrv_acct_done(n->conf.bs, &req->acct); + block_acct_done(bdrv_get_stats(n->conf.bs), &req->acct); if (!ret) { req->status =3D NVME_SUCCESS; } else { diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index c2cb815..38ad38f 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -74,7 +74,7 @@ static int virtio_blk_handle_rw_error(VirtIOBlockReq *r= eq, int error, s->rq =3D req; } else if (action =3D=3D BLOCK_ERROR_ACTION_REPORT) { virtio_blk_req_complete(req, VIRTIO_BLK_S_IOERR); - bdrv_acct_done(s->bs, &req->acct); + block_acct_done(bdrv_get_stats(s->bs), &req->acct); virtio_blk_free_request(req); } =20 @@ -96,7 +96,7 @@ static void virtio_blk_rw_complete(void *opaque, int re= t) } =20 virtio_blk_req_complete(req, VIRTIO_BLK_S_OK); - bdrv_acct_done(req->dev->bs, &req->acct); + block_acct_done(bdrv_get_stats(req->dev->bs), &req->acct); virtio_blk_free_request(req); } =20 @@ -111,7 +111,7 @@ static void virtio_blk_flush_complete(void *opaque, i= nt ret) } =20 virtio_blk_req_complete(req, VIRTIO_BLK_S_OK); - bdrv_acct_done(req->dev->bs, &req->acct); + block_acct_done(bdrv_get_stats(req->dev->bs), &req->acct); virtio_blk_free_request(req); } =20 @@ -279,7 +279,8 @@ void virtio_submit_multiwrite(BlockDriverState *bs, M= ultiReqBuffer *mrb) =20 static void virtio_blk_handle_flush(VirtIOBlockReq *req, MultiReqBuffer = *mrb) { - bdrv_acct_start(req->dev->bs, &req->acct, 0, BLOCK_ACCT_FLUSH); + block_acct_start(bdrv_get_stats(req->dev->bs), &req->acct, 0, + BLOCK_ACCT_FLUSH); =20 /* * Make sure all outstanding writes are posted to the backing device. @@ -322,7 +323,8 @@ static void virtio_blk_handle_write(VirtIOBlockReq *r= eq, MultiReqBuffer *mrb) return; } =20 - bdrv_acct_start(req->dev->bs, &req->acct, req->qiov.size, BLOCK_ACCT= _WRITE); + block_acct_start(bdrv_get_stats(req->dev->bs), &req->acct, req->qiov= .size, + BLOCK_ACCT_WRITE); =20 if (mrb->num_writes =3D=3D 32) { virtio_submit_multiwrite(req->dev->bs, mrb); @@ -353,7 +355,8 @@ static void virtio_blk_handle_read(VirtIOBlockReq *re= q) return; } =20 - bdrv_acct_start(req->dev->bs, &req->acct, req->qiov.size, BLOCK_ACCT= _READ); + block_acct_start(bdrv_get_stats(req->dev->bs), &req->acct, req->qiov= .size, + BLOCK_ACCT_READ); bdrv_aio_readv(req->dev->bs, sector, &req->qiov, req->qiov.size / BDRV_SECTOR_SIZE, virtio_blk_rw_complete, req); diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c index bf7af9e..0d27ab1 100644 --- a/hw/block/xen_disk.c +++ b/hw/block/xen_disk.c @@ -493,7 +493,7 @@ static void qemu_aio_complete(void *opaque, int ret) break; } case BLKIF_OP_READ: - bdrv_acct_done(ioreq->blkdev->bs, &ioreq->acct); + block_acct_done(bdrv_get_stats(ioreq->blkdev->bs), &ioreq->acct)= ; break; case BLKIF_OP_DISCARD: default: @@ -518,8 +518,8 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq) =20 switch (ioreq->req.operation) { case BLKIF_OP_READ: - bdrv_acct_start(blkdev->bs, &ioreq->acct, ioreq->v.size, - BLOCK_ACCT_READ); + block_acct_start(bdrv_get_stats(blkdev->bs), &ioreq->acct, + ioreq->v.size, BLOCK_ACCT_READ); ioreq->aio_inflight++; bdrv_aio_readv(blkdev->bs, ioreq->start / BLOCK_SIZE, &ioreq->v, ioreq->v.size / BLOCK_SIZE, @@ -531,8 +531,8 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq) break; } =20 - bdrv_acct_start(blkdev->bs, &ioreq->acct, ioreq->v.size, - BLOCK_ACCT_WRITE); + block_acct_start(bdrv_get_stats(blkdev->bs), &ioreq->acct, + ioreq->v.size, BLOCK_ACCT_WRITE); ioreq->aio_inflight++; bdrv_aio_writev(blkdev->bs, ioreq->start / BLOCK_SIZE, &ioreq->v, ioreq->v.size / BLOCK_SIZE, diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index 9f434b1..ba69de3 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -809,7 +809,8 @@ static void ncq_cb(void *opaque, int ret) DPRINTF(ncq_tfs->drive->port_no, "NCQ transfer tag %d finished\n", ncq_tfs->tag); =20 - bdrv_acct_done(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct); + block_acct_done(bdrv_get_stats(ncq_tfs->drive->port.ifs[0].bs), + &ncq_tfs->acct); qemu_sglist_destroy(&ncq_tfs->sglist); ncq_tfs->used =3D 0; } diff --git a/hw/ide/atapi.c b/hw/ide/atapi.c index 4b15af1..6d52cda 100644 --- a/hw/ide/atapi.c +++ b/hw/ide/atapi.c @@ -110,14 +110,16 @@ static int cd_read_sector(IDEState *s, int lba, uin= t8_t *buf, int sector_size) =20 switch(sector_size) { case 2048: - bdrv_acct_start(s->bs, &s->acct, 4 * BDRV_SECTOR_SIZE, BLOCK_ACC= T_READ); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, + 4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ); ret =3D bdrv_read(s->bs, (int64_t)lba << 2, buf, 4); - bdrv_acct_done(s->bs, &s->acct); + block_acct_done(bdrv_get_stats(s->bs), &s->acct); break; case 2352: - bdrv_acct_start(s->bs, &s->acct, 4 * BDRV_SECTOR_SIZE, BLOCK_ACC= T_READ); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, + 4 * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ); ret =3D bdrv_read(s->bs, (int64_t)lba << 2, buf + 16, 4); - bdrv_acct_done(s->bs, &s->acct); + block_acct_done(bdrv_get_stats(s->bs), &s->acct); if (ret < 0) return ret; cd_data_to_raw(buf, lba); @@ -253,7 +255,8 @@ static void ide_atapi_cmd_reply(IDEState *s, int size= , int max_size) s->io_buffer_index =3D 0; =20 if (s->atapi_dma) { - bdrv_acct_start(s->bs, &s->acct, size, BLOCK_ACCT_READ); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, size, + BLOCK_ACCT_READ); s->status =3D READY_STAT | SEEK_STAT | DRQ_STAT; ide_start_dma(s, ide_atapi_cmd_read_dma_cb); } else { @@ -354,7 +357,7 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, i= nt ret) return; =20 eot: - bdrv_acct_done(s->bs, &s->acct); + block_acct_done(bdrv_get_stats(s->bs), &s->acct); ide_set_inactive(s, false); } =20 @@ -369,7 +372,8 @@ static void ide_atapi_cmd_read_dma(IDEState *s, int l= ba, int nb_sectors, s->io_buffer_size =3D 0; s->cd_sector_size =3D sector_size; =20 - bdrv_acct_start(s->bs, &s->acct, s->packet_transfer_size, BLOCK_ACCT= _READ); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, s->packet_transfer= _size, + BLOCK_ACCT_READ); =20 /* XXX: check if BUSY_STAT should be set */ s->status =3D READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT; diff --git a/hw/ide/core.c b/hw/ide/core.c index 43b4c1b..6fba056 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -568,7 +568,7 @@ static void ide_sector_read_cb(void *opaque, int ret) s->pio_aiocb =3D NULL; s->status &=3D ~BUSY_STAT; =20 - bdrv_acct_done(s->bs, &s->acct); + block_acct_done(bdrv_get_stats(s->bs), &s->acct); if (ret !=3D 0) { if (ide_handle_rw_error(s, -ret, IDE_RETRY_PIO | IDE_RETRY_READ)) { @@ -624,7 +624,8 @@ void ide_sector_read(IDEState *s) s->iov.iov_len =3D n * BDRV_SECTOR_SIZE; qemu_iovec_init_external(&s->qiov, &s->iov, 1); =20 - bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BLOCK_ACCT_RE= AD); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, + n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ); s->pio_aiocb =3D bdrv_aio_readv(s->bs, sector_num, &s->qiov, n, ide_sector_read_cb, s); } @@ -756,7 +757,7 @@ void ide_dma_cb(void *opaque, int ret) =20 eot: if (s->dma_cmd =3D=3D IDE_DMA_READ || s->dma_cmd =3D=3D IDE_DMA_WRIT= E) { - bdrv_acct_done(s->bs, &s->acct); + block_acct_done(bdrv_get_stats(s->bs), &s->acct); } ide_set_inactive(s, stay_active); } @@ -770,12 +771,12 @@ static void ide_sector_start_dma(IDEState *s, enum = ide_dma_cmd dma_cmd) =20 switch (dma_cmd) { case IDE_DMA_READ: - bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE, - BLOCK_ACCT_READ); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, + s->nsector * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ)= ; break; case IDE_DMA_WRITE: - bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE, - BLOCK_ACCT_WRITE); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, + s->nsector * BDRV_SECTOR_SIZE, BLOCK_ACCT_WRITE= ); break; default: break; @@ -802,7 +803,7 @@ static void ide_sector_write_cb(void *opaque, int ret= ) IDEState *s =3D opaque; int n; =20 - bdrv_acct_done(s->bs, &s->acct); + block_acct_done(bdrv_get_stats(s->bs), &s->acct); =20 s->pio_aiocb =3D NULL; s->status &=3D ~BUSY_STAT; @@ -869,7 +870,8 @@ void ide_sector_write(IDEState *s) s->iov.iov_len =3D n * BDRV_SECTOR_SIZE; qemu_iovec_init_external(&s->qiov, &s->iov, 1); =20 - bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BLOCK_ACCT_RE= AD); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, + n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ); s->pio_aiocb =3D bdrv_aio_writev(s->bs, sector_num, &s->qiov, n, ide_sector_write_cb, s); } @@ -888,7 +890,7 @@ static void ide_flush_cb(void *opaque, int ret) } =20 if (s->bs) { - bdrv_acct_done(s->bs, &s->acct); + block_acct_done(bdrv_get_stats(s->bs), &s->acct); } s->status =3D READY_STAT | SEEK_STAT; ide_cmd_done(s); @@ -903,7 +905,7 @@ void ide_flush_cache(IDEState *s) } =20 s->status |=3D BUSY_STAT; - bdrv_acct_start(s->bs, &s->acct, 0, BLOCK_ACCT_FLUSH); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, 0, BLOCK_ACCT_FLUS= H); s->pio_aiocb =3D bdrv_aio_flush(s->bs, ide_flush_cb, s); } =20 diff --git a/hw/ide/macio.c b/hw/ide/macio.c index 1b653ae..cefc85c 100644 --- a/hw/ide/macio.c +++ b/hw/ide/macio.c @@ -171,7 +171,7 @@ static void pmac_ide_atapi_transfer_cb(void *opaque, = int ret) =20 done: MACIO_DPRINTF("done DMA\n"); - bdrv_acct_done(s->bs, &s->acct); + block_acct_done(bdrv_get_stats(s->bs), &s->acct); io->dma_end(opaque); } =20 @@ -352,7 +352,7 @@ static void pmac_ide_transfer_cb(void *opaque, int re= t) =20 done: if (s->dma_cmd =3D=3D IDE_DMA_READ || s->dma_cmd =3D=3D IDE_DMA_WRIT= E) { - bdrv_acct_done(s->bs, &s->acct); + block_acct_done(bdrv_get_stats(s->bs), &s->acct); } io->dma_end(io); } @@ -370,8 +370,8 @@ static void pmac_ide_transfer(DBDMA_io *io) /* Handle non-block ATAPI DMA transfers */ if (s->lba =3D=3D -1) { s->io_buffer_size =3D MIN(io->len, s->packet_transfer_size); - bdrv_acct_start(s->bs, &s->acct, s->io_buffer_size, - BLOCK_ACCT_READ); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, s->io_buff= er_size, + BLOCK_ACCT_READ); MACIO_DPRINTF("non-block ATAPI DMA transfer size: %d\n", s->io_buffer_size); =20 @@ -382,22 +382,25 @@ static void pmac_ide_transfer(DBDMA_io *io) m->dma_active =3D false; =20 MACIO_DPRINTF("end of non-block ATAPI DMA transfer\n"); - bdrv_acct_done(s->bs, &s->acct); + block_acct_done(bdrv_get_stats(s->bs), &s->acct); io->dma_end(io); return; } =20 - bdrv_acct_start(s->bs, &s->acct, io->len, BLOCK_ACCT_READ); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, io->len, + BLOCK_ACCT_READ); pmac_ide_atapi_transfer_cb(io, 0); return; } =20 switch (s->dma_cmd) { case IDE_DMA_READ: - bdrv_acct_start(s->bs, &s->acct, io->len, BLOCK_ACCT_READ); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, io->len, + BLOCK_ACCT_READ); break; case IDE_DMA_WRITE: - bdrv_acct_start(s->bs, &s->acct, io->len, BLOCK_ACCT_WRITE); + block_acct_start(bdrv_get_stats(s->bs), &s->acct, io->len, + BLOCK_ACCT_WRITE); break; default: break; diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index 14b535c..9645d01 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -183,7 +183,7 @@ static void scsi_aio_complete(void *opaque, int ret) =20 assert(r->req.aiocb !=3D NULL); r->req.aiocb =3D NULL; - bdrv_acct_done(s->qdev.conf.bs, &r->acct); + block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct); if (r->req.io_canceled) { goto done; } @@ -237,7 +237,8 @@ static void scsi_write_do_fua(SCSIDiskReq *r) } =20 if (scsi_is_cmd_fua(&r->req.cmd)) { - bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BLOCK_ACCT_FLUSH); + block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, 0, + BLOCK_ACCT_FLUSH); r->req.aiocb =3D bdrv_aio_flush(s->qdev.conf.bs, scsi_aio_comple= te, r); return; } @@ -257,7 +258,7 @@ static void scsi_dma_complete_noio(void *opaque, int = ret) =20 if (r->req.aiocb !=3D NULL) { r->req.aiocb =3D NULL; - bdrv_acct_done(s->qdev.conf.bs, &r->acct); + block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct); } if (r->req.io_canceled) { goto done; @@ -300,7 +301,7 @@ static void scsi_read_complete(void * opaque, int ret= ) =20 assert(r->req.aiocb !=3D NULL); r->req.aiocb =3D NULL; - bdrv_acct_done(s->qdev.conf.bs, &r->acct); + block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct); if (r->req.io_canceled) { goto done; } @@ -333,7 +334,7 @@ static void scsi_do_read(void *opaque, int ret) =20 if (r->req.aiocb !=3D NULL) { r->req.aiocb =3D NULL; - bdrv_acct_done(s->qdev.conf.bs, &r->acct); + block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct); } if (r->req.io_canceled) { goto done; @@ -355,8 +356,8 @@ static void scsi_do_read(void *opaque, int ret) scsi_dma_complete, r); } else { n =3D scsi_init_iovec(r, SCSI_DMA_BUF_SIZE); - bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, - BLOCK_ACCT_READ); + block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, + n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ); r->req.aiocb =3D bdrv_aio_readv(s->qdev.conf.bs, r->sector, &r->= qiov, n, scsi_read_complete, r); } @@ -400,7 +401,8 @@ static void scsi_read_data(SCSIRequest *req) first =3D !r->started; r->started =3D true; if (first && scsi_is_cmd_fua(&r->req.cmd)) { - bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BLOCK_ACCT_FLUSH); + block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, 0, + BLOCK_ACCT_FLUSH); r->req.aiocb =3D bdrv_aio_flush(s->qdev.conf.bs, scsi_do_read, r= ); } else { scsi_do_read(r, 0); @@ -454,7 +456,7 @@ static void scsi_write_complete(void * opaque, int re= t) =20 if (r->req.aiocb !=3D NULL) { r->req.aiocb =3D NULL; - bdrv_acct_done(s->qdev.conf.bs, &r->acct); + block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct); } if (r->req.io_canceled) { goto done; @@ -529,8 +531,8 @@ static void scsi_write_data(SCSIRequest *req) scsi_dma_complete, r); } else { n =3D r->qiov.size / 512; - bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, - BLOCK_ACCT_WRITE); + block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, + n * BDRV_SECTOR_SIZE, BLOCK_ACCT_WRITE); r->req.aiocb =3D bdrv_aio_writev(s->qdev.conf.bs, r->sector, &r-= >qiov, n, scsi_write_complete, r); } @@ -1498,7 +1500,8 @@ static void scsi_disk_emulate_mode_select(SCSIDiskR= eq *r, uint8_t *inbuf) if (!bdrv_enable_write_cache(s->qdev.conf.bs)) { /* The request is used as the AIO opaque value, so add a ref. *= / scsi_req_ref(&r->req); - bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BLOCK_ACCT_FLUSH); + block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, 0, + BLOCK_ACCT_FLUSH); r->req.aiocb =3D bdrv_aio_flush(s->qdev.conf.bs, scsi_aio_comple= te, r); return; } @@ -1649,7 +1652,7 @@ static void scsi_write_same_complete(void *opaque, = int ret) =20 assert(r->req.aiocb !=3D NULL); r->req.aiocb =3D NULL; - bdrv_acct_done(s->qdev.conf.bs, &r->acct); + block_acct_done(bdrv_get_stats(s->qdev.conf.bs), &r->acct); if (r->req.io_canceled) { goto done; } @@ -1664,8 +1667,8 @@ static void scsi_write_same_complete(void *opaque, = int ret) data->sector +=3D data->iov.iov_len / 512; data->iov.iov_len =3D MIN(data->nb_sectors * 512, data->iov.iov_len)= ; if (data->iov.iov_len) { - bdrv_acct_start(s->qdev.conf.bs, &r->acct, data->iov.iov_len, - BLOCK_ACCT_WRITE); + block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, + data->iov.iov_len, BLOCK_ACCT_WRITE); r->req.aiocb =3D bdrv_aio_writev(s->qdev.conf.bs, data->sector, &data->qiov, data->iov.iov_len / = 512, scsi_write_same_complete, data); @@ -1711,8 +1714,9 @@ static void scsi_disk_emulate_write_same(SCSIDiskRe= q *r, uint8_t *inbuf) =20 /* The request is used as the AIO opaque value, so add a ref. *= / scsi_req_ref(&r->req); - bdrv_acct_start(s->qdev.conf.bs, &r->acct, - nb_sectors * s->qdev.blocksize, BLOCK_ACCT_WRITE= ); + block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, + nb_sectors * s->qdev.blocksize, + BLOCK_ACCT_WRITE); r->req.aiocb =3D bdrv_aio_write_zeroes(s->qdev.conf.bs, r->req.cmd.lba * (s->qdev.b= locksize / 512), nb_sectors * (s->qdev.block= size / 512), @@ -1733,8 +1737,8 @@ static void scsi_disk_emulate_write_same(SCSIDiskRe= q *r, uint8_t *inbuf) } =20 scsi_req_ref(&r->req); - bdrv_acct_start(s->qdev.conf.bs, &r->acct, data->iov.iov_len, - BLOCK_ACCT_WRITE); + block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, + data->iov.iov_len, BLOCK_ACCT_WRITE); r->req.aiocb =3D bdrv_aio_writev(s->qdev.conf.bs, data->sector, &data->qiov, data->iov.iov_len / 512, scsi_write_same_complete, data); @@ -1998,7 +2002,8 @@ static int32_t scsi_disk_emulate_command(SCSIReques= t *req, uint8_t *buf) case SYNCHRONIZE_CACHE: /* The request is used as the AIO opaque value, so add a ref. *= / scsi_req_ref(&r->req); - bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BLOCK_ACCT_FLUSH); + block_acct_start(bdrv_get_stats(s->qdev.conf.bs), &r->acct, 0, + BLOCK_ACCT_FLUSH); r->req.aiocb =3D bdrv_aio_flush(s->qdev.conf.bs, scsi_aio_comple= te, r); return 0; case SEEK_10: diff --git a/include/block/accounting.h b/include/block/accounting.h index ea5998d..50b42b3 100644 --- a/include/block/accounting.h +++ b/include/block/accounting.h @@ -48,10 +48,10 @@ typedef struct BlockAcctCookie { enum BlockAcctType type; } BlockAcctCookie; =20 -void bdrv_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie, - int64_t bytes, enum BlockAcctType type); -void bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie); -void bdrv_acct_highest_sector(BlockDriverState *bs, int64_t sector_num, - unsigned int nb_sectors); +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); =20 #endif diff --git a/include/block/block.h b/include/block/block.h index 5fb36b1..07d6d8e 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -5,6 +5,7 @@ #include "qemu-common.h" #include "qemu/option.h" #include "block/coroutine.h" +#include "block/accounting.h" #include "qapi/qmp/qobject.h" #include "qapi-types.h" =20 @@ -574,4 +575,6 @@ void bdrv_io_plug(BlockDriverState *bs); void bdrv_io_unplug(BlockDriverState *bs); void bdrv_flush_io_queue(BlockDriverState *bs); =20 +BlockAcctStats *bdrv_get_stats(BlockDriverState *bs); + #endif --=20 1.8.3.1