mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 14:53:54 -06:00
dirty-bitmap: add bdrv_dirty_bitmap_next_dirty_area
The function alters bdrv_dirty_iter_next_area(), which is wrong and less efficient (see further commit "block/mirror: fix and improve do_sync_target_write" for description). Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
This commit is contained in:
parent
fa9c2da294
commit
a78a1a48cd
4 changed files with 63 additions and 0 deletions
|
@ -246,6 +246,45 @@ int64_t hbitmap_next_zero(const HBitmap *hb, uint64_t start, uint64_t count)
|
|||
return res;
|
||||
}
|
||||
|
||||
bool hbitmap_next_dirty_area(const HBitmap *hb, uint64_t *start,
|
||||
uint64_t *count)
|
||||
{
|
||||
HBitmapIter hbi;
|
||||
int64_t firt_dirty_off, area_end;
|
||||
uint32_t granularity = 1UL << hb->granularity;
|
||||
uint64_t end;
|
||||
|
||||
if (*start >= hb->orig_size || *count == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
end = *count > hb->orig_size - *start ? hb->orig_size : *start + *count;
|
||||
|
||||
hbitmap_iter_init(&hbi, hb, *start);
|
||||
firt_dirty_off = hbitmap_iter_next(&hbi, false);
|
||||
|
||||
if (firt_dirty_off < 0 || firt_dirty_off >= end) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (firt_dirty_off + granularity >= end) {
|
||||
area_end = end;
|
||||
} else {
|
||||
area_end = hbitmap_next_zero(hb, firt_dirty_off + granularity,
|
||||
end - firt_dirty_off - granularity);
|
||||
if (area_end < 0) {
|
||||
area_end = end;
|
||||
}
|
||||
}
|
||||
|
||||
if (firt_dirty_off > *start) {
|
||||
*start = firt_dirty_off;
|
||||
}
|
||||
*count = area_end - *start;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool hbitmap_empty(const HBitmap *hb)
|
||||
{
|
||||
return hb->count == 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue