summaryrefslogtreecommitdiffstats
path: root/include/linux/kvm_host.h
diff options
context:
space:
mode:
authorXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>2011-11-24 17:40:57 +0800
committerAvi Kivity <avi@redhat.com>2011-12-27 11:17:40 +0200
commitbf3e05bc1e2781d5d8d3ddb2d8bf2d6ec207e5cb (patch)
tree7312367143f00ec1c051831f3a4e6dcc7f8acd92 /include/linux/kvm_host.h
parent28a37544fb0223eb9805d2567b88f7360edec52a (diff)
KVM: sort memslots by its size and use line search
Sort memslots base on its size and use line search to find it, so that the larger memslots have better fit The idea is from Avi Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'include/linux/kvm_host.h')
-rw-r--r--include/linux/kvm_host.h18
1 files changed, 15 insertions, 3 deletions
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 123925cd3ae..9efdf5c703a 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -231,8 +231,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];
};
@@ -310,7 +314,8 @@ static inline struct kvm_vcpu *kvm_get_vcpu(struct kvm *kvm, int i)
#define kvm_for_each_memslot(memslot, slots) \
for (memslot = &slots->memslots[0]; \
- memslot < slots->memslots + (slots)->nmemslots; memslot++)
+ memslot < slots->memslots + KVM_MEM_SLOTS_NUM && memslot->npages;\
+ memslot++)
int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id);
void kvm_vcpu_uninit(struct kvm_vcpu *vcpu);
@@ -336,7 +341,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];
+
+ WARN_ON(1);
+ return NULL;
}
#define HPA_MSB ((sizeof(hpa_t) * 8) - 1)