Commit 8a713e7d authored by Konstantin Khlebnikov's avatar Konstantin Khlebnikov Committed by Linus Torvalds

proc: use down_read_killable mmap_sem for /proc/pid/maps

Do not remain stuck forever if something goes wrong.  Using a killable
lock permits cleanup of stuck tasks and simplifies investigation.

This function is also used for /proc/pid/smaps.

Link: http://lkml.kernel.org/r/156007493160.3335.14447544314127417266.stgit@buzzSigned-off-by: default avatarKonstantin Khlebnikov <khlebnikov@yandex-team.ru>
Reviewed-by: default avatarRoman Gushchin <guro@fb.com>
Reviewed-by: default avatarCyrill Gorcunov <gorcunov@gmail.com>
Reviewed-by: default avatarKirill Tkhai <ktkhai@virtuozzo.com>
Acked-by: default avatarMichal Hocko <mhocko@suse.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Michal Koutný <mkoutny@suse.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent cbf800d9
...@@ -166,7 +166,11 @@ static void *m_start(struct seq_file *m, loff_t *ppos) ...@@ -166,7 +166,11 @@ static void *m_start(struct seq_file *m, loff_t *ppos)
if (!mm || !mmget_not_zero(mm)) if (!mm || !mmget_not_zero(mm))
return NULL; return NULL;
down_read(&mm->mmap_sem); if (down_read_killable(&mm->mmap_sem)) {
mmput(mm);
return ERR_PTR(-EINTR);
}
hold_task_mempolicy(priv); hold_task_mempolicy(priv);
priv->tail_vma = get_gate_vma(mm); priv->tail_vma = get_gate_vma(mm);
......
...@@ -211,7 +211,11 @@ static void *m_start(struct seq_file *m, loff_t *pos) ...@@ -211,7 +211,11 @@ static void *m_start(struct seq_file *m, loff_t *pos)
if (!mm || !mmget_not_zero(mm)) if (!mm || !mmget_not_zero(mm))
return NULL; return NULL;
down_read(&mm->mmap_sem); if (down_read_killable(&mm->mmap_sem)) {
mmput(mm);
return ERR_PTR(-EINTR);
}
/* start from the Nth VMA */ /* start from the Nth VMA */
for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) for (p = rb_first(&mm->mm_rb); p; p = rb_next(p))
if (n-- == 0) if (n-- == 0)
......
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