|
@@ -745,7 +745,7 @@ static int kvm_log_clear_one_slot(KVMSlot *mem, int as_id, uint64_t start,
|
|
|
assert(bmap_start % BITS_PER_LONG == 0);
|
|
|
/* We should never do log_clear before log_sync */
|
|
|
assert(mem->dirty_bmap);
|
|
|
- if (start_delta) {
|
|
|
+ if (start_delta || bmap_npages - size / psize) {
|
|
|
/* Slow path - we need to manipulate a temp bitmap */
|
|
|
bmap_clear = bitmap_new(bmap_npages);
|
|
|
bitmap_copy_with_src_offset(bmap_clear, mem->dirty_bmap,
|
|
@@ -758,7 +758,10 @@ static int kvm_log_clear_one_slot(KVMSlot *mem, int as_id, uint64_t start,
|
|
|
bitmap_clear(bmap_clear, 0, start_delta);
|
|
|
d.dirty_bitmap = bmap_clear;
|
|
|
} else {
|
|
|
- /* Fast path - start address aligns well with BITS_PER_LONG */
|
|
|
+ /*
|
|
|
+ * Fast path - both start and size align well with BITS_PER_LONG
|
|
|
+ * (or the end of memory slot)
|
|
|
+ */
|
|
|
d.dirty_bitmap = mem->dirty_bmap + BIT_WORD(bmap_start);
|
|
|
}
|
|
|
|