diff options
author | Jiang Yi <giangyi@amazon.com> | 2020-04-15 11:42:29 +0300 |
---|---|---|
committer | Marc Zyngier <maz@kernel.org> | 2020-05-16 17:05:02 +0300 |
commit | 48c963e31bc664afafd31058483ea8390da63980 (patch) | |
tree | ea1d9f3105a9cfd2892d11f04184ca6c5855e789 /arch/arm64/kvm | |
parent | 892713e97ca146591515b3c115f99cdf632030fb (diff) | |
download | linux-48c963e31bc664afafd31058483ea8390da63980.tar.xz |
KVM: arm/arm64: Release kvm->mmu_lock in loop to prevent starvation
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
Diffstat (limited to 'arch/arm64/kvm')
-rw-r--r-- | arch/arm64/kvm/mmu.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 29d8f24df944..917363375e8a 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -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); } |