diff options
-rw-r--r-- | arch/powerpc/include/asm/kvm_host.h | 3 | ||||
-rw-r--r-- | arch/powerpc/kvm/Kconfig | 1 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_32_mmu_host.c | 1 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_64_mmu_host.c | 1 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_mmu_hpte.c | 5 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_pr.c | 47 |
6 files changed, 51 insertions, 7 deletions
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index cea9d3aab71c..4a5ec8f573c7 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h | |||
@@ -46,8 +46,7 @@ | |||
46 | #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 | 46 | #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 |
47 | #endif | 47 | #endif |
48 | 48 | ||
49 | #if defined(CONFIG_KVM_BOOK3S_64_HV) || defined(CONFIG_KVM_E500V2) || \ | 49 | #if !defined(CONFIG_KVM_440) |
50 | defined(CONFIG_KVM_E500MC) | ||
51 | #include <linux/mmu_notifier.h> | 50 | #include <linux/mmu_notifier.h> |
52 | 51 | ||
53 | #define KVM_ARCH_WANT_MMU_NOTIFIER | 52 | #define KVM_ARCH_WANT_MMU_NOTIFIER |
diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig index 40cad8c8bd0e..71f0cd9edf33 100644 --- a/arch/powerpc/kvm/Kconfig +++ b/arch/powerpc/kvm/Kconfig | |||
@@ -36,6 +36,7 @@ config KVM_BOOK3S_64_HANDLER | |||
36 | config KVM_BOOK3S_PR | 36 | config KVM_BOOK3S_PR |
37 | bool | 37 | bool |
38 | select KVM_MMIO | 38 | select KVM_MMIO |
39 | select MMU_NOTIFIER | ||
39 | 40 | ||
40 | config KVM_BOOK3S_32 | 41 | config KVM_BOOK3S_32 |
41 | tristate "KVM support for PowerPC book3s_32 processors" | 42 | tristate "KVM support for PowerPC book3s_32 processors" |
diff --git a/arch/powerpc/kvm/book3s_32_mmu_host.c b/arch/powerpc/kvm/book3s_32_mmu_host.c index 837f13e7b6bf..9fac0101ffb9 100644 --- a/arch/powerpc/kvm/book3s_32_mmu_host.c +++ b/arch/powerpc/kvm/book3s_32_mmu_host.c | |||
@@ -254,6 +254,7 @@ next_pteg: | |||
254 | 254 | ||
255 | kvmppc_mmu_hpte_cache_map(vcpu, pte); | 255 | kvmppc_mmu_hpte_cache_map(vcpu, pte); |
256 | 256 | ||
257 | kvm_release_pfn_clean(hpaddr >> PAGE_SHIFT); | ||
257 | out: | 258 | out: |
258 | return r; | 259 | return r; |
259 | } | 260 | } |
diff --git a/arch/powerpc/kvm/book3s_64_mmu_host.c b/arch/powerpc/kvm/book3s_64_mmu_host.c index 0688b6b39585..6b2c80e49681 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_host.c +++ b/arch/powerpc/kvm/book3s_64_mmu_host.c | |||
@@ -168,6 +168,7 @@ map_again: | |||
168 | 168 | ||
169 | kvmppc_mmu_hpte_cache_map(vcpu, pte); | 169 | kvmppc_mmu_hpte_cache_map(vcpu, pte); |
170 | } | 170 | } |
171 | kvm_release_pfn_clean(hpaddr >> PAGE_SHIFT); | ||
171 | 172 | ||
172 | out: | 173 | out: |
173 | return r; | 174 | return r; |
diff --git a/arch/powerpc/kvm/book3s_mmu_hpte.c b/arch/powerpc/kvm/book3s_mmu_hpte.c index 41cb0017e757..2c86b0d63714 100644 --- a/arch/powerpc/kvm/book3s_mmu_hpte.c +++ b/arch/powerpc/kvm/book3s_mmu_hpte.c | |||
@@ -114,11 +114,6 @@ static void invalidate_pte(struct kvm_vcpu *vcpu, struct hpte_cache *pte) | |||
114 | hlist_del_init_rcu(&pte->list_vpte); | 114 | hlist_del_init_rcu(&pte->list_vpte); |
115 | hlist_del_init_rcu(&pte->list_vpte_long); | 115 | hlist_del_init_rcu(&pte->list_vpte_long); |
116 | 116 | ||
117 | if (pte->pte.may_write) | ||
118 | kvm_release_pfn_dirty(pte->pfn); | ||
119 | else | ||
120 | kvm_release_pfn_clean(pte->pfn); | ||
121 | |||
122 | spin_unlock(&vcpu3s->mmu_lock); | 117 | spin_unlock(&vcpu3s->mmu_lock); |
123 | 118 | ||
124 | vcpu3s->hpte_cache_count--; | 119 | vcpu3s->hpte_cache_count--; |
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c index cae2defd1462..10f8217b8c38 100644 --- a/arch/powerpc/kvm/book3s_pr.c +++ b/arch/powerpc/kvm/book3s_pr.c | |||
@@ -90,8 +90,55 @@ void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu) | |||
90 | 90 | ||
91 | void kvmppc_core_check_requests(struct kvm_vcpu *vcpu) | 91 | void kvmppc_core_check_requests(struct kvm_vcpu *vcpu) |
92 | { | 92 | { |
93 | /* We misuse TLB_FLUSH to indicate that we want to clear | ||
94 | all shadow cache entries */ | ||
95 | if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu)) | ||
96 | kvmppc_mmu_pte_flush(vcpu, 0, 0); | ||
93 | } | 97 | } |
94 | 98 | ||
99 | /************* MMU Notifiers *************/ | ||
100 | |||
101 | int kvm_unmap_hva(struct kvm *kvm, unsigned long hva) | ||
102 | { | ||
103 | trace_kvm_unmap_hva(hva); | ||
104 | |||
105 | /* | ||
106 | * Flush all shadow tlb entries everywhere. This is slow, but | ||
107 | * we are 100% sure that we catch the to be unmapped page | ||
108 | */ | ||
109 | kvm_flush_remote_tlbs(kvm); | ||
110 | |||
111 | return 0; | ||
112 | } | ||
113 | |||
114 | int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end) | ||
115 | { | ||
116 | /* kvm_unmap_hva flushes everything anyways */ | ||
117 | kvm_unmap_hva(kvm, start); | ||
118 | |||
119 | return 0; | ||
120 | } | ||
121 | |||
122 | int kvm_age_hva(struct kvm *kvm, unsigned long hva) | ||
123 | { | ||
124 | /* XXX could be more clever ;) */ | ||
125 | return 0; | ||
126 | } | ||
127 | |||
128 | int kvm_test_age_hva(struct kvm *kvm, unsigned long hva) | ||
129 | { | ||
130 | /* XXX could be more clever ;) */ | ||
131 | return 0; | ||
132 | } | ||
133 | |||
134 | void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte) | ||
135 | { | ||
136 | /* The page will get remapped properly on its next fault */ | ||
137 | kvm_unmap_hva(kvm, hva); | ||
138 | } | ||
139 | |||
140 | /*****************************************/ | ||
141 | |||
95 | static void kvmppc_recalc_shadow_msr(struct kvm_vcpu *vcpu) | 142 | static void kvmppc_recalc_shadow_msr(struct kvm_vcpu *vcpu) |
96 | { | 143 | { |
97 | ulong smsr = vcpu->arch.shared->msr; | 144 | ulong smsr = vcpu->arch.shared->msr; |