aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2009-07-17 13:51:48 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2009-07-22 10:58:46 -0500
commitbd8367761236cd5c435598aeb2f1b8240c09b059 (patch)
tree3f3ef7aa4af62496ce5fdcaac21eaf736f919566
parent16415335bea79c0226f92aec82197ab07b55ba65 (diff)
Fake dirty loggin when it's not there
Some KVM platforms don't support dirty logging yet, like IA64 and PPC, so in order to still have screen updates on those, we need to fake it. This patch just tells the getter function for dirty bitmaps, that all pages within a slot are dirty when the slot has dirty logging enabled. That way we can implement dirty logging on those platforms sometime when it drags down performance, but share the rest of the code with dirty logging capable platforms. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--kvm-all.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/kvm-all.c b/kvm-all.c
index 961fa32d27..2032949ad6 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -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;