hbitmap: cache array lengths
As a convenience: between incremental backups, bitmap migrations and bitmap persistence we seem to need to recalculate these a lot. Because the lengths are a little bit-twiddly, let's just solidly cache them and be done with it. Reviewed-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 1429314609-29776-7-git-send-email-jsnow@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
592fdd02ae
commit
8515efbef1
|
@ -90,6 +90,9 @@ struct HBitmap {
|
||||||
* bitmap will still allocate HBITMAP_LEVELS arrays.
|
* bitmap will still allocate HBITMAP_LEVELS arrays.
|
||||||
*/
|
*/
|
||||||
unsigned long *levels[HBITMAP_LEVELS];
|
unsigned long *levels[HBITMAP_LEVELS];
|
||||||
|
|
||||||
|
/* The length of each levels[] array. */
|
||||||
|
uint64_t sizes[HBITMAP_LEVELS];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Advance hbi to the next nonzero word and return it. hbi->pos
|
/* Advance hbi to the next nonzero word and return it. hbi->pos
|
||||||
|
@ -384,6 +387,7 @@ HBitmap *hbitmap_alloc(uint64_t size, int granularity)
|
||||||
hb->granularity = granularity;
|
hb->granularity = granularity;
|
||||||
for (i = HBITMAP_LEVELS; i-- > 0; ) {
|
for (i = HBITMAP_LEVELS; i-- > 0; ) {
|
||||||
size = MAX((size + BITS_PER_LONG - 1) >> BITS_PER_LEVEL, 1);
|
size = MAX((size + BITS_PER_LONG - 1) >> BITS_PER_LEVEL, 1);
|
||||||
|
hb->sizes[i] = size;
|
||||||
hb->levels[i] = g_new0(unsigned long, size);
|
hb->levels[i] = g_new0(unsigned long, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue