Patch "kvm: arm/arm64: Fix locking for kvm_free_stage2_pgd" has been added to the 4.9-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 4.9-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-4.9 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 | 10 ++++++++++ 1 file changed, 10 insertions(+)
arch/arm/kvm/mmu.c +10 -0
@@ -292,11 +292,18 @@ static void unmap_stage2_range(struct kvphys_addr_t addr = start, end = start + size;phys_addr_t next; +assert_spin_locked (&kvm->mmu_lock); pgd = kvm->arch.pgd +stage2_pgd_index (addr);do { next =stage2_pgd_addr_end (addr, end);if (!stage2_pgd_none (*pgd))unmap_stage2_puds (kvm, pgd, addr, next); +/* +* If the range is too large, release the kvm->mmu_lock +* to prevent starvation and lockup detector warnings. +*/ +if (next != end) +cond_resched_lock (&kvm->mmu_lock); }while (pgd++, addr = next, addr != end); }
@@ -831,7 +838,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); +/* Free the HW pgd, one page at a time */ free_pages_exact (kvm->arch.pgd,S2_PGD_SIZE ); kvm->arch.pgd =NULL ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/kvm-arm-arm64-fix-locking-for-kvm_free_stage2_pgd.patch queue-4.9/arm-arm64-kvm-take-mmap_sem-in-kvm_arch_prepare_memory_region.patch queue-4.9/arm-arm64-kvm-take-mmap_sem-in-stage2_unmap_vm.patch