aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXiao Guangrong <xiaoguangrong@cn.fujitsu.com>2011-03-04 06:00:00 -0500
committerMarcelo Tosatti <mtosatti@redhat.com>2011-03-17 12:08:32 -0400
commit49b26e26e4b7b94753b39f7edb0c34f3d1c4c167 (patch)
tree227a106a1e9a5383b290d718bcfad01297fc0c22
parent48c0e4e9067eb085e7b300628c9640df071aac55 (diff)
KVM: MMU: do not record gfn in kvm_mmu_pte_write
No need to record the gfn to verifier the pte has the same mode as current vcpu, it's because we only speculatively update the pte only if the pte and vcpu have the same mode Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r--arch/x86/include/asm/kvm_host.h1
-rw-r--r--arch/x86/kvm/mmu.c6
-rw-r--r--arch/x86/kvm/paging_tmpl.h2
3 files changed, 2 insertions, 7 deletions
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 37bd730ff852..f08314f303e0 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -336,7 +336,6 @@ struct kvm_vcpu_arch {
336 gfn_t last_pte_gfn; 336 gfn_t last_pte_gfn;
337 337
338 struct { 338 struct {
339 gfn_t gfn; /* presumed gfn during guest pte update */
340 pfn_t pfn; /* pfn corresponding to that gfn */ 339 pfn_t pfn; /* pfn corresponding to that gfn */
341 unsigned long mmu_seq; 340 unsigned long mmu_seq;
342 } update_pte; 341 } update_pte;
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index d5455b1b725f..91a194667432 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -3228,7 +3228,6 @@ static void mmu_guess_page_from_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
3228 kvm_release_pfn_clean(pfn); 3228 kvm_release_pfn_clean(pfn);
3229 return; 3229 return;
3230 } 3230 }
3231 vcpu->arch.update_pte.gfn = gfn;
3232 vcpu->arch.update_pte.pfn = pfn; 3231 vcpu->arch.update_pte.pfn = pfn;
3233} 3232}
3234 3233
@@ -3275,9 +3274,8 @@ void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
3275 3274
3276 /* 3275 /*
3277 * Assume that the pte write on a page table of the same type 3276 * Assume that the pte write on a page table of the same type
3278 * as the current vcpu paging mode. This is nearly always true 3277 * as the current vcpu paging mode since we update the sptes only
3279 * (might be false while changing modes). Note it is verified later 3278 * when they have the same mode.
3280 * by update_pte().
3281 */ 3279 */
3282 if ((is_pae(vcpu) && bytes == 4) || !new) { 3280 if ((is_pae(vcpu) && bytes == 4) || !new) {
3283 /* Handle a 32-bit guest writing two halves of a 64-bit gpte */ 3281 /* Handle a 32-bit guest writing two halves of a 64-bit gpte */
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
index 6bccc24c4181..b3862eeabb8a 100644
--- a/arch/x86/kvm/paging_tmpl.h
+++ b/arch/x86/kvm/paging_tmpl.h
@@ -339,8 +339,6 @@ static void FNAME(update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
339 339
340 pgprintk("%s: gpte %llx spte %p\n", __func__, (u64)gpte, spte); 340 pgprintk("%s: gpte %llx spte %p\n", __func__, (u64)gpte, spte);
341 pte_access = sp->role.access & FNAME(gpte_access)(vcpu, gpte); 341 pte_access = sp->role.access & FNAME(gpte_access)(vcpu, gpte);
342 if (gpte_to_gfn(gpte) != vcpu->arch.update_pte.gfn)
343 return;
344 pfn = vcpu->arch.update_pte.pfn; 342 pfn = vcpu->arch.update_pte.pfn;
345 if (is_error_pfn(pfn)) 343 if (is_error_pfn(pfn))
346 return; 344 return;