From mboxrd@z Thu Jan 1 00:00:00 1970 From: Xiao Guangrong Subject: Re: [PATCH v2 5/6] KVM: sort memslots by its size and use line search Date: Mon, 21 Nov 2011 11:48:15 +0800 Message-ID: <4EC9C9FF.6020503@linux.vnet.ibm.com> References: <4EC6226B.3080408@linux.vnet.ibm.com> <4EC62336.7040505@linux.vnet.ibm.com> <4EC8E3FB.7020108@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , LKML , KVM To: Avi Kivity Return-path: Received: from e28smtp05.in.ibm.com ([122.248.162.5]:38093 "EHLO e28smtp05.in.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755176Ab1KUDsZ (ORCPT ); Sun, 20 Nov 2011 22:48:25 -0500 Received: from /spool/local by e28smtp05.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 21 Nov 2011 09:18:22 +0530 In-Reply-To: <4EC8E3FB.7020108@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 11/20/2011 07:26 PM, Avi Kivity wrote: > On 11/18/2011 11:19 AM, Xiao Guangrong wrote: >> Sort memslots base on its size and use line search to find it, so the larger >> memslots have better fit >> >> The idea is from Avi >> >> Signed-off-by: Xiao Guangrong >> --- >> include/linux/kvm_host.h | 22 +++++++++--- >> virt/kvm/kvm_main.c | 82 ++++++++++++++++++++++++++++++++------------- >> 2 files changed, 75 insertions(+), 29 deletions(-) >> >> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h >> index a0e4d63..83b396a 100644 >> --- a/include/linux/kvm_host.h >> +++ b/include/linux/kvm_host.h >> @@ -230,8 +230,12 @@ struct kvm_irq_routing_table {}; >> #define KVM_MEM_SLOTS_NUM (KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS) >> #endif >> >> +/* >> + * Note: >> + * memslots are not sorted by id anymore, please use id_to_memslot() >> + * to get the memslot by its id. >> + */ >> struct kvm_memslots { >> - int nmemslots; >> u64 generation; >> struct kvm_memory_slot memslots[KVM_MEM_SLOTS_NUM]; >> }; >> @@ -307,9 +311,10 @@ static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i) >> (vcpup = kvm_get_vcpu(kvm, idx)) != NULL; \ >> idx++) >> >> -#define kvm_for_each_memslot(slots, memslot, i) \ >> - for (i = 0; i < (slots)->nmemslots && \ >> - ({ memslot = &(slots)->memslots[i]; 1; }); i++) >> +#define kvm_for_each_memslot(slots, memslot, i) \ >> + for (i = 0; i < KVM_MEM_SLOTS_NUM && \ >> + ({ memslot = &(slots)->memslots[i]; 1; }) && \ >> + memslot->npages != 0; i++) > > You might allocate an always-empty memslot at the end and simplify the > termination condition. > The slots are sorted by its size, all empty slots are at the end of the array, so we can simplify break the loop if meet a empty slot.