From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NZgrM-0003KV-7z for qemu-devel@nongnu.org; Tue, 26 Jan 2010 03:33:17 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NZgrE-0003Gu-7K for qemu-devel@nongnu.org; Tue, 26 Jan 2010 03:33:13 -0500 Received: from [199.232.76.173] (port=50317 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NZgrA-0003GS-Ov for qemu-devel@nongnu.org; Tue, 26 Jan 2010 03:33:05 -0500 Received: from mx20.gnu.org ([199.232.41.8]:43116) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NZgrA-0008JZ-0m for qemu-devel@nongnu.org; Tue, 26 Jan 2010 03:33:04 -0500 Received: from mtagate2.uk.ibm.com ([194.196.100.162]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NZgr8-0003da-LH for qemu-devel@nongnu.org; Tue, 26 Jan 2010 03:33:02 -0500 Received: from d06nrmr1707.portsmouth.uk.ibm.com (d06nrmr1707.portsmouth.uk.ibm.com [9.149.39.225]) by mtagate2.uk.ibm.com (8.13.1/8.13.1) with ESMTP id o0Q8X0jc030716 for ; Tue, 26 Jan 2010 08:33:00 GMT Received: from d06av01.portsmouth.uk.ibm.com (d06av01.portsmouth.uk.ibm.com [9.149.37.212]) by d06nrmr1707.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o0Q8X0C01483000 for ; Tue, 26 Jan 2010 08:33:00 GMT Received: from d06av01.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av01.portsmouth.uk.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id o0Q8X0Z8012354 for ; Tue, 26 Jan 2010 08:33:00 GMT From: Liran Schour Date: Tue, 26 Jan 2010 10:31:48 +0200 Message-Id: <1264494709-31848-5-git-send-email-lirans@il.ibm.com> In-Reply-To: <1264494709-31848-4-git-send-email-lirans@il.ibm.com> References: <1264494709-31848-1-git-send-email-lirans@il.ibm.com> <1264494709-31848-2-git-send-email-lirans@il.ibm.com> <1264494709-31848-3-git-send-email-lirans@il.ibm.com> <1264494709-31848-4-git-send-email-lirans@il.ibm.com> Subject: [Qemu-devel] [PATCH v3 4/5] Count dirty blocks and expose an API to get dirty count List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Liran Schour This will manage dirty counter for each device and will allow to get the dirty counter from above. Signed-off-by: Liran Schour --- block.c | 16 ++++++++++++++-- block.h | 1 + block_int.h | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/block.c b/block.c index 30ae2b1..a6381ad 100644 --- a/block.c +++ b/block.c @@ -653,9 +653,15 @@ static void set_dirty_bitmap(BlockDriverState *bs, int64_t sector_num, bit = start % (sizeof(unsigned long) * 8); val = bs->dirty_bitmap[idx]; if (dirty) { - val |= 1 << bit; + if (!(val & (1 << bit))) { + bs->dirty_count++; + val |= 1 << bit; + } } else { - val &= ~(1 << bit); + if (val & (1 << bit)) { + bs->dirty_count--; + val &= ~(1 << bit); + } } bs->dirty_bitmap[idx] = val; } @@ -2116,6 +2122,7 @@ void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable) { int64_t bitmap_size; + bs->dirty_count = 0; if (enable) { if (!bs->dirty_bitmap) { bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS) + @@ -2150,3 +2157,8 @@ void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector, { set_dirty_bitmap(bs, cur_sector, nr_sectors, 0); } + +int64_t bdrv_get_dirty_count(BlockDriverState *bs) +{ + return bs->dirty_count; +} diff --git a/block.h b/block.h index fa51ddf..1012303 100644 --- a/block.h +++ b/block.h @@ -201,4 +201,5 @@ void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable); int bdrv_get_dirty(BlockDriverState *bs, int64_t sector); void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector, int nr_sectors); +int64_t bdrv_get_dirty_count(BlockDriverState *bs); #endif diff --git a/block_int.h b/block_int.h index 9a3b2e0..8d5d9bc 100644 --- a/block_int.h +++ b/block_int.h @@ -172,6 +172,7 @@ struct BlockDriverState { int type; char device_name[32]; unsigned long *dirty_bitmap; + int64_t dirty_count; BlockDriverState *next; void *private; }; -- 1.6.0.4