Patch "kvm: arm/arm64: Fix locking for kvm_free_stage2_pgd" has been added to the 3.18-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
kvm: arm/arm64: Fix locking for kvm_free_stage2_pgd
to the 3.18-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kvm-arm-arm64-fix-locking-for-kvm_free_stage2_pgd.patch
and it can be found in the queue-3.18 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
8b3405e345b5a098101b0c31b264c812bba045d9Mon Sep 17 00:00:00 2001
From: Suzuki K Poulose <[email protected]>
Date: Mon, 3 Apr 2017 15:12:43 +0100
Subject: kvm: arm/arm64: Fix locking for kvm_free_stage2_pgd
From: Suzuki K Poulose <[email protected]>
commit 8b3405e345b5a098101b0c31b264c812bba045d9 upstream.
In kvm_free_stage2_pgd() we don't hold the kvm->mmu_lock while calling unmap_stage2_range() on the entire memory range for the guest. This could cause problems with other callers (e.g, munmap on a memslot) trying to unmap a range. And since we have to unmap the entire Guest memory range holding a spinlock, make sure we yield the lock if necessary, after we unmap each PUD range.
--- arch/arm/kvm/mmu.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
arch/arm/kvm/mmu.c +12 -0
@@ -256,6 +256,14 @@ static void unmap_range(struct kvm *kvm, next =kvm_pgd_addr_end (addr, end);if (!pgd_none (*pgd))unmap_puds (kvm, pgd, addr, next); +/* +* If we are dealing with a large range in +* stage2 table, release the kvm->mmu_lock +* to prevent starvation and lockup detector +* warnings. +*/ +if (kvm && (next != end)) +cond_resched_lock (&kvm->mmu_lock); }while (pgd++, addr = next, addr != end); }
@@ -693,6 +701,7 @@ int kvm_alloc_stage2_pgd(struct kvm *kvm*/ static void unmap_stage2_range (struct kvm *kvm,phys_addr_t start,u64 size) { +assert_spin_locked (&kvm->mmu_lock);unmap_range (kvm, kvm->arch.pgd, start, size); }
@@ -777,7 +786,10 @@ void kvm_free_stage2_pgd(struct kvm *kvmif (kvm->arch.pgd ==NULL )return ; +spin_lock (&kvm->mmu_lock);unmap_stage2_range (kvm,0 ,KVM_PHYS_SIZE ); +spin_unlock (&kvm->mmu_lock); +kvm_free_hwpgd (kvm_get_hwpgd (kvm));if (KVM_PREALLOC_LEVEL >0 )kfree (kvm->arch.pgd);
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/kvm-arm-arm64-fix-locking-for-kvm_free_stage2_pgd.patch