On Wed 15-05-19 11:21:18, Konstantin Khlebnikov wrote: > This function is used by ptrace and proc files like /proc/pid/cmdline and > /proc/pid/environ. Return 0 (bytes read) if current task is killed. Please add an explanation about why this is OK (as explained in the follow up email). > Mmap_sem could be locked for a long time or forever if something wrong. > > Signed-off-by: Konstantin Khlebnikov <khlebnikov@xxxxxxxxxxxxxx> Acked-by: Michal Hocko <mhocko@xxxxxxxx> > --- > mm/memory.c | 4 +++- > mm/nommu.c | 3 ++- > 2 files changed, 5 insertions(+), 2 deletions(-) > > diff --git a/mm/memory.c b/mm/memory.c > index 96f1d473c89a..2e6846d09023 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -4348,7 +4348,9 @@ int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, > void *old_buf = buf; > 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 */ > while (len) { > int bytes, ret, offset; > diff --git a/mm/nommu.c b/mm/nommu.c > index b492fd1fcf9f..cad8fb34088f 100644 > --- a/mm/nommu.c > +++ b/mm/nommu.c > @@ -1791,7 +1791,8 @@ int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, > struct vm_area_struct *vma; > 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 */ > vma = find_vma(mm, addr); -- Michal Hocko SUSE Labs