aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/paging_tmpl.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kvm/paging_tmpl.h')
-rw-r--r--arch/x86/kvm/paging_tmpl.h17
1 files changed, 8 insertions, 9 deletions
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
index c2fd2b96144..4b55f462e2b 100644
--- a/arch/x86/kvm/paging_tmpl.h
+++ b/arch/x86/kvm/paging_tmpl.h
@@ -399,6 +399,14 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr,
399 page = gfn_to_page(vcpu->kvm, walker.gfn); 399 page = gfn_to_page(vcpu->kvm, walker.gfn);
400 up_read(&current->mm->mmap_sem); 400 up_read(&current->mm->mmap_sem);
401 401
402 /* mmio */
403 if (is_error_page(page)) {
404 pgprintk("gfn %x is mmio\n", walker.gfn);
405 kvm_release_page_clean(page);
406 up_read(&vcpu->kvm->slots_lock);
407 return 1;
408 }
409
402 spin_lock(&vcpu->kvm->mmu_lock); 410 spin_lock(&vcpu->kvm->mmu_lock);
403 kvm_mmu_free_some_pages(vcpu); 411 kvm_mmu_free_some_pages(vcpu);
404 shadow_pte = FNAME(fetch)(vcpu, addr, &walker, user_fault, write_fault, 412 shadow_pte = FNAME(fetch)(vcpu, addr, &walker, user_fault, write_fault,
@@ -409,15 +417,6 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr,
409 if (!write_pt) 417 if (!write_pt)
410 vcpu->arch.last_pt_write_count = 0; /* reset fork detector */ 418 vcpu->arch.last_pt_write_count = 0; /* reset fork detector */
411 419
412 /*
413 * mmio: emulate if accessible, otherwise its a guest fault.
414 */
415 if (shadow_pte && is_io_pte(*shadow_pte)) {
416 spin_unlock(&vcpu->kvm->mmu_lock);
417 up_read(&vcpu->kvm->slots_lock);
418 return 1;
419 }
420
421 ++vcpu->stat.pf_fixed; 420 ++vcpu->stat.pf_fixed;
422 kvm_mmu_audit(vcpu, "post page fault (fixed)"); 421 kvm_mmu_audit(vcpu, "post page fault (fixed)");
423 spin_unlock(&vcpu->kvm->mmu_lock); 422 spin_unlock(&vcpu->kvm->mmu_lock);