mm: use down_read_killable for locking mmap_sem in access_remote_vm
This function is used by ptrace and proc files like /proc/pid/cmdline and /proc/pid/environ. Access_remote_vm never returns error codes, all errors are ignored and only size of successfully read data is returned. So, if current task was killed we'll simply return 0 (bytes read). Mmap_sem could be locked for a long time or forever if something goes wrong. Using a killable lock permits cleanup of stuck tasks and simplifies investigation. Link: http://lkml.kernel.org/r/156007494202.3335.16782303099589302087.stgit@buzz Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> Reviewed-by: Michal Koutný <mkoutny@suse.com> Acked-by: Oleg Nesterov <oleg@redhat.com> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Alexey Dobriyan <adobriyan@gmail.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Cyrill Gorcunov <gorcunov@gmail.com> Cc: Kirill Tkhai <ktkhai@virtuozzo.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Roman Gushchin <guro@fb.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
cd9e2bb827
commit
1e426fe282
|
@ -4344,7 +4344,9 @@ int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
|
||||||
void *old_buf = buf;
|
void *old_buf = buf;
|
||||||
int write = gup_flags & FOLL_WRITE;
|
int write = gup_flags & FOLL_WRITE;
|
||||||
|
|
||||||
down_read(&mm->mmap_sem);
|
if (down_read_killable(&mm->mmap_sem))
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* ignore errors, just check how much was successfully transferred */
|
/* ignore errors, just check how much was successfully transferred */
|
||||||
while (len) {
|
while (len) {
|
||||||
int bytes, ret, offset;
|
int bytes, ret, offset;
|
||||||
|
|
|
@ -1704,7 +1704,8 @@ int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm,
|
||||||
struct vm_area_struct *vma;
|
struct vm_area_struct *vma;
|
||||||
int write = gup_flags & FOLL_WRITE;
|
int write = gup_flags & FOLL_WRITE;
|
||||||
|
|
||||||
down_read(&mm->mmap_sem);
|
if (down_read_killable(&mm->mmap_sem))
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* the access must start within one of the target process's mappings */
|
/* the access must start within one of the target process's mappings */
|
||||||
vma = find_vma(mm, addr);
|
vma = find_vma(mm, addr);
|
||||||
|
|
Loading…
Reference in New Issue