summaryrefslogtreecommitdiffstats
path: root/kernel/fork.c
diff options
context:
space:
mode:
authorMichal Hocko <mhocko@suse.com>2016-05-23 19:25:48 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-05-23 20:04:14 -0400
commit7c051267931a9be9c6620cc17b362bc6ee6dedc8 (patch)
treef955cbab8e30abfc0fcd69eff3462d59c364cd5a /kernel/fork.c
parent4e80153a6044bcd9a7d65c1ec4b1d1c44ba0ed6c (diff)
mm, fork: make dup_mmap wait for mmap_sem for write killable
dup_mmap needs to lock current's mm mmap_sem for write. If the waiting task gets killed by the oom killer it would block oom_reaper from asynchronous address space reclaim and reduce the chances of timely OOM resolving. Wait for the lock in the killable mode and return with EINTR if the task got killed while waiting. Signed-off-by: Michal Hocko <mhocko@suse.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Konstantin Khlebnikov <koct9i@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/fork.c')
-rw-r--r--kernel/fork.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/kernel/fork.c b/kernel/fork.c
index e67d7b773348..47887bba944f 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -414,7 +414,10 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
414 unsigned long charge; 414 unsigned long charge;
415 415
416 uprobe_start_dup_mmap(); 416 uprobe_start_dup_mmap();
417 down_write(&oldmm->mmap_sem); 417 if (down_write_killable(&oldmm->mmap_sem)) {
418 retval = -EINTR;
419 goto fail_uprobe_end;
420 }
418 flush_cache_dup_mm(oldmm); 421 flush_cache_dup_mm(oldmm);
419 uprobe_dup_mmap(oldmm, mm); 422 uprobe_dup_mmap(oldmm, mm);
420 /* 423 /*
@@ -526,6 +529,7 @@ out:
526 up_write(&mm->mmap_sem); 529 up_write(&mm->mmap_sem);
527 flush_tlb_mm(oldmm); 530 flush_tlb_mm(oldmm);
528 up_write(&oldmm->mmap_sem); 531 up_write(&oldmm->mmap_sem);
532fail_uprobe_end:
529 uprobe_end_dup_mmap(); 533 uprobe_end_dup_mmap();
530 return retval; 534 return retval;
531fail_nomem_anon_vma_fork: 535fail_nomem_anon_vma_fork: