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 <[email protected]>

Acked-by: Michal Hocko <[email protected]>

> ---
>  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

Reply via email to