mirror of
https://github.com/mii443/qemu.git
synced 2025-08-22 15:15:46 +00:00
hbitmap: add next_zero function
The function searches for next zero bit. Also add interface for BdrvDirtyBitmap and unit test. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: John Snow <jsnow@redhat.com> Message-id: 20171012135313.227864-2-vsementsov@virtuozzo.com Signed-off-by: Jeff Cody <jcody@redhat.com>
This commit is contained in:
committed by
Jeff Cody
parent
411ad78115
commit
56207df55e
@ -188,6 +188,45 @@ void hbitmap_iter_init(HBitmapIter *hbi, const HBitmap *hb, uint64_t first)
|
||||
}
|
||||
}
|
||||
|
||||
int64_t hbitmap_next_zero(const HBitmap *hb, uint64_t start)
|
||||
{
|
||||
size_t pos = (start >> hb->granularity) >> BITS_PER_LEVEL;
|
||||
unsigned long *last_lev = hb->levels[HBITMAP_LEVELS - 1];
|
||||
uint64_t sz = hb->sizes[HBITMAP_LEVELS - 1];
|
||||
unsigned long cur = last_lev[pos];
|
||||
unsigned start_bit_offset =
|
||||
(start >> hb->granularity) & (BITS_PER_LONG - 1);
|
||||
int64_t res;
|
||||
|
||||
cur |= (1UL << start_bit_offset) - 1;
|
||||
assert((start >> hb->granularity) < hb->size);
|
||||
|
||||
if (cur == (unsigned long)-1) {
|
||||
do {
|
||||
pos++;
|
||||
} while (pos < sz && last_lev[pos] == (unsigned long)-1);
|
||||
|
||||
if (pos >= sz) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
cur = last_lev[pos];
|
||||
}
|
||||
|
||||
res = (pos << BITS_PER_LEVEL) + ctol(cur);
|
||||
if (res >= hb->size) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
res = res << hb->granularity;
|
||||
if (res < start) {
|
||||
assert(((start - res) >> hb->granularity) == 0);
|
||||
return start;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
bool hbitmap_empty(const HBitmap *hb)
|
||||
{
|
||||
return hb->count == 0;
|
||||
|
Reference in New Issue
Block a user