FAILED: patch "[PATCH] kvm: arm/arm64: Fix locking for kvm_free_stage2_pgd" failed to apply to 4.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
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: [PATCH] kvm: arm/arm64: Fix locking for kvm_free_stage2_pgd
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 -0
@@ -292,11 +292,18 @@ static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size)phys_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 *kvm)if (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 ;