From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LXFze-0004zz-Bl for qemu-devel@nongnu.org; Wed, 11 Feb 2009 09:23:14 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LXFzb-0004yg-Ti for qemu-devel@nongnu.org; Wed, 11 Feb 2009 09:23:13 -0500 Received: from [199.232.76.173] (port=49685 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LXFzb-0004yX-N5 for qemu-devel@nongnu.org; Wed, 11 Feb 2009 09:23:11 -0500 Received: from gecko.sbs.de ([194.138.37.40]:22826) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LXFza-0003FT-Rn for qemu-devel@nongnu.org; Wed, 11 Feb 2009 09:23:11 -0500 Message-ID: <4992DF4B.6070109@siemens.com> Date: Wed, 11 Feb 2009 15:23:07 +0100 From: Jan Kiszka MIME-Version: 1.0 References: <1234360034-19459-1-git-send-email-glommer@redhat.com> In-Reply-To: <1234360034-19459-1-git-send-email-glommer@redhat.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH] remove smaller slots if registering a bigger one Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Glauber Costa Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org Glauber Costa wrote: > It's like a shark eating a bunch of small fishes: > in some situations (vga linear frame buffer mapping, > for example), we need to register a new slot in place > of older, smaller ones. This patch handles this case > > Signed-off-by: Glauber Costa > --- > kvm-all.c | 10 ++++++++++ > 1 files changed, 10 insertions(+), 0 deletions(-) > > diff --git a/kvm-all.c b/kvm-all.c > index 9fb295c..53aca0a 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -582,6 +582,16 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr, > kvm_set_phys_mem(mem_start, mem_size, mem_offset); > > return; > + } else if (start_addr <= mem->start_addr && > + (start_addr + size) >= (mem->start_addr + > + mem->memory_size)) { > + KVMSlot slot; > + /* unregister whole slot */ > + memcpy(&slot, mem, sizeof(slot)); > + mem->memory_size = 0; > + kvm_set_user_memory_region(s, mem); > + > + kvm_set_phys_mem(start_addr, size, phys_offset); That may solve some problems, but... > } else { > printf("Registering overlapping slot\n"); > abort(); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...as long as this line exists, issues will remain. IIRC, the mapping the i440 tries to re-establish after reboot will hit this case. BTW, I found the unposted patch below in my attic, maybe you can comment on it (if it makes sense, I'll properly repost with signed-off). Thanks, Jan ----------> kvm: cleanup unmap condition in kvm_set_phys_mem Testing for TLB_MMIO on unmap makes no sense as A) that flag belongs to CPUTLBEntry and not to io_memory slots or physical addresses and B) we already use a different condition before mapping. So make this test consistent. diff --git a/kvm-all.c b/kvm-all.c index 9fb295c..c0481a0 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -540,7 +540,7 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr, mem = kvm_lookup_slot(s, start_addr); if (mem) { - if ((flags == IO_MEM_UNASSIGNED) || (flags >= TLB_MMIO)) { + if (flags >= IO_MEM_UNASSIGNED) { mem->memory_size = 0; mem->start_addr = start_addr; mem->phys_offset = 0;