KVM: arm/arm64: Release kvm->mmu_lock in loop to prevent starvation
authorJiang Yi <giangyi@amazon.com>
Wed, 15 Apr 2020 08:42:29 +0000 (10:42 +0200)
committerMarc Zyngier <maz@kernel.org>
Sat, 16 May 2020 14:05:02 +0000 (15:05 +0100)
Do cond_resched_lock() in stage2_flush_memslot() like what is done in
unmap_stage2_range() and other places holding mmu_lock while processing
a possibly large range of memory.

Signed-off-by: Jiang Yi <giangyi@amazon.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20200415084229.29992-1-giangyi@amazon.com
arch/arm64/kvm/mmu.c

index 29d8f24..9173633 100644 (file)
@@ -422,6 +422,9 @@ static void stage2_flush_memslot(struct kvm *kvm,
                next = stage2_pgd_addr_end(kvm, addr, end);
                if (!stage2_pgd_none(kvm, *pgd))
                        stage2_flush_puds(kvm, pgd, addr, next);
+
+               if (next != end)
+                       cond_resched_lock(&kvm->mmu_lock);
        } while (pgd++, addr = next, addr != end);
 }