diff options
Diffstat (limited to 'arch/x86/kvm/mmu.c')
| -rw-r--r-- | arch/x86/kvm/mmu.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index ee3f53098f0c..7e7c3969f7a2 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -640,6 +640,7 @@ static void rmap_write_protect(struct kvm *kvm, u64 gfn) | |||
| 640 | rmap_remove(kvm, spte); | 640 | rmap_remove(kvm, spte); |
| 641 | --kvm->stat.lpages; | 641 | --kvm->stat.lpages; |
| 642 | set_shadow_pte(spte, shadow_trap_nonpresent_pte); | 642 | set_shadow_pte(spte, shadow_trap_nonpresent_pte); |
| 643 | spte = NULL; | ||
| 643 | write_protected = 1; | 644 | write_protected = 1; |
| 644 | } | 645 | } |
| 645 | spte = rmap_next(kvm, rmapp, spte); | 646 | spte = rmap_next(kvm, rmapp, spte); |
| @@ -1082,10 +1083,6 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte, | |||
| 1082 | struct kvm_mmu_page *shadow; | 1083 | struct kvm_mmu_page *shadow; |
| 1083 | 1084 | ||
| 1084 | spte |= PT_WRITABLE_MASK; | 1085 | spte |= PT_WRITABLE_MASK; |
| 1085 | if (user_fault) { | ||
| 1086 | mmu_unshadow(vcpu->kvm, gfn); | ||
| 1087 | goto unshadowed; | ||
| 1088 | } | ||
| 1089 | 1086 | ||
| 1090 | shadow = kvm_mmu_lookup_page(vcpu->kvm, gfn); | 1087 | shadow = kvm_mmu_lookup_page(vcpu->kvm, gfn); |
| 1091 | if (shadow || | 1088 | if (shadow || |
| @@ -1102,8 +1099,6 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte, | |||
| 1102 | } | 1099 | } |
| 1103 | } | 1100 | } |
| 1104 | 1101 | ||
| 1105 | unshadowed: | ||
| 1106 | |||
| 1107 | if (pte_access & ACC_WRITE_MASK) | 1102 | if (pte_access & ACC_WRITE_MASK) |
| 1108 | mark_page_dirty(vcpu->kvm, gfn); | 1103 | mark_page_dirty(vcpu->kvm, gfn); |
| 1109 | 1104 | ||
| @@ -1580,11 +1575,13 @@ static void mmu_pte_write_new_pte(struct kvm_vcpu *vcpu, | |||
| 1580 | u64 *spte, | 1575 | u64 *spte, |
| 1581 | const void *new) | 1576 | const void *new) |
| 1582 | { | 1577 | { |
| 1583 | if ((sp->role.level != PT_PAGE_TABLE_LEVEL) | 1578 | if (sp->role.level != PT_PAGE_TABLE_LEVEL) { |
| 1584 | && !vcpu->arch.update_pte.largepage) { | 1579 | if (!vcpu->arch.update_pte.largepage || |
| 1585 | ++vcpu->kvm->stat.mmu_pde_zapped; | 1580 | sp->role.glevels == PT32_ROOT_LEVEL) { |
| 1586 | return; | 1581 | ++vcpu->kvm->stat.mmu_pde_zapped; |
| 1587 | } | 1582 | return; |
| 1583 | } | ||
| 1584 | } | ||
| 1588 | 1585 | ||
| 1589 | ++vcpu->kvm->stat.mmu_pte_updated; | 1586 | ++vcpu->kvm->stat.mmu_pte_updated; |
| 1590 | if (sp->role.glevels == PT32_ROOT_LEVEL) | 1587 | if (sp->role.glevels == PT32_ROOT_LEVEL) |
