| From 90f6e150e44a0dc3883110eeb3ab35d1be42b6bb Mon Sep 17 00:00:00 2001 |
| From: Marc Zyngier <marc.zyngier@arm.com> |
| Date: Thu, 16 Mar 2017 18:20:49 +0000 |
| Subject: arm/arm64: KVM: Take mmap_sem in stage2_unmap_vm |
| |
| From: Marc Zyngier <marc.zyngier@arm.com> |
| |
| commit 90f6e150e44a0dc3883110eeb3ab35d1be42b6bb upstream. |
| |
| We don't hold the mmap_sem while searching for the VMAs when |
| we try to unmap each memslot for a VM. Fix this properly to |
| avoid unexpected results. |
| |
| Fixes: commit 957db105c997 ("arm/arm64: KVM: Introduce stage2_unmap_vm") |
| Reviewed-by: Christoffer Dall <cdall@linaro.org> |
| Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> |
| Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/arm/kvm/mmu.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/arch/arm/kvm/mmu.c |
| +++ b/arch/arm/kvm/mmu.c |
| @@ -796,6 +796,7 @@ void stage2_unmap_vm(struct kvm *kvm) |
| int idx; |
| |
| idx = srcu_read_lock(&kvm->srcu); |
| + down_read(¤t->mm->mmap_sem); |
| spin_lock(&kvm->mmu_lock); |
| |
| slots = kvm_memslots(kvm); |
| @@ -803,6 +804,7 @@ void stage2_unmap_vm(struct kvm *kvm) |
| stage2_unmap_memslot(kvm, memslot); |
| |
| spin_unlock(&kvm->mmu_lock); |
| + up_read(¤t->mm->mmap_sem); |
| srcu_read_unlock(&kvm->srcu, idx); |
| } |
| |