aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kvm
diff options
context:
space:
mode:
authorEric Auger <eric.auger@linaro.org>2014-06-06 05:10:23 -0400
committerChristoffer Dall <christoffer.dall@linaro.org>2014-07-11 07:46:52 -0400
commitdf6ce24f2ee485c4f9a5cb610063a5eb60da8267 (patch)
treedc0cfb6654c6c9e3f0996fa02b1ceebc2fea8339 /arch/arm/kvm
parent4f853a714bf16338ff5261128e6c7ae2569e9505 (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.c37
-rw-r--r--arch/arm/kvm/mmu.c46
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
158void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free,
159 struct kvm_memory_slot *dont)
160{
161}
162
163int 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
228void kvm_arch_memslots_updated(struct kvm *kvm)
229{
230}
231
232int 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
240void 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
247void kvm_arch_flush_shadow_all(struct kvm *kvm)
248{
249}
250
251void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
252 struct kvm_memory_slot *slot)
253{
254}
255 218
256struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id) 219struct 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
1115void 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
1129int 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
1137void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free,
1138 struct kvm_memory_slot *dont)
1139{
1140}
1141
1142int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot,
1143 unsigned long npages)
1144{
1145 return 0;
1146}
1147
1148void kvm_arch_memslots_updated(struct kvm *kvm)
1149{
1150}
1151
1152void kvm_arch_flush_shadow_all(struct kvm *kvm)
1153{
1154}
1155
1156void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
1157 struct kvm_memory_slot *slot)
1158{
1159}