alistair23-linux/arch
Will Deacon b5331379bc KVM: arm64: Only reschedule if MMU_NOTIFIER_RANGE_BLOCKABLE is not set
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: <stable@vger.kernel.org>
Fixes: 8b3405e345 ("kvm: arm/arm64: Fix locking for kvm_free_stage2_pgd")
Cc: Marc Zyngier <maz@kernel.org>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: James Morse <james.morse@arm.com>
Signed-off-by: Will Deacon <will@kernel.org>
Message-Id: <20200811102725.7121-3-will@kernel.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2020-08-21 18:06:43 -04:00
..
alpha asm-generic: pgalloc: provide generic pgd_free() 2020-08-07 11:33:26 -07:00
arc Merge branch 'akpm' (patches from Andrew) 2020-08-07 11:39:33 -07:00
arm media updates for v5.9-rc1 2020-08-07 13:00:53 -07:00
arm64 KVM: arm64: Only reschedule if MMU_NOTIFIER_RANGE_BLOCKABLE is not set 2020-08-21 18:06:43 -04:00
c6x Merge branch 'work.regset' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2020-08-07 09:29:25 -07:00
csky Merge branch 'akpm' (patches from Andrew) 2020-08-07 11:39:33 -07:00
h8300 Merge branch 'work.regset' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2020-08-07 09:29:25 -07:00
hexagon Merge branch 'akpm' (patches from Andrew) 2020-08-07 11:39:33 -07:00
ia64 Merge branch 'work.fdpic' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2020-08-07 13:29:39 -07:00
m68k Merge branch 'akpm' (patches from Andrew) 2020-08-07 11:39:33 -07:00
microblaze mm/sparse: cleanup the code surrounding memory_present() 2020-08-07 11:33:27 -07:00
mips KVM: Pass MMU notifier range flags to kvm_unmap_hva_range() 2020-08-21 18:03:47 -04:00
nds32 Merge branch 'akpm' (patches from Andrew) 2020-08-07 11:39:33 -07:00
nios2 Merge branch 'akpm' (patches from Andrew) 2020-08-07 11:39:33 -07:00
openrisc Merge branch 'akpm' (patches from Andrew) 2020-08-07 11:39:33 -07:00
parisc Merge branch 'akpm' (patches from Andrew) 2020-08-07 11:39:33 -07:00
powerpc KVM: Pass MMU notifier range flags to kvm_unmap_hva_range() 2020-08-21 18:03:47 -04:00
riscv Merge branch 'akpm' (patches from Andrew) 2020-08-07 11:39:33 -07:00
s390 Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2020-08-07 21:14:30 -07:00
sh media updates for v5.9-rc1 2020-08-07 13:00:53 -07:00
sparc Merge branch 'akpm' (patches from Andrew) 2020-08-07 11:39:33 -07:00
um asm-generic: pgalloc: provide generic pgd_free() 2020-08-07 11:33:26 -07:00
x86 KVM: Pass MMU notifier range flags to kvm_unmap_hva_range() 2020-08-21 18:03:47 -04:00
xtensa Merge branch 'akpm' (patches from Andrew) 2020-08-07 11:39:33 -07:00
.gitignore
Kconfig It's been a busy cycle for documentation - hopefully the busiest for a 2020-08-04 22:47:54 -07:00