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 <xiaoguangrong@xxxxxxxxxxxxxxxxxx> >> --- >> 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. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html