• Suzuki K Poulose's avatar
    kvm: arm/arm64: Fix locking for kvm_free_stage2_pgd · 2a992347
    Suzuki K Poulose authored
    commit 8b3405e3 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.
    
    Fixes: commit d5d8184d ("KVM: ARM: Memory virtualization setup")
    Cc: Paolo Bonzini <pbonzin@redhat.com>
    Cc: Marc Zyngier <marc.zyngier@arm.com>
    Cc: Christoffer Dall <christoffer.dall@linaro.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
    [ Avoid vCPU starvation and lockup detector warnings ]
    Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
    Signed-off-by: default avatarChristoffer Dall <cdall@linaro.org>
    [bwh: Backported to 3.16:
     - unmap_stage2_range() is a wrapper around unmap_range(), which is also used for
       HYP page table setup.  So unmap_range() should do the cond_resched_lock(), but
       only if kvm != NULL.
     - Adjust context]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    2a992347
mmu.c 32.9 KB