mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
mm: fix unkillable fault loop on MAP_DROPPABLE memory
handle_mm_fault() suppresses VM_FAULT_OOM for VM_DROPPABLE mappings.
For user-mode faults, pending signals are processed before retrying the
access. Kernel-mode faults on user buffers instead return directly to
the faulting instruction.
With persistent allocation failures (esp. memcg limits), a syscall,
such as write(), can therefore loop while not dropping locks.
Only suppress VM_FAULT_OOM when FAULT_FLAG_USER is set, allowing
kernel-mode faults and GUP to fail and signal allocation errors.
Fix generated by an LLM and sent by Chris Mason in private.
Fixes: 9651fcedf7 ("mm: add MAP_DROPPABLE for designating always lazily freeable mappings")
Cc: stable@vger.kernel.org
Signed-off-by: Chris Mason <mason@kernel.org>
Reviewed-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
[ david: simplify description ]
Tested-by: Muhammad Usama Anjum <usama.anjum@arm.com>
Link: https://patch.msgid.link/20261031-fixes_core-v3-37-d6437171ecc3@kernel.org
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
This commit is contained in:
parent
7a81bc23da
commit
9f02ca8c15
|
|
@ -6957,8 +6957,12 @@ vm_fault_t handle_mm_fault(struct vm_area_struct *vma, unsigned long address,
|
|||
|
||||
lru_gen_exit_fault();
|
||||
|
||||
/* If the mapping is droppable, then errors due to OOM aren't fatal. */
|
||||
if (is_droppable)
|
||||
/*
|
||||
* If the mapping is droppable, then errors due to OOM aren't fatal: the
|
||||
* task returns to user mode, handles its signals and tries again. A
|
||||
* fault from kernel mode has no such return, so it must see the error.
|
||||
*/
|
||||
if (is_droppable && (flags & FAULT_FLAG_USER))
|
||||
ret &= ~VM_FAULT_OOM;
|
||||
|
||||
if (flags & FAULT_FLAG_USER) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user