From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38733) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XSTDz-0000H3-CB for qemu-devel@nongnu.org; Fri, 12 Sep 2014 11:57:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XSTDv-0000jw-0R for qemu-devel@nongnu.org; Fri, 12 Sep 2014 11:57:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43112) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XSTDu-0000jm-PR for qemu-devel@nongnu.org; Fri, 12 Sep 2014 11:57:22 -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 s8CFvMo1013226 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 12 Sep 2014 11:57:22 -0400 From: Kevin Wolf Date: Fri, 12 Sep 2014 17:56:53 +0200 Message-Id: <1410537426-9917-10-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 09/22] block: Extract the block accounting code 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 The plan is to add new accounting metrics (latency, invalid requests, fai= led requests, queue depth) and block.c is overpopulated so it will be better = to work in a separate module. Moreover the long term plan is to have statistics in each of the BDS of t= he graph for metrology purpose; this means that the device model statistics must m= ove from the topmost BDS to the device model. So we need to decouple the statistic code from BlockDriverState. This is another argument for the extraction of the code in a separate mod= ule. CC: Kevin Wolf CC: Stefan Hajnoczi CC: Max Reitz CC: Eric Blake CC: Benoit Canet CC: Fam Zheng CC: Peter Crosthwaite CC: Paolo Bonzini Signed-off-by: Beno=C3=AEt Canet Signed-off-by: Kevin Wolf --- block.c | 27 ++------------------ block/Makefile.objs | 1 + block/accounting.c | 57 ++++++++++++++++++++++++++++++++++++= ++++++ include/block/accounting.h | 57 ++++++++++++++++++++++++++++++++++++= ++++++ include/block/block.h | 24 ------------------ include/block/block_int.h | 1 + include/hw/virtio/virtio-blk.h | 1 + include/sysemu/dma.h | 1 + 8 files changed, 120 insertions(+), 49 deletions(-) create mode 100644 block/accounting.c create mode 100644 include/block/accounting.h diff --git a/block.c b/block.c index e90f431..1fac189 100644 --- a/block.c +++ b/block.c @@ -3363,9 +3363,8 @@ static int coroutine_fn bdrv_aligned_pwritev(BlockD= riverState *bs, =20 bdrv_set_dirty(bs, sector_num, nb_sectors); =20 - if (bs->stats.wr_highest_sector < sector_num + nb_sectors - 1) { - bs->stats.wr_highest_sector =3D sector_num + nb_sectors - 1; - } + bdrv_acct_highest_sector(bs, sector_num, nb_sectors); + if (bs->growable && ret >=3D 0) { bs->total_sectors =3D MAX(bs->total_sectors, sector_num + nb_sec= tors); } @@ -5572,28 +5571,6 @@ void bdrv_iostatus_set_err(BlockDriverState *bs, i= nt error) } } =20 -void -bdrv_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie, int64_t b= ytes, - enum BlockAcctType type) -{ - assert(type < BDRV_MAX_IOTYPE); - - cookie->bytes =3D bytes; - cookie->start_time_ns =3D get_clock(); - cookie->type =3D type; -} - -void -bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie) -{ - assert(cookie->type < BDRV_MAX_IOTYPE); - - 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; -} - void bdrv_img_create(const char *filename, const char *fmt, const char *base_filename, const char *base_fmt, char *options, uint64_t img_size, int flags, diff --git a/block/Makefile.objs b/block/Makefile.objs index f45f939..c9c8bbb 100644 --- a/block/Makefile.objs +++ b/block/Makefile.objs @@ -18,6 +18,7 @@ block-obj-$(CONFIG_RBD) +=3D rbd.o block-obj-$(CONFIG_GLUSTERFS) +=3D gluster.o block-obj-$(CONFIG_ARCHIPELAGO) +=3D archipelago.o block-obj-$(CONFIG_LIBSSH2) +=3D ssh.o +block-obj-y +=3D accounting.o =20 common-obj-y +=3D stream.o common-obj-y +=3D commit.o diff --git a/block/accounting.c b/block/accounting.c new file mode 100644 index 0000000..702542e --- /dev/null +++ b/block/accounting.c @@ -0,0 +1,57 @@ +/* + * QEMU System Emulator block accounting + * + * Copyright (c) 2011 Christoph Hellwig + * + * Permission is hereby granted, free of charge, to any person obtaining= a copy + * of this software and associated documentation files (the "Software"),= to deal + * in the Software without restriction, including without limitation the= rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or = sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be includ= ed in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRE= SS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILI= TY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHA= LL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR = OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISI= NG FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALING= S IN + * THE SOFTWARE. + */ + +#include "block/accounting.h" +#include "block/block_int.h" + +void +bdrv_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie, int64_t b= ytes, + enum BlockAcctType type) +{ + assert(type < BDRV_MAX_IOTYPE); + + cookie->bytes =3D bytes; + cookie->start_time_ns =3D get_clock(); + cookie->type =3D type; +} + +void +bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie) +{ + assert(cookie->type < BDRV_MAX_IOTYPE); + + 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; +} + + +void bdrv_acct_highest_sector(BlockDriverState *bs, 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; + } +} diff --git a/include/block/accounting.h b/include/block/accounting.h new file mode 100644 index 0000000..2b2d857 --- /dev/null +++ b/include/block/accounting.h @@ -0,0 +1,57 @@ +/* + * QEMU System Emulator block accounting + * + * Copyright (c) 2011 Christoph Hellwig + * + * Permission is hereby granted, free of charge, to any person obtaining= a copy + * of this software and associated documentation files (the "Software"),= to deal + * in the Software without restriction, including without limitation the= rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or = sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be includ= ed in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRE= SS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILI= TY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHA= LL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR = OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISI= NG FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALING= S IN + * THE SOFTWARE. + */ +#ifndef BLOCK_ACCOUNTING_H +#define BLOCK_ACCOUNTING_H + +#include + +#include "qemu/typedefs.h" + +enum BlockAcctType { + BDRV_ACCT_READ, + BDRV_ACCT_WRITE, + BDRV_ACCT_FLUSH, + BDRV_MAX_IOTYPE, +}; + +typedef struct BlockAcctStats { + uint64_t nr_bytes[BDRV_MAX_IOTYPE]; + uint64_t nr_ops[BDRV_MAX_IOTYPE]; + uint64_t total_time_ns[BDRV_MAX_IOTYPE]; + uint64_t wr_highest_sector; +} BlockAcctStats; + +typedef struct BlockAcctCookie { + int64_t bytes; + int64_t start_time_ns; + enum BlockAcctType type; +} BlockAcctCookie; + +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); + +#endif diff --git a/include/block/block.h b/include/block/block.h index f47d66f..5fb36b1 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -485,30 +485,6 @@ void bdrv_op_block_all(BlockDriverState *bs, Error *= reason); void bdrv_op_unblock_all(BlockDriverState *bs, Error *reason); bool bdrv_op_blocker_is_empty(BlockDriverState *bs); =20 -enum BlockAcctType { - BDRV_ACCT_READ, - BDRV_ACCT_WRITE, - BDRV_ACCT_FLUSH, - BDRV_MAX_IOTYPE, -}; - -typedef struct BlockAcctStats { - uint64_t nr_bytes[BDRV_MAX_IOTYPE]; - uint64_t nr_ops[BDRV_MAX_IOTYPE]; - uint64_t total_time_ns[BDRV_MAX_IOTYPE]; - uint64_t wr_highest_sector; -} BlockAcctStats; - -typedef struct BlockAcctCookie { - int64_t bytes; - int64_t start_time_ns; - enum BlockAcctType type; -} BlockAcctCookie; - -void bdrv_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie, - int64_t bytes, enum BlockAcctType type); -void bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie); - typedef enum { BLKDBG_L1_UPDATE, =20 diff --git a/include/block/block_int.h b/include/block/block_int.h index 20954f3..8d86a6c 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -24,6 +24,7 @@ #ifndef BLOCK_INT_H #define BLOCK_INT_H =20 +#include "block/accounting.h" #include "block/block.h" #include "qemu/option.h" #include "qemu/queue.h" diff --git a/include/hw/virtio/virtio-blk.h b/include/hw/virtio/virtio-bl= k.h index afb7b8d..cf61154 100644 --- a/include/hw/virtio/virtio-blk.h +++ b/include/hw/virtio/virtio-blk.h @@ -18,6 +18,7 @@ #include "hw/block/block.h" #include "sysemu/iothread.h" #include "block/block.h" +#include "block/accounting.h" =20 #define TYPE_VIRTIO_BLK "virtio-blk-device" #define VIRTIO_BLK(obj) \ diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h index 00f21f3..73ff86d 100644 --- a/include/sysemu/dma.h +++ b/include/sysemu/dma.h @@ -15,6 +15,7 @@ #include "exec/address-spaces.h" #include "hw/hw.h" #include "block/block.h" +#include "block/accounting.h" #include "sysemu/kvm.h" =20 typedef struct ScatterGatherEntry ScatterGatherEntry; --=20 1.8.3.1