Messages in this thread | | | Subject | Re: [PATCH] ipc, shm: make shmem attach/detach wait for mmap_sem killable | From | Vlastimil Babka <> | Date | Fri, 11 Mar 2016 12:18:38 +0100 |
| |
On 03/09/2016 11:19 AM, Michal Hocko wrote: > From: Michal Hocko <mhocko@suse.com> > > 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 <hughd@google.com> > Signed-off-by: Michal Hocko <mhocko@suse.com> > Acked-by: Davidlohr Bueso <dave@stgolabs.net>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
> --- > 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 >
| |