diff options
author | Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> | 2011-03-09 02:43:51 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2011-03-17 12:08:35 -0400 |
commit | 0f53b5b1c0baae4f949ac0721a55b7a2158dda01 (patch) | |
tree | 822b7230ed0d9731492733d33ad2221cb644bdf2 /arch/x86/kvm/paging_tmpl.h | |
parent | 5d163b1c9d6e5562dcdfd6cd471f237f1502bb35 (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.h | 12 |
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 | ||
327 | static void FNAME(update_pte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, | 327 | static 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). |