mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
mm: make vm_mmap killable
All the callers of vm_mmap seem to check for the failure already and bail out in one way or another on the error which means that we can change it to use killable version of vm_mmap_pgoff and return -EINTR if the current task gets killed while waiting for mmap_sem. This also means that vm_mmap_pgoff can be killable by default and drop the additional parameter. This will help in the OOM conditions when the oom victim might be stuck waiting for the mmap_sem for write which in turn can block oom_reaper which relies on the mmap_sem for read to make a forward progress and reclaim the address space of the victim. Please note that load_elf_binary is ignoring vm_mmap error for current->personality & MMAP_PAGE_ZERO case but that shouldn't be a problem because the address is not used anywhere and we never return to the userspace if we got killed. Signed-off-by: Michal Hocko <[email protected]> Acked-by: Vlastimil Babka <[email protected]> Cc: "Kirill A. Shutemov" <[email protected]> Cc: Mel Gorman <[email protected]> Cc: Oleg Nesterov <[email protected]> Cc: Andrea Arcangeli <[email protected]> Cc: Al Viro <[email protected]> Cc: Johannes Weiner <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
dc0ef0df7b
commit
9fbeb5ab59
5 changed files with 8 additions and 14 deletions
13
mm/util.c
13
mm/util.c
|
|
@ -289,7 +289,7 @@ EXPORT_SYMBOL_GPL(get_user_pages_fast);
|
|||
|
||||
unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr,
|
||||
unsigned long len, unsigned long prot,
|
||||
unsigned long flag, unsigned long pgoff, bool killable)
|
||||
unsigned long flag, unsigned long pgoff)
|
||||
{
|
||||
unsigned long ret;
|
||||
struct mm_struct *mm = current->mm;
|
||||
|
|
@ -297,12 +297,8 @@ unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr,
|
|||
|
||||
ret = security_mmap_file(file, prot, flag);
|
||||
if (!ret) {
|
||||
if (killable) {
|
||||
if (down_write_killable(&mm->mmap_sem))
|
||||
return -EINTR;
|
||||
} else {
|
||||
down_write(&mm->mmap_sem);
|
||||
}
|
||||
if (down_write_killable(&mm->mmap_sem))
|
||||
return -EINTR;
|
||||
ret = do_mmap_pgoff(file, addr, len, prot, flag, pgoff,
|
||||
&populate);
|
||||
up_write(&mm->mmap_sem);
|
||||
|
|
@ -312,7 +308,6 @@ unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* XXX are all callers checking an error */
|
||||
unsigned long vm_mmap(struct file *file, unsigned long addr,
|
||||
unsigned long len, unsigned long prot,
|
||||
unsigned long flag, unsigned long offset)
|
||||
|
|
@ -322,7 +317,7 @@ unsigned long vm_mmap(struct file *file, unsigned long addr,
|
|||
if (unlikely(offset_in_page(offset)))
|
||||
return -EINVAL;
|
||||
|
||||
return vm_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT, false);
|
||||
return vm_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
|
||||
}
|
||||
EXPORT_SYMBOL(vm_mmap);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue