浏览代码

KVM: MMU: Inherit a shadow page's guest level count from vcpu setup

Instead of "calculating" it on every shadow page allocation, set it once
when switching modes, and copy it when allocating pages.

This doesn't buy us much, but sets up the stage for inheriting more
information related to the mmu setup.

Signed-off-by: Avi Kivity <avi@redhat.com>
Avi Kivity 16 年之前
父节点
当前提交
a770f6f28b
共有 2 个文件被更改,包括 12 次插入6 次删除
  1. 1 0
      arch/x86/include/asm/kvm_host.h
  2. 11 6
      arch/x86/kvm/mmu.c

+ 1 - 0
arch/x86/include/asm/kvm_host.h

@@ -244,6 +244,7 @@ struct kvm_mmu {
 	hpa_t root_hpa;
 	hpa_t root_hpa;
 	int root_level;
 	int root_level;
 	int shadow_root_level;
 	int shadow_root_level;
+	union kvm_mmu_page_role base_role;
 
 
 	u64 *pae_root;
 	u64 *pae_root;
 };
 };

+ 11 - 6
arch/x86/kvm/mmu.c

@@ -1204,8 +1204,7 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu,
 	struct kvm_mmu_page *sp;
 	struct kvm_mmu_page *sp;
 	struct hlist_node *node, *tmp;
 	struct hlist_node *node, *tmp;
 
 
-	role.word = 0;
-	role.glevels = vcpu->arch.mmu.root_level;
+	role = vcpu->arch.mmu.base_role;
 	role.level = level;
 	role.level = level;
 	role.metaphysical = metaphysical;
 	role.metaphysical = metaphysical;
 	role.access = access;
 	role.access = access;
@@ -2251,17 +2250,23 @@ static int init_kvm_tdp_mmu(struct kvm_vcpu *vcpu)
 
 
 static int init_kvm_softmmu(struct kvm_vcpu *vcpu)
 static int init_kvm_softmmu(struct kvm_vcpu *vcpu)
 {
 {
+	int r;
+
 	ASSERT(vcpu);
 	ASSERT(vcpu);
 	ASSERT(!VALID_PAGE(vcpu->arch.mmu.root_hpa));
 	ASSERT(!VALID_PAGE(vcpu->arch.mmu.root_hpa));
 
 
 	if (!is_paging(vcpu))
 	if (!is_paging(vcpu))
-		return nonpaging_init_context(vcpu);
+		r = nonpaging_init_context(vcpu);
 	else if (is_long_mode(vcpu))
 	else if (is_long_mode(vcpu))
-		return paging64_init_context(vcpu);
+		r = paging64_init_context(vcpu);
 	else if (is_pae(vcpu))
 	else if (is_pae(vcpu))
-		return paging32E_init_context(vcpu);
+		r = paging32E_init_context(vcpu);
 	else
 	else
-		return paging32_init_context(vcpu);
+		r = paging32_init_context(vcpu);
+
+	vcpu->arch.mmu.base_role.glevels = vcpu->arch.mmu.root_level;
+
+	return r;
 }
 }
 
 
 static int init_kvm_mmu(struct kvm_vcpu *vcpu)
 static int init_kvm_mmu(struct kvm_vcpu *vcpu)