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. > > int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id); > void kvm_vcpu_uninit(struct kvm_vcpu *vcpu); > @@ -335,7 +340,14 @@ static inline struct kvm_memslots *kvm_memslots(struct kvm *kvm) > static inline struct kvm_memory_slot * > id_to_memslot(struct kvm_memslots *slots, int id) > { > - return &slots->memslots[id]; > + int i; > + > + for (i = 0; i < KVM_MEM_SLOTS_NUM; i++) > + if (slots->memslots[i].id == id) > + return &slots->memslots[i]; > + Is that in any hot path? we could make an array for doing this translation. Alex wants to increase the memslot count, so this could be a long loop. -- error compiling committee.c: too many arguments to function -- 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