From: Michal Hocko <mhocko@kernel.org> To: <linux-mm@kvack.org>, Andrew Morton <akpm@linux-foundation.org> Cc: LKML <linux-kernel@vger.kernel.org>, Michal Hocko <mhocko@suse.com>, Petr Cermak <petrcermak@chromium.org>, Oleg Nesterov <oleg@redhat.com>, Vlastimil Babka <vbabka@suse.cz> Subject: [PATCH 07/18] mm, proc: make clear_refs killable Date: Tue, 26 Apr 2016 14:56:14 +0200 [thread overview] Message-ID: <1461675385-5934-8-git-send-email-mhocko@kernel.org> (raw) In-Reply-To: <1461675385-5934-1-git-send-email-mhocko@kernel.org> From: Michal Hocko <mhocko@suse.com> CLEAR_REFS_MM_HIWATER_RSS and CLEAR_REFS_SOFT_DIRTY are relying on mmap_sem for write. If the waiting task gets killed by the oom killer and it would operate on the current's mm 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. This will also expedite the return to the userspace and do_exit even if the mm is remote. Cc: Petr Cermak <petrcermak@chromium.org> Acked-by: Oleg Nesterov <oleg@redhat.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Michal Hocko <mhocko@suse.com> --- fs/proc/task_mmu.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 541583510cfb..4648c7f63ae2 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -1027,11 +1027,15 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, }; if (type == CLEAR_REFS_MM_HIWATER_RSS) { + if (down_write_killable(&mm->mmap_sem)) { + count = -EINTR; + goto out_mm; + } + /* * Writing 5 to /proc/pid/clear_refs resets the peak * resident set size to this mm's current rss value. */ - down_write(&mm->mmap_sem); reset_mm_hiwater_rss(mm); up_write(&mm->mmap_sem); goto out_mm; @@ -1043,7 +1047,10 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, if (!(vma->vm_flags & VM_SOFTDIRTY)) continue; up_read(&mm->mmap_sem); - down_write(&mm->mmap_sem); + if (down_write_killable(&mm->mmap_sem)) { + count = -EINTR; + goto out_mm; + } for (vma = mm->mmap; vma; vma = vma->vm_next) { vma->vm_flags &= ~VM_SOFTDIRTY; vma_set_page_prot(vma); -- 2.8.0.rc3
WARNING: multiple messages have this Message-ID (diff)
From: Michal Hocko <mhocko@kernel.org> To: linux-mm@kvack.org, Andrew Morton <akpm@linux-foundation.org> Cc: LKML <linux-kernel@vger.kernel.org>, Michal Hocko <mhocko@suse.com>, Petr Cermak <petrcermak@chromium.org>, Oleg Nesterov <oleg@redhat.com>, Vlastimil Babka <vbabka@suse.cz> Subject: [PATCH 07/18] mm, proc: make clear_refs killable Date: Tue, 26 Apr 2016 14:56:14 +0200 [thread overview] Message-ID: <1461675385-5934-8-git-send-email-mhocko@kernel.org> (raw) In-Reply-To: <1461675385-5934-1-git-send-email-mhocko@kernel.org> From: Michal Hocko <mhocko@suse.com> CLEAR_REFS_MM_HIWATER_RSS and CLEAR_REFS_SOFT_DIRTY are relying on mmap_sem for write. If the waiting task gets killed by the oom killer and it would operate on the current's mm 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. This will also expedite the return to the userspace and do_exit even if the mm is remote. Cc: Petr Cermak <petrcermak@chromium.org> Acked-by: Oleg Nesterov <oleg@redhat.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Michal Hocko <mhocko@suse.com> --- fs/proc/task_mmu.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 541583510cfb..4648c7f63ae2 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -1027,11 +1027,15 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, }; if (type == CLEAR_REFS_MM_HIWATER_RSS) { + if (down_write_killable(&mm->mmap_sem)) { + count = -EINTR; + goto out_mm; + } + /* * Writing 5 to /proc/pid/clear_refs resets the peak * resident set size to this mm's current rss value. */ - down_write(&mm->mmap_sem); reset_mm_hiwater_rss(mm); up_write(&mm->mmap_sem); goto out_mm; @@ -1043,7 +1047,10 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, if (!(vma->vm_flags & VM_SOFTDIRTY)) continue; up_read(&mm->mmap_sem); - down_write(&mm->mmap_sem); + if (down_write_killable(&mm->mmap_sem)) { + count = -EINTR; + goto out_mm; + } for (vma = mm->mmap; vma; vma = vma->vm_next) { vma->vm_flags &= ~VM_SOFTDIRTY; vma_set_page_prot(vma); -- 2.8.0.rc3 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2016-04-26 12:59 UTC|newest] Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-04-26 12:56 [PATCH 0/18] change mmap_sem taken for write killable v2 Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 01/18] mm: Make mmap_sem for write waits killable for mm syscalls Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 02/18] mm: make vm_mmap killable Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 03/18] mm: make vm_munmap killable Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 04/18] mm, aout: handle vm_brk failures Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 05/18] mm, elf: handle vm_brk error Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 06/18] mm: make vm_brk killable Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` Michal Hocko [this message] 2016-04-26 12:56 ` [PATCH 07/18] mm, proc: make clear_refs killable Michal Hocko 2016-04-26 12:56 ` [PATCH 08/18] mm, fork: make dup_mmap wait for mmap_sem for write killable Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 09/18] ipc, shm: make shmem attach/detach wait for mmap_sem killable Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 10/18] vdso: make arch_setup_additional_pages wait for mmap_sem for write killable Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 11/18] coredump: make coredump_wait " Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 12/18] aio: make aio_setup_ring killable Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 13/18] exec: make exec path waiting for mmap_sem killable Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 14/18] prctl: make PR_SET_THP_DISABLE wait " Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 15:18 ` Alex Thorlton 2016-04-26 15:18 ` Alex Thorlton 2016-04-26 12:56 ` [PATCH 15/18] uprobes: wait for mmap_sem for write killable Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 16/18] drm/i915: make i915_gem_mmap_ioctl wait for mmap_sem killable Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 17/18] drm/radeon: make radeon_mn_get " Michal Hocko 2016-04-26 12:56 ` Michal Hocko 2016-04-26 12:56 ` [PATCH 18/18] drm/amdgpu: make amdgpu_mn_get " Michal Hocko 2016-04-26 12:56 ` Michal Hocko -- strict thread matches above, loose matches on Subject: below -- 2016-02-29 13:26 [PATCH 0/18] change mmap_sem taken for write killable Michal Hocko 2016-02-29 13:26 ` [PATCH 07/18] mm, proc: make clear_refs killable Michal Hocko 2016-02-29 13:26 ` Michal Hocko 2016-02-29 13:26 ` Michal Hocko 2016-02-29 13:47 ` kbuild test robot 2016-02-29 13:47 ` kbuild test robot 2016-02-29 17:38 ` Oleg Nesterov 2016-02-29 17:38 ` Oleg Nesterov 2016-02-29 17:38 ` Oleg Nesterov 2016-02-29 17:53 ` Michal Hocko 2016-02-29 17:53 ` Michal Hocko 2016-02-29 17:53 ` Michal Hocko 2016-02-29 17:58 ` Oleg Nesterov 2016-02-29 17:58 ` Oleg Nesterov 2016-02-29 17:58 ` Oleg Nesterov 2016-02-29 18:02 ` Michal Hocko 2016-02-29 18:02 ` Michal Hocko 2016-02-29 18:02 ` Michal Hocko
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1461675385-5934-8-git-send-email-mhocko@kernel.org \ --to=mhocko@kernel.org \ --cc=akpm@linux-foundation.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=mhocko@suse.com \ --cc=oleg@redhat.com \ --cc=petrcermak@chromium.org \ --cc=vbabka@suse.cz \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.