aboutsummaryrefslogtreecommitdiffstats
path: root/ipc
diff options
context:
space:
mode:
authorMichal Hocko <mhocko@suse.com>2016-05-23 19:25:51 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-05-23 20:04:14 -0400
commit91f4f94ea3f2eabb4cee68149a31e30f84a993dd (patch)
tree1f137113b14e0a66cf24a8c8a32650095f7234d9 /ipc
parent7c051267931a9be9c6620cc17b362bc6ee6dedc8 (diff)
ipc, shm: make shmem attach/detach wait for mmap_sem killable
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. Signed-off-by: Michal Hocko <mhocko@suse.com> Acked-by: Davidlohr Bueso <dave@stgolabs.net> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Hugh Dickins <hughd@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'ipc')
-rw-r--r--ipc/shm.c9
1 files 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,
1200 if (err) 1200 if (err)
1201 goto out_fput; 1201 goto out_fput;
1202 1202
1203 down_write(&current->mm->mmap_sem); 1203 if (down_write_killable(&current->mm->mmap_sem)) {
1204 err = -EINTR;
1205 goto out_fput;
1206 }
1207
1204 if (addr && !(shmflg & SHM_REMAP)) { 1208 if (addr && !(shmflg & SHM_REMAP)) {
1205 err = -EINVAL; 1209 err = -EINVAL;
1206 if (addr + size < addr) 1210 if (addr + size < addr)
@@ -1271,7 +1275,8 @@ SYSCALL_DEFINE1(shmdt, char __user *, shmaddr)
1271 if (addr & ~PAGE_MASK) 1275 if (addr & ~PAGE_MASK)
1272 return retval; 1276 return retval;
1273 1277
1274 down_write(&mm->mmap_sem); 1278 if (down_write_killable(&mm->mmap_sem))
1279 return -EINTR;
1275 1280
1276 /* 1281 /*
1277 * This function tries to be smart and unmap shm segments that 1282 * This function tries to be smart and unmap shm segments that