From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752155AbcCKLSx (ORCPT ); Fri, 11 Mar 2016 06:18:53 -0500 Received: from mx2.suse.de ([195.135.220.15]:56639 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751534AbcCKLSp (ORCPT ); Fri, 11 Mar 2016 06:18:45 -0500 Subject: Re: [PATCH] ipc, shm: make shmem attach/detach wait for mmap_sem killable To: Michal Hocko , LKML References: <1456752417-9626-10-git-send-email-mhocko@kernel.org> <1457518778-32235-1-git-send-email-mhocko@kernel.org> Cc: linux-mm@kvack.org, Davidlohr Bueso , Michal Hocko , Hugh Dickins From: Vlastimil Babka Message-ID: <56E2A98E.5070302@suse.cz> Date: Fri, 11 Mar 2016 12:18:38 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: <1457518778-32235-1-git-send-email-mhocko@kernel.org> Content-Type: text/plain; charset=iso-8859-2; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 03/09/2016 11:19 AM, Michal Hocko wrote: > From: Michal Hocko > > shmat and shmdt rely on 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: Hugh Dickins > Signed-off-by: Michal Hocko > Acked-by: Davidlohr Bueso Acked-by: Vlastimil Babka > --- > ipc/shm.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/ipc/shm.c b/ipc/shm.c > index 331fc1b0b3c7..13282510bc0d 100644 > --- a/ipc/shm.c > +++ b/ipc/shm.c > @@ -1200,7 +1200,11 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr, > if (err) > goto out_fput; > > - down_write(¤t->mm->mmap_sem); > + if (down_write_killable(¤t->mm->mmap_sem)) { > + err = -EINTR; > + goto out_fput; > + } > + > if (addr && !(shmflg & SHM_REMAP)) { > err = -EINVAL; > if (addr + size < addr) > @@ -1271,7 +1275,8 @@ SYSCALL_DEFINE1(shmdt, char __user *, shmaddr) > if (addr & ~PAGE_MASK) > return retval; > > - down_write(&mm->mmap_sem); > + if (down_write_killable(&mm->mmap_sem)) > + return -EINTR; > > /* > * This function tries to be smart and unmap shm segments that >