From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LDMG4-0007xi-GN for qemu-devel@nongnu.org; Thu, 18 Dec 2008 12:01:57 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LDMG0-0007v2-Qi for qemu-devel@nongnu.org; Thu, 18 Dec 2008 12:01:53 -0500 Received: from [199.232.76.173] (port=47969 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LDMFz-0007u1-L7 for qemu-devel@nongnu.org; Thu, 18 Dec 2008 12:01:51 -0500 Received: from mx2.redhat.com ([66.187.237.31]:34495) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LDMFy-0000A2-22 for qemu-devel@nongnu.org; Thu, 18 Dec 2008 12:01:50 -0500 From: Glauber Costa Date: Thu, 18 Dec 2008 12:01:42 -0500 Message-Id: <1229619702-26315-7-git-send-email-glommer@redhat.com> In-Reply-To: <1229619702-26315-6-git-send-email-glommer@redhat.com> References: <1229619702-26315-1-git-send-email-glommer@redhat.com> <1229619702-26315-2-git-send-email-glommer@redhat.com> <1229619702-26315-3-git-send-email-glommer@redhat.com> <1229619702-26315-4-git-send-email-glommer@redhat.com> <1229619702-26315-5-git-send-email-glommer@redhat.com> <1229619702-26315-6-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 6/6] cache slot lookup Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Ian.Jackson@eu.citrix.com, avi@redhat.com, kvm@vger.kernel.org, stefano.stabellini@eu.citrix.com record slot used in last lookup. For the common mmio case, we'll usually access the same memory slot repeatedly. Signed-off-by: Glauber Costa --- kvm-all.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index a94ee57..8896cf8 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -75,16 +75,25 @@ static KVMSlot *kvm_alloc_slot(KVMState *s) return NULL; } +static KVMSlot *last_slot = NULL; + static KVMSlot *kvm_lookup_slot(KVMState *s, target_phys_addr_t start_addr) { int i; + + if (last_slot && (start_addr >= last_slot->start_addr && + start_addr < (last_slot->start_addr + last_slot->memory_size))) + return last_slot; + for (i = 0; i < ARRAY_SIZE(s->slots); i++) { KVMSlot *mem = &s->slots[i]; if (start_addr >= mem->start_addr && - start_addr < (mem->start_addr + mem->memory_size)) + start_addr < (mem->start_addr + mem->memory_size)) { + last_slot = mem; return mem; + } } return NULL; -- 1.5.6.5