From: Greg Kroah-Hartman Date: Mon, 24 Aug 2020 15:19:10 +0000 (+0200) Subject: 5.8-stable patches X-Git-Tag: v4.4.234~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0ed9be403f9d7b9850747c759a987143092752a2;p=thirdparty%2Fkernel%2Fstable-queue.git 5.8-stable patches added patches: kvm-arm64-only-reschedule-if-mmu_notifier_range_blockable-is-not-set.patch --- diff --git a/queue-5.8/kvm-arm64-only-reschedule-if-mmu_notifier_range_blockable-is-not-set.patch b/queue-5.8/kvm-arm64-only-reschedule-if-mmu_notifier_range_blockable-is-not-set.patch new file mode 100644 index 00000000000..57505a52cae --- /dev/null +++ b/queue-5.8/kvm-arm64-only-reschedule-if-mmu_notifier_range_blockable-is-not-set.patch @@ -0,0 +1,105 @@ +From b5331379bc62611d1026173a09c73573384201d9 Mon Sep 17 00:00:00 2001 +From: Will Deacon +Date: Tue, 11 Aug 2020 11:27:25 +0100 +Subject: KVM: arm64: Only reschedule if MMU_NOTIFIER_RANGE_BLOCKABLE is not set + +From: Will Deacon + +commit b5331379bc62611d1026173a09c73573384201d9 upstream. + +When an MMU notifier call results in unmapping a range that spans multiple +PGDs, we end up calling into cond_resched_lock() when crossing a PGD boundary, +since this avoids running into RCU stalls during VM teardown. Unfortunately, +if the VM is destroyed as a result of OOM, then blocking is not permitted +and the call to the scheduler triggers the following BUG(): + + | BUG: sleeping function called from invalid context at arch/arm64/kvm/mmu.c:394 + | in_atomic(): 1, irqs_disabled(): 0, non_block: 1, pid: 36, name: oom_reaper + | INFO: lockdep is turned off. + | CPU: 3 PID: 36 Comm: oom_reaper Not tainted 5.8.0 #1 + | Hardware name: QEMU QEMU Virtual Machine, BIOS 0.0.0 02/06/2015 + | Call trace: + | dump_backtrace+0x0/0x284 + | show_stack+0x1c/0x28 + | dump_stack+0xf0/0x1a4 + | ___might_sleep+0x2bc/0x2cc + | unmap_stage2_range+0x160/0x1ac + | kvm_unmap_hva_range+0x1a0/0x1c8 + | kvm_mmu_notifier_invalidate_range_start+0x8c/0xf8 + | __mmu_notifier_invalidate_range_start+0x218/0x31c + | mmu_notifier_invalidate_range_start_nonblock+0x78/0xb0 + | __oom_reap_task_mm+0x128/0x268 + | oom_reap_task+0xac/0x298 + | oom_reaper+0x178/0x17c + | kthread+0x1e4/0x1fc + | ret_from_fork+0x10/0x30 + +Use the new 'flags' argument to kvm_unmap_hva_range() to ensure that we +only reschedule if MMU_NOTIFIER_RANGE_BLOCKABLE is set in the notifier +flags. + +Cc: +Fixes: 8b3405e345b5 ("kvm: arm/arm64: Fix locking for kvm_free_stage2_pgd") +Cc: Marc Zyngier +Cc: Suzuki K Poulose +Cc: James Morse +Signed-off-by: Will Deacon +Message-Id: <20200811102725.7121-3-will@kernel.org> +Signed-off-by: Paolo Bonzini +Signed-off-by: Will Deacon +Signed-off-by: Greg Kroah-Hartman +--- + arch/arm64/kvm/mmu.c | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +--- a/arch/arm64/kvm/mmu.c ++++ b/arch/arm64/kvm/mmu.c +@@ -365,7 +365,8 @@ static void unmap_stage2_p4ds(struct kvm + * destroying the VM), otherwise another faulting VCPU may come in and mess + * with things behind our backs. + */ +-static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size) ++static void __unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size, ++ bool may_block) + { + pgd_t *pgd; + phys_addr_t addr = start, end = start + size; +@@ -390,11 +391,16 @@ static void unmap_stage2_range(struct kv + * If the range is too large, release the kvm->mmu_lock + * to prevent starvation and lockup detector warnings. + */ +- if (next != end) ++ if (may_block && next != end) + cond_resched_lock(&kvm->mmu_lock); + } while (pgd++, addr = next, addr != end); + } + ++static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size) ++{ ++ __unmap_stage2_range(kvm, start, size, true); ++} ++ + static void stage2_flush_ptes(struct kvm *kvm, pmd_t *pmd, + phys_addr_t addr, phys_addr_t end) + { +@@ -2198,7 +2204,10 @@ static int handle_hva_to_gpa(struct kvm + + static int kvm_unmap_hva_handler(struct kvm *kvm, gpa_t gpa, u64 size, void *data) + { +- unmap_stage2_range(kvm, gpa, size); ++ unsigned flags = *(unsigned *)data; ++ bool may_block = flags & MMU_NOTIFIER_RANGE_BLOCKABLE; ++ ++ __unmap_stage2_range(kvm, gpa, size, may_block); + return 0; + } + +@@ -2209,7 +2218,7 @@ int kvm_unmap_hva_range(struct kvm *kvm, + return 0; + + trace_kvm_unmap_hva_range(start, end); +- handle_hva_to_gpa(kvm, start, end, &kvm_unmap_hva_handler, NULL); ++ handle_hva_to_gpa(kvm, start, end, &kvm_unmap_hva_handler, &flags); + return 0; + } + diff --git a/queue-5.8/kvm-pass-mmu-notifier-range-flags-to-kvm_unmap_hva_range.patch b/queue-5.8/kvm-pass-mmu-notifier-range-flags-to-kvm_unmap_hva_range.patch index f8fadc7214d..00f9cc0e86b 100644 --- a/queue-5.8/kvm-pass-mmu-notifier-range-flags-to-kvm_unmap_hva_range.patch +++ b/queue-5.8/kvm-pass-mmu-notifier-range-flags-to-kvm_unmap_hva_range.patch @@ -24,8 +24,8 @@ Cc: James Morse Signed-off-by: Will Deacon Message-Id: <20200811102725.7121-2-will@kernel.org> Signed-off-by: Paolo Bonzini +Signed-off-by: Will Deacon Signed-off-by: Greg Kroah-Hartman - --- arch/arm64/include/asm/kvm_host.h | 2 +- arch/arm64/kvm/mmu.c | 2 +- diff --git a/queue-5.8/series b/queue-5.8/series index 52c1850eada..2528308b8fa 100644 --- a/queue-5.8/series +++ b/queue-5.8/series @@ -26,7 +26,6 @@ ext4-do-not-block-rwf_nowait-dio-write-on-unallocated-space.patch ext4-fix-checking-of-directory-entry-validity-for-inline-directories.patch jbd2-add-the-missing-unlock_buffer-in-the-error-path-of-jbd2_write_superblock.patch scsi-zfcp-fix-use-after-free-in-request-timeout-handlers.patch -kvm-pass-mmu-notifier-range-flags-to-kvm_unmap_hva_range.patch selftests-kvm-use-a-shorter-encoding-to-clear-rax.patch s390-pci-fix-zpci_bus_link_virtfn.patch s390-pci-re-introduce-zpci_remove_device.patch @@ -146,3 +145,5 @@ efi-libstub-stop-parsing-arguments-at.patch efi-libstub-handle-null-cmdline.patch efi-libstub-handle-unterminated-cmdline.patch do_epoll_ctl-clean-the-failure-exits-up-a-bit.patch +kvm-pass-mmu-notifier-range-flags-to-kvm_unmap_hva_range.patch +kvm-arm64-only-reschedule-if-mmu_notifier_range_blockable-is-not-set.patch