mirror of https://github.com/xemu-project/xemu.git
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.
|
||||
*/
|
||||
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
|
||||
|
@ -384,6 +387,7 @@ HBitmap *hbitmap_alloc(uint64_t size, int granularity)
|
|||
hb->granularity = granularity;
|
||||
for (i = HBITMAP_LEVELS; i-- > 0; ) {
|
||||
size = MAX((size + BITS_PER_LONG - 1) >> BITS_PER_LEVEL, 1);
|
||||
hb->sizes[i] = size;
|
||||
hb->levels[i] = g_new0(unsigned long, size);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue