util/hbitmap: Add an API to reset all set bits in hbitmap
PATCH 1/1 util/hbitmap: Add an API to reset all set bits in hbitmap
The function bdrv_clear_dirty_bitmap() is updated to use faster hbitmap_reset_all() call.
Signed-off-by Wen Congyang <[email protected]>
Signed-off-by zhanghailiang <[email protected]>
Signed-off-by Gonglei <[email protected]>
Acked-by Paolo Bonzini <[email protected]>
--- block.c | 2 +- include/qemu/hbitmap.h | 8 ++++++++ tests/test-hbitmap.c | 38 ++++++++++++++++++++++++++++++++++++++ util/hbitmap.c | 13 +++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-)
block.c +1 -1
@@ -3309,7 +3309,7 @@ void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,void bdrv_clear_dirty_bitmap (BdrvDirtyBitmap *bitmap) {assert (bdrv_dirty_bitmap_enabled (bitmap)); -hbitmap_reset (bitmap->bitmap,0 , bitmap->size); +hbitmap_reset_all (bitmap->bitmap); } void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector,
include/qemu/hbitmap.h +8 -0
@@ -132,6 +132,14 @@ void hbitmap_set(HBitmap *hb, uint64_t start, uint64_t count);void hbitmap_reset (HBitmap *hb,uint64_t start,uint64_t count);/** +* hbitmap_reset_all: +* @hb: HBitmap to operate on. +* +* Reset all bits in an HBitmap. +*/ +void hbitmap_reset_all (HBitmap *hb); + +/** * hbitmap_get: * @hb: HBitmap to operate on. * @item: Bit to query (0-based).
tests/test-hbitmap.c +38 -0
@@ -184,6 +184,23 @@ static void hbitmap_test_reset(TestHBitmapData *data, } } +static void hbitmap_test_reset_all (TestHBitmapData *data) +{ +size_t n; + +hbitmap_reset_all (data->hb); + + n = (data->size +BITS_PER_LONG -1 ) /BITS_PER_LONG ; +if (n ==0 ) { + n =1 ; + } +memset (data->bits,0 , n *sizeof (unsigned long )); + +if (data->granularity ==0 ) { +hbitmap_test_check (data,0 ); + } +} +static void hbitmap_test_check_get (TestHBitmapData *data) {uint64_t count =0 ;
@@ -364,6 +381,26 @@ static void test_hbitmap_reset(TestHBitmapData *data,hbitmap_test_set (data,L3 /2 ,L3 ); } +static void test_hbitmap_reset_all (TestHBitmapData *data, +const void *unused) +{ +hbitmap_test_init (data,L3 *2 ,0 ); +hbitmap_test_set (data,L1 -1 ,L1 +2 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,0 ,L1 *3 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,L2 ,L1 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,L2 ,L3 -L2 +1 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,L3 -1 ,3 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,0 ,L3 *2 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,L3 /2 ,L3 ); +hbitmap_test_reset_all (data); +} +static void test_hbitmap_granularity (TestHBitmapData *data,const void *unused) {
@@ -627,6 +664,7 @@ int main(int argc, char **argv)hbitmap_test_add ("/hbitmap/set/overlap" , test_hbitmap_set_overlap);hbitmap_test_add ("/hbitmap/reset/empty" , test_hbitmap_reset_empty);hbitmap_test_add ("/hbitmap/reset/general" , test_hbitmap_reset); +hbitmap_test_add ("/hbitmap/reset/all" , test_hbitmap_reset_all);hbitmap_test_add ("/hbitmap/granularity" , test_hbitmap_granularity);hbitmap_test_add ("/hbitmap/truncate/nop" , test_hbitmap_truncate_nop);
util/hbitmap.c +13 -0
@@ -356,6 +356,19 @@ void hbitmap_reset(HBitmap *hb, uint64_t start, uint64_t count)hb_reset_between (hb,HBITMAP_LEVELS -1 , start, last); } +void hbitmap_reset_all (HBitmap *hb) +{ +unsigned int i; + +/* Same as hbitmap_alloc() except memset() */ +for (i =HBITMAP_LEVELS ; --i >=1 ; ) { +memset (hb->levels[i],0 , hb->sizes[i] *sizeof (unsigned long )); + } + + hb->levels[0 ][0 ] =1UL << (BITS_PER_LONG -1 ); + hb->count =0 ; +} +bool hbitmap_get (const HBitmap *hb,uint64_t item) {/* Compute position and bit in the last layer. */
Signature · 1 line
2.1.0
Quoted 7 lines · Wen Congyang
The function
bdrv_clear_dirty_bitmap()is updated to use fasterhbitmap_reset_all()call.Signed-off-by Wen Congyang <[email protected]>Signed-off-by zhanghailiang <[email protected]>Signed-off-by Gonglei <[email protected]>Acked-by Paolo Bonzini <[email protected]>
Quoted 6 lines
--- block.c | 2 +- include/qemu/hbitmap.h | 8 ++++++++ tests/test-hbitmap.c | 38 ++++++++++++++++++++++++++++++++++++++ util/hbitmap.c | 13 +++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-)
Reviewed-by Eric Blake <[email protected]>
util/hbitmap.c void hbitmap_reset(HBitmap *hb, uint64_t start, uint64_t count) · line 363
Quoted 5 lines
util/hbitmap.c +5
-0+void hbitmap_reset_all (HBitmap *hb) +{ +unsigned int i; + +/* Same as hbitmap_alloc() except memset() */
maybe s/except memset()/except for memset() instead of malloc()/
Signature · 2 lines
Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
Quoted 124 lines · Wen Congyang
The function
bdrv_clear_dirty_bitmap()is updated to use fasterhbitmap_reset_all()call.Signed-off-by Wen Congyang <[email protected]>Signed-off-by zhanghailiang <[email protected]>Signed-off-by Gonglei <[email protected]>Acked-by Paolo Bonzini <[email protected]>--- block.c | 2 +- include/qemu/hbitmap.h | 8 ++++++++ tests/test-hbitmap.c | 38 ++++++++++++++++++++++++++++++++++++++ util/hbitmap.c | 13 +++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-)block.c +1
-1@@ -3309,7 +3309,7 @@ void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,void bdrv_clear_dirty_bitmap (BdrvDirtyBitmap *bitmap) {assert (bdrv_dirty_bitmap_enabled (bitmap)); -hbitmap_reset (bitmap->bitmap,0 , bitmap->size); +hbitmap_reset_all (bitmap->bitmap); } void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector,include/qemu/hbitmap.h +8
-0@@ -132,6 +132,14 @@ void hbitmap_set(HBitmap *hb, uint64_t start, uint64_t count);void hbitmap_reset (HBitmap *hb,uint64_t start,uint64_t count);/** +* hbitmap_reset_all: +* @hb: HBitmap to operate on. +* +* Reset all bits in an HBitmap. +*/ +void hbitmap_reset_all (HBitmap *hb); + +/** * hbitmap_get: * @hb: HBitmap to operate on. * @item: Bit to query (0-based). tests/test-hbitmap.c +38
-0@@ -184,6 +184,23 @@ static void hbitmap_test_reset(TestHBitmapData *data, } } +static void hbitmap_test_reset_all (TestHBitmapData *data) +{ +size_t n; + +hbitmap_reset_all (data->hb); + + n = (data->size +BITS_PER_LONG -1 ) /BITS_PER_LONG ; +if (n ==0 ) { + n =1 ; + } +memset (data->bits,0 , n *sizeof (unsigned long )); + +if (data->granularity ==0 ) { +hbitmap_test_check (data,0 ); + } +} +static void hbitmap_test_check_get (TestHBitmapData *data) {uint64_t count =0 ;@@ -364,6 +381,26 @@ static void test_hbitmap_reset(TestHBitmapData *data,hbitmap_test_set (data,L3 /2 ,L3 ); } +static void test_hbitmap_reset_all (TestHBitmapData *data, +const void *unused) +{ +hbitmap_test_init (data,L3 *2 ,0 ); +hbitmap_test_set (data,L1 -1 ,L1 +2 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,0 ,L1 *3 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,L2 ,L1 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,L2 ,L3 -L2 +1 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,L3 -1 ,3 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,0 ,L3 *2 ); +hbitmap_test_reset_all (data); +hbitmap_test_set (data,L3 /2 ,L3 ); +hbitmap_test_reset_all (data); +} +static void test_hbitmap_granularity (TestHBitmapData *data,const void *unused) {@@ -627,6 +664,7 @@ int main(int argc, char **argv)hbitmap_test_add ("/hbitmap/set/overlap" , test_hbitmap_set_overlap);hbitmap_test_add ("/hbitmap/reset/empty" , test_hbitmap_reset_empty);hbitmap_test_add ("/hbitmap/reset/general" , test_hbitmap_reset); +hbitmap_test_add ("/hbitmap/reset/all" , test_hbitmap_reset_all);hbitmap_test_add ("/hbitmap/granularity" , test_hbitmap_granularity);hbitmap_test_add ("/hbitmap/truncate/nop" , test_hbitmap_truncate_nop);util/hbitmap.c +6
-0@@ -356,6 +356,19 @@ void hbitmap_reset(HBitmap *hb, uint64_t start, uint64_t count)hb_reset_between (hb,HBITMAP_LEVELS -1 , start, last); } +void hbitmap_reset_all (HBitmap *hb) +{ +unsigned int i; + +/* Same as hbitmap_alloc() except memset() */ +for (i =HBITMAP_LEVELS ; --i >=1 ; ) {
util/hbitmap.c void hbitmap_reset(HBitmap *hb, uint64_t start, uint64_t count) · line 374
Quoted 10 lines
util/hbitmap.c +7
-0+memset (hb->levels[i],0 , hb->sizes[i] *sizeof (unsigned long )); + } + + hb->levels[0 ][0 ] =1UL << (BITS_PER_LONG -1 ); + hb->count =0 ; +} +bool hbitmap_get (const HBitmap *hb,uint64_t item) {/* Compute position and bit in the last layer. */
Thanks!
Reviewed-by John Snow <[email protected]>