From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LD3IX-0008Mi-IZ for qemu-devel@nongnu.org; Wed, 17 Dec 2008 15:47:13 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LD3IV-0008LS-5z for qemu-devel@nongnu.org; Wed, 17 Dec 2008 15:47:13 -0500 Received: from [199.232.76.173] (port=35713 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LD3IU-0008L2-Lm for qemu-devel@nongnu.org; Wed, 17 Dec 2008 15:47:10 -0500 Received: from mx2.redhat.com ([66.187.237.31]:36331) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LD3IU-0008Pg-0h for qemu-devel@nongnu.org; Wed, 17 Dec 2008 15:47:10 -0500 From: Glauber Costa Date: Wed, 17 Dec 2008 15:47:02 -0500 Message-Id: <1229546822-11972-6-git-send-email-glommer@redhat.com> In-Reply-To: <1229546822-11972-5-git-send-email-glommer@redhat.com> References: <1229546822-11972-1-git-send-email-glommer@redhat.com> <1229546822-11972-2-git-send-email-glommer@redhat.com> <1229546822-11972-3-git-send-email-glommer@redhat.com> <1229546822-11972-4-git-send-email-glommer@redhat.com> <1229546822-11972-5-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 5/5] 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 b432e14..51fc3ed 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