From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NUfHq-0002Jx-Ia for qemu-devel@nongnu.org; Tue, 12 Jan 2010 06:51:50 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NUfHl-0002IX-PI for qemu-devel@nongnu.org; Tue, 12 Jan 2010 06:51:50 -0500 Received: from [199.232.76.173] (port=60869 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NUfHl-0002IS-Gu for qemu-devel@nongnu.org; Tue, 12 Jan 2010 06:51:45 -0500 Received: from mx20.gnu.org ([199.232.41.8]:1696) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NUfHl-0001ha-31 for qemu-devel@nongnu.org; Tue, 12 Jan 2010 06:51:45 -0500 Received: from david.siemens.de ([192.35.17.14]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NUfGw-0000Ur-KQ for qemu-devel@nongnu.org; Tue, 12 Jan 2010 06:50:55 -0500 Message-ID: <4B4C621C.7000508@siemens.com> Date: Tue, 12 Jan 2010 12:50:52 +0100 From: Jan Kiszka MIME-Version: 1.0 References: <1263284833297-git-send-email-lirans@il.ibm.com> <12632848342235-git-send-email-lirans@il.ibm.com> <12632848343008-git-send-email-lirans@il.ibm.com> <12632848351489-git-send-email-lirans@il.ibm.com> In-Reply-To: <12632848351489-git-send-email-lirans@il.ibm.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH 3/4] 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: Liran Schour Cc: qemu-devel@nongnu.org Liran Schour wrote: > 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 | 20 ++++++++++++++++---- > block.h | 1 + > block_int.h | 1 + > 3 files changed, 18 insertions(+), 4 deletions(-) > > diff --git a/block.c b/block.c > index 853f025..ecfcba4 100644 > --- a/block.c > +++ b/block.c > @@ -652,9 +652,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; > } > @@ -1972,14 +1978,15 @@ void *qemu_blockalign(BlockDriverState *bs, size_t size) > 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) + > BDRV_SECTORS_PER_DIRTY_CHUNK * 8 - 1; > bitmap_size /= BDRV_SECTORS_PER_DIRTY_CHUNK * 8; > > - bs->dirty_bitmap = qemu_mallocz(bitmap_size); > + bs->dirty_bitmap = qemu_mallocz(bitmap_size); > } > } else { > if (bs->dirty_bitmap) { > @@ -2007,3 +2014,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 4a8b628..bf489d0 100644 > --- a/block.h > +++ b/block.h > @@ -198,4 +198,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; > }; Looks good (except for the whitespace issues). Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux