Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752738AbcDZM7C (ORCPT ); Tue, 26 Apr 2016 08:59:02 -0400 Received: from mail-wm0-f68.google.com ([74.125.82.68]:35897 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751507AbcDZM4i (ORCPT ); Tue, 26 Apr 2016 08:56:38 -0400 From: Michal Hocko To: , Andrew Morton Cc: LKML , Michal Hocko , Ingo Molnar , Peter Zijlstra , Oleg Nesterov , Konstantin Khlebnikov , Vlastimil Babka Subject: [PATCH 08/18] mm, fork: make dup_mmap wait for mmap_sem for write killable Date: Tue, 26 Apr 2016 14:56:15 +0200 Message-Id: <1461675385-5934-9-git-send-email-mhocko@kernel.org> X-Mailer: git-send-email 2.8.0.rc3 In-Reply-To: <1461675385-5934-1-git-send-email-mhocko@kernel.org> References: <1461675385-5934-1-git-send-email-mhocko@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1408 Lines: 44 From: Michal Hocko 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. Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Oleg Nesterov Cc: Konstantin Khlebnikov Acked-by: Vlastimil Babka Signed-off-by: Michal Hocko --- kernel/fork.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/kernel/fork.c b/kernel/fork.c index 4bb0a7a0fbe0..bb29839a7e1b 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -413,7 +413,10 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) unsigned long charge; uprobe_start_dup_mmap(); - down_write(&oldmm->mmap_sem); + if (down_write_killable(&oldmm->mmap_sem)) { + retval = -EINTR; + goto fail_uprobe_end; + } flush_cache_dup_mm(oldmm); uprobe_dup_mmap(oldmm, mm); /* @@ -525,6 +528,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) up_write(&mm->mmap_sem); flush_tlb_mm(oldmm); up_write(&oldmm->mmap_sem); +fail_uprobe_end: uprobe_end_dup_mmap(); return retval; fail_nomem_anon_vma_fork: -- 2.8.0.rc3