Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f85e2cb5 authored by Xiao Guangrong's avatar Xiao Guangrong Committed by Avi Kivity
Browse files

KVM: introduce a table to map slot id to index in memslots array



The operation of getting dirty log is frequent when framebuffer-based
displays are used(for example, Xwindow), so, we introduce a mapping table
to speed up id_to_memslot()

Signed-off-by: default avatarXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent bf3e05bc
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -239,6 +239,8 @@ struct kvm_irq_routing_table {};
struct kvm_memslots {
	u64 generation;
	struct kvm_memory_slot memslots[KVM_MEM_SLOTS_NUM];
	/* The mapping table from slot id to the index in memslots[]. */
	int id_to_index[KVM_MEM_SLOTS_NUM];
};

struct kvm {
@@ -341,14 +343,13 @@ 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)
{
	int i;
	int index = slots->id_to_index[id];
	struct kvm_memory_slot *slot;

	for (i = 0; i < KVM_MEM_SLOTS_NUM; i++)
		if (slots->memslots[i].id == id)
			return &slots->memslots[i];
	slot = &slots->memslots[index];

	WARN_ON(1);
	return NULL;
	WARN_ON(slot->id != id);
	return slot;
}

#define HPA_MSB ((sizeof(hpa_t) * 8) - 1)
+6 −1
Original line number Diff line number Diff line
@@ -446,7 +446,7 @@ static void kvm_init_memslots_id(struct kvm *kvm)
	struct kvm_memslots *slots = kvm->memslots;

	for (i = 0; i < KVM_MEM_SLOTS_NUM; i++)
		slots->memslots[i].id = i;
		slots->id_to_index[i] = slots->memslots[i].id = i;
}

static struct kvm *kvm_create_vm(void)
@@ -674,8 +674,13 @@ static int cmp_memslot(const void *slot1, const void *slot2)
 */
static void sort_memslots(struct kvm_memslots *slots)
{
	int i;

	sort(slots->memslots, KVM_MEM_SLOTS_NUM,
	      sizeof(struct kvm_memory_slot), cmp_memslot, NULL);

	for (i = 0; i < KVM_MEM_SLOTS_NUM; i++)
		slots->id_to_index[slots->memslots[i].id] = i;
}

void update_memslots(struct kvm_memslots *slots, struct kvm_memory_slot *new)