From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MRlys-0000Mp-E0 for qemu-devel@nongnu.org; Fri, 17 Jul 2009 07:52:02 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MRlym-0000Hc-U5 for qemu-devel@nongnu.org; Fri, 17 Jul 2009 07:52:01 -0400 Received: from [199.232.76.173] (port=36973 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MRlym-0000HY-Ke for qemu-devel@nongnu.org; Fri, 17 Jul 2009 07:51:56 -0400 Received: from cantor2.suse.de ([195.135.220.15]:48015 helo=mx2.suse.de) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1MRlyl-0001bZ-Oq for qemu-devel@nongnu.org; Fri, 17 Jul 2009 07:51:56 -0400 From: Alexander Graf Date: Fri, 17 Jul 2009 13:51:48 +0200 Message-Id: <1247831508-19023-8-git-send-email-agraf@suse.de> In-Reply-To: <1247831508-19023-7-git-send-email-agraf@suse.de> References: <1247831508-19023-1-git-send-email-agraf@suse.de> <1247831508-19023-2-git-send-email-agraf@suse.de> <1247831508-19023-3-git-send-email-agraf@suse.de> <1247831508-19023-4-git-send-email-agraf@suse.de> <1247831508-19023-5-git-send-email-agraf@suse.de> <1247831508-19023-6-git-send-email-agraf@suse.de> <1247831508-19023-7-git-send-email-agraf@suse.de> Subject: [Qemu-devel] [PATCH 7/7] Fake dirty loggin when it's not there List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: hollisb@us.ibm.com 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 --- kvm-all.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index 60b76cf..72b7935 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; -- 1.6.0.2