diff options
author | Eric Auger <eric.auger@linaro.org> | 2014-06-06 05:10:23 -0400 |
---|---|---|
committer | Christoffer Dall <christoffer.dall@linaro.org> | 2014-07-11 07:46:52 -0400 |
commit | df6ce24f2ee485c4f9a5cb610063a5eb60da8267 (patch) | |
tree | dc0cfb6654c6c9e3f0996fa02b1ceebc2fea8339 /arch/arm/kvm | |
parent | 4f853a714bf16338ff5261128e6c7ae2569e9505 (diff) |
ARM: KVM: Unmap IPA on memslot delete/move
Currently when a KVM region is deleted or moved after
KVM_SET_USER_MEMORY_REGION ioctl, the corresponding
intermediate physical memory is not unmapped.
This patch corrects this and unmaps the region's IPA range
in kvm_arch_commit_memory_region using unmap_stage2_range.
Signed-off-by: Eric Auger <eric.auger@linaro.org>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
Diffstat (limited to 'arch/arm/kvm')
-rw-r--r-- | arch/arm/kvm/arm.c | 37 | ||||
-rw-r--r-- | arch/arm/kvm/mmu.c | 46 |
2 files changed, 46 insertions, 37 deletions
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 3c82b37c0f9e..d7424ef80354 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
@@ -155,16 +155,6 @@ int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf) | |||
155 | return VM_FAULT_SIGBUS; | 155 | return VM_FAULT_SIGBUS; |
156 | } | 156 | } |
157 | 157 | ||
158 | void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free, | ||
159 | struct kvm_memory_slot *dont) | ||
160 | { | ||
161 | } | ||
162 | |||
163 | int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot, | ||
164 | unsigned long npages) | ||
165 | { | ||
166 | return 0; | ||
167 | } | ||
168 | 158 | ||
169 | /** | 159 | /** |
170 | * kvm_arch_destroy_vm - destroy the VM data structure | 160 | * kvm_arch_destroy_vm - destroy the VM data structure |
@@ -225,33 +215,6 @@ long kvm_arch_dev_ioctl(struct file *filp, | |||
225 | return -EINVAL; | 215 | return -EINVAL; |
226 | } | 216 | } |
227 | 217 | ||
228 | void kvm_arch_memslots_updated(struct kvm *kvm) | ||
229 | { | ||
230 | } | ||
231 | |||
232 | int kvm_arch_prepare_memory_region(struct kvm *kvm, | ||
233 | struct kvm_memory_slot *memslot, | ||
234 | struct kvm_userspace_memory_region *mem, | ||
235 | enum kvm_mr_change change) | ||
236 | { | ||
237 | return 0; | ||
238 | } | ||
239 | |||
240 | void kvm_arch_commit_memory_region(struct kvm *kvm, | ||
241 | struct kvm_userspace_memory_region *mem, | ||
242 | const struct kvm_memory_slot *old, | ||
243 | enum kvm_mr_change change) | ||
244 | { | ||
245 | } | ||
246 | |||
247 | void kvm_arch_flush_shadow_all(struct kvm *kvm) | ||
248 | { | ||
249 | } | ||
250 | |||
251 | void kvm_arch_flush_shadow_memslot(struct kvm *kvm, | ||
252 | struct kvm_memory_slot *slot) | ||
253 | { | ||
254 | } | ||
255 | 218 | ||
256 | struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id) | 219 | struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id) |
257 | { | 220 | { |
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index 23360610aeac..b2a708be1407 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c | |||
@@ -1111,3 +1111,49 @@ out: | |||
1111 | free_hyp_pgds(); | 1111 | free_hyp_pgds(); |
1112 | return err; | 1112 | return err; |
1113 | } | 1113 | } |
1114 | |||
1115 | void kvm_arch_commit_memory_region(struct kvm *kvm, | ||
1116 | struct kvm_userspace_memory_region *mem, | ||
1117 | const struct kvm_memory_slot *old, | ||
1118 | enum kvm_mr_change change) | ||
1119 | { | ||
1120 | gpa_t gpa = old->base_gfn << PAGE_SHIFT; | ||
1121 | phys_addr_t size = old->npages << PAGE_SHIFT; | ||
1122 | if (change == KVM_MR_DELETE || change == KVM_MR_MOVE) { | ||
1123 | spin_lock(&kvm->mmu_lock); | ||
1124 | unmap_stage2_range(kvm, gpa, size); | ||
1125 | spin_unlock(&kvm->mmu_lock); | ||
1126 | } | ||
1127 | } | ||
1128 | |||
1129 | int kvm_arch_prepare_memory_region(struct kvm *kvm, | ||
1130 | struct kvm_memory_slot *memslot, | ||
1131 | struct kvm_userspace_memory_region *mem, | ||
1132 | enum kvm_mr_change change) | ||
1133 | { | ||
1134 | return 0; | ||
1135 | } | ||
1136 | |||
1137 | void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free, | ||
1138 | struct kvm_memory_slot *dont) | ||
1139 | { | ||
1140 | } | ||
1141 | |||
1142 | int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot, | ||
1143 | unsigned long npages) | ||
1144 | { | ||
1145 | return 0; | ||
1146 | } | ||
1147 | |||
1148 | void kvm_arch_memslots_updated(struct kvm *kvm) | ||
1149 | { | ||
1150 | } | ||
1151 | |||
1152 | void kvm_arch_flush_shadow_all(struct kvm *kvm) | ||
1153 | { | ||
1154 | } | ||
1155 | |||
1156 | void kvm_arch_flush_shadow_memslot(struct kvm *kvm, | ||
1157 | struct kvm_memory_slot *slot) | ||
1158 | { | ||
1159 | } | ||