diff options
Diffstat (limited to 'kvm-all.c')
-rw-r--r-- | kvm-all.c | 13 |
1 files changed, 12 insertions, 1 deletions
@@ -300,6 +300,7 @@ int kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr, KVMDirtyLog d; KVMSlot *mem; int ret = 0; + int r; d.dirty_bitmap = NULL; while (start_addr < end_addr) { @@ -308,6 +309,11 @@ int kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr, break; } + /* We didn't activate dirty logging? Don't care then. */ + if(!(mem->flags & KVM_MEM_LOG_DIRTY_PAGES)) { + continue; + } + size = ((mem->memory_size >> TARGET_PAGE_BITS) + 7) / 8; if (!d.dirty_bitmap) { d.dirty_bitmap = qemu_malloc(size); @@ -319,7 +325,8 @@ int kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr, d.slot = mem->slot; - if (kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d) == -1) { + r = kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d); + if (r == -EINVAL) { dprintf("ioctl failed %d\n", errno); ret = -1; break; @@ -335,6 +342,10 @@ int kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr, if ((bitmap[word] >> bit) & 1) { cpu_physical_memory_set_dirty(addr); + } else if (r < 0) { + /* When our KVM implementation doesn't know about dirty logging + * we can just assume it's always dirty and be fine. */ + cpu_physical_memory_set_dirty(addr); } } start_addr = phys_addr; |