Commit 4e80153a authored by Michal Hocko's avatar Michal Hocko Committed by Linus Torvalds

mm, proc: make clear_refs killable

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.
Signed-off-by: default avatarMichal Hocko <mhocko@suse.com>
Acked-by: default avatarOleg Nesterov <oleg@redhat.com>
Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
Cc: Petr Cermak <petrcermak@chromium.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2d6c9282
...@@ -1027,11 +1027,15 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, ...@@ -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 (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 * Writing 5 to /proc/pid/clear_refs resets the peak
* resident set size to this mm's current rss value. * resident set size to this mm's current rss value.
*/ */
down_write(&mm->mmap_sem);
reset_mm_hiwater_rss(mm); reset_mm_hiwater_rss(mm);
up_write(&mm->mmap_sem); up_write(&mm->mmap_sem);
goto out_mm; goto out_mm;
...@@ -1043,7 +1047,10 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, ...@@ -1043,7 +1047,10 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf,
if (!(vma->vm_flags & VM_SOFTDIRTY)) if (!(vma->vm_flags & VM_SOFTDIRTY))
continue; continue;
up_read(&mm->mmap_sem); 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) { for (vma = mm->mmap; vma; vma = vma->vm_next) {
vma->vm_flags &= ~VM_SOFTDIRTY; vma->vm_flags &= ~VM_SOFTDIRTY;
vma_set_page_prot(vma); vma_set_page_prot(vma);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment