aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/paging_tmpl.h
diff options
context:
space:
mode:
authorXiao Guangrong <xiaoguangrong@cn.fujitsu.com>2011-03-09 02:43:51 -0500
committerMarcelo Tosatti <mtosatti@redhat.com>2011-03-17 12:08:35 -0400
commit0f53b5b1c0baae4f949ac0721a55b7a2158dda01 (patch)
tree822b7230ed0d9731492733d33ad2221cb644bdf2 /arch/x86/kvm/paging_tmpl.h
parent5d163b1c9d6e5562dcdfd6cd471f237f1502bb35 (diff)
KVM: MMU: cleanup pte write path
This patch does: - call vcpu->arch.mmu.update_pte directly - use gfn_to_pfn_atomic in update_pte path The suggestion is from Avi. Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/paging_tmpl.h')
-rw-r--r--arch/x86/kvm/paging_tmpl.h12
1 files changed, 7 insertions, 5 deletions
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
index 86eb8160bcb..751405097d8 100644
--- a/arch/x86/kvm/paging_tmpl.h
+++ b/arch/x86/kvm/paging_tmpl.h
@@ -325,7 +325,7 @@ no_present:
325} 325}
326 326
327static void FNAME(update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, 327static void FNAME(update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
328 u64 *spte, const void *pte) 328 u64 *spte, const void *pte, unsigned long mmu_seq)
329{ 329{
330 pt_element_t gpte; 330 pt_element_t gpte;
331 unsigned pte_access; 331 unsigned pte_access;
@@ -337,12 +337,14 @@ static void FNAME(update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
337 337
338 pgprintk("%s: gpte %llx spte %p\n", __func__, (u64)gpte, spte); 338 pgprintk("%s: gpte %llx spte %p\n", __func__, (u64)gpte, spte);
339 pte_access = sp->role.access & FNAME(gpte_access)(vcpu, gpte); 339 pte_access = sp->role.access & FNAME(gpte_access)(vcpu, gpte);
340 pfn = vcpu->arch.update_pte.pfn; 340 pfn = gfn_to_pfn_atomic(vcpu->kvm, gpte_to_gfn(gpte));
341 if (is_error_pfn(pfn)) 341 if (is_error_pfn(pfn)) {
342 kvm_release_pfn_clean(pfn);
342 return; 343 return;
343 if (mmu_notifier_retry(vcpu, vcpu->arch.update_pte.mmu_seq)) 344 }
345 if (mmu_notifier_retry(vcpu, mmu_seq))
344 return; 346 return;
345 kvm_get_pfn(pfn); 347
346 /* 348 /*
347 * we call mmu_set_spte() with host_writable = true beacuse that 349 * we call mmu_set_spte() with host_writable = true beacuse that
348 * vcpu->arch.update_pte.pfn was fetched from get_user_pages(write = 1). 350 * vcpu->arch.update_pte.pfn was fetched from get_user_pages(write = 1).