qemu-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-commits] [COMMIT bd83677] Fake dirty loggin when it's not there


From: Anthony Liguori
Subject: [Qemu-commits] [COMMIT bd83677] Fake dirty loggin when it's not there
Date: Wed, 22 Jul 2009 16:26:28 -0000

From: Alexander Graf <address@hidden>

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 <address@hidden>
Signed-off-by: Anthony Liguori <address@hidden>

diff --git a/kvm-all.c b/kvm-all.c
index 961fa32..2032949 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;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]