From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47203) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VgXhy-0000Uy-Sf for qemu-devel@nongnu.org; Wed, 13 Nov 2013 05:30:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VgXhs-0006Ht-La for qemu-devel@nongnu.org; Wed, 13 Nov 2013 05:30:02 -0500 Received: from mx1.redhat.com ([209.132.183.28]:8295) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VgXhs-0006Hn-DV for qemu-devel@nongnu.org; Wed, 13 Nov 2013 05:29:56 -0500 From: Fam Zheng Date: Wed, 13 Nov 2013 18:29:44 +0800 Message-Id: <1384338584-14065-3-git-send-email-famz@redhat.com> In-Reply-To: <1384338584-14065-1-git-send-email-famz@redhat.com> References: <1384338584-14065-1-git-send-email-famz@redhat.com> Subject: [Qemu-devel] [PATCH v3 2/2] qapi: Change BlockDirtyInfo to list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, pbonzini@redhat.com, =?UTF-8?q?Beno=C3=AEt=20Canet?= , stefanha@redhat.com We have multiple dirty bitmaps in BDS now, switch QAPI to allow query it (BlockInfo.dirty_bitmaps), and also drop old BlockInfo.dirty. Signed-off-by: Fam Zheng --- block.c | 20 ++++++++++++++++++++ block/qapi.c | 5 +++++ include/block/block.h | 1 + qapi-schema.json | 6 +++--- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/block.c b/block.c index ef7a55f..f57ae83 100644 --- a/block.c +++ b/block.c @@ -4379,6 +4379,26 @@ void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap) } } +BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs) +{ + BdrvDirtyBitmap *bm; + BlockDirtyInfoList *list = NULL; + BlockDirtyInfoList **plist = &list; + + QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) { + BlockDirtyInfo *info = g_malloc0(sizeof(BlockDirtyInfo)); + BlockDirtyInfoList *entry = g_malloc0(sizeof(BlockDirtyInfoList)); + info->count = bdrv_get_dirty_count(bs, bm); + info->granularity = + ((int64_t) BDRV_SECTOR_SIZE << hbitmap_granularity(bm->bitmap)); + entry->value = info; + *plist = entry; + plist = &entry->next; + } + + return list; +} + int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector) { if (bitmap) { diff --git a/block/qapi.c b/block/qapi.c index 6b0cdcf..a32cb79 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -204,6 +204,11 @@ void bdrv_query_info(BlockDriverState *bs, info->io_status = bs->iostatus; } + if (!QLIST_EMPTY(&bs->dirty_bitmaps)) { + info->has_dirty_bitmaps = true; + info->dirty_bitmaps = bdrv_query_dirty_bitmaps(bs); + } + if (bs->drv) { info->has_inserted = true; info->inserted = g_malloc0(sizeof(*info->inserted)); diff --git a/include/block/block.h b/include/block/block.h index 06f424c..00f2711 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -391,6 +391,7 @@ struct HBitmapIter; typedef struct BdrvDirtyBitmap BdrvDirtyBitmap; BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs, int granularity); void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap); +BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs); int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector); void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector, int nr_sectors); void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector, int nr_sectors); diff --git a/qapi-schema.json b/qapi-schema.json index 81a375b..931d710 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -948,8 +948,8 @@ # @tray_open: #optional True if the device has a tray and it is open # (only present if removable is true) # -# @dirty: #optional dirty bitmap information (only present if the dirty -# bitmap is enabled) +# @dirty-bitmaps: #optional dirty bitmaps information (only present if the +# driver has one or more dirty bitmaps) # # @io-status: #optional @BlockDeviceIoStatus. Only present if the device # supports it and the VM is configured to stop on errors @@ -963,7 +963,7 @@ 'data': {'device': 'str', 'type': 'str', 'removable': 'bool', 'locked': 'bool', '*inserted': 'BlockDeviceInfo', '*tray_open': 'bool', '*io-status': 'BlockDeviceIoStatus', - '*dirty': 'BlockDirtyInfo' } } + '*dirty-bitmaps': ['BlockDirtyInfo'] } } ## # @query-block: -- 1.8.4.2