Re: [PATCH v3 02/12] mm/gup: split get_user_pages_remote() into two routines

From: Jan Kara
Date: Mon Feb 03 2020 - 09:20:12 EST


On Fri 31-01-20 19:40:19, John Hubbard wrote:
> An upcoming patch requires reusing the implementation of
> get_user_pages_remote(). Split up get_user_pages_remote() into an outer
> routine that checks flags, and an implementation routine that will be
> reused. This makes subsequent changes much easier to understand.
>
> There should be no change in behavior due to this patch.
>
> Signed-off-by: John Hubbard <jhubbard@xxxxxxxxxx>

Looks good to me. You can add:

Reviewed-by: Jan Kara <jack@xxxxxxx>

Honza

> ---
> mm/gup.c | 56 +++++++++++++++++++++++++++++++++-----------------------
> 1 file changed, 33 insertions(+), 23 deletions(-)
>
> diff --git a/mm/gup.c b/mm/gup.c
> index e13f4d211475..228aa7059018 100644
> --- a/mm/gup.c
> +++ b/mm/gup.c
> @@ -1557,6 +1557,37 @@ static __always_inline long __gup_longterm_locked(struct task_struct *tsk,
> }
> #endif /* CONFIG_FS_DAX || CONFIG_CMA */
>
> +#ifdef CONFIG_MMU
> +static long __get_user_pages_remote(struct task_struct *tsk,
> + struct mm_struct *mm,
> + unsigned long start, unsigned long nr_pages,
> + unsigned int gup_flags, struct page **pages,
> + struct vm_area_struct **vmas, int *locked)
> +{
> + /*
> + * Parts of FOLL_LONGTERM behavior are incompatible with
> + * FAULT_FLAG_ALLOW_RETRY because of the FS DAX check requirement on
> + * vmas. However, this only comes up if locked is set, and there are
> + * callers that do request FOLL_LONGTERM, but do not set locked. So,
> + * allow what we can.
> + */
> + if (gup_flags & FOLL_LONGTERM) {
> + if (WARN_ON_ONCE(locked))
> + return -EINVAL;
> + /*
> + * This will check the vmas (even if our vmas arg is NULL)
> + * and return -ENOTSUPP if DAX isn't allowed in this case:
> + */
> + return __gup_longterm_locked(tsk, mm, start, nr_pages, pages,
> + vmas, gup_flags | FOLL_TOUCH |
> + FOLL_REMOTE);
> + }
> +
> + return __get_user_pages_locked(tsk, mm, start, nr_pages, pages, vmas,
> + locked,
> + gup_flags | FOLL_TOUCH | FOLL_REMOTE);
> +}
> +
> /*
> * get_user_pages_remote() - pin user pages in memory
> * @tsk: the task_struct to use for page fault accounting, or
> @@ -1619,7 +1650,6 @@ static __always_inline long __gup_longterm_locked(struct task_struct *tsk,
> * should use get_user_pages because it cannot pass
> * FAULT_FLAG_ALLOW_RETRY to handle_mm_fault.
> */
> -#ifdef CONFIG_MMU
> long get_user_pages_remote(struct task_struct *tsk, struct mm_struct *mm,
> unsigned long start, unsigned long nr_pages,
> unsigned int gup_flags, struct page **pages,
> @@ -1632,28 +1662,8 @@ long get_user_pages_remote(struct task_struct *tsk, struct mm_struct *mm,
> if (WARN_ON_ONCE(gup_flags & FOLL_PIN))
> return -EINVAL;
>
> - /*
> - * Parts of FOLL_LONGTERM behavior are incompatible with
> - * FAULT_FLAG_ALLOW_RETRY because of the FS DAX check requirement on
> - * vmas. However, this only comes up if locked is set, and there are
> - * callers that do request FOLL_LONGTERM, but do not set locked. So,
> - * allow what we can.
> - */
> - if (gup_flags & FOLL_LONGTERM) {
> - if (WARN_ON_ONCE(locked))
> - return -EINVAL;
> - /*
> - * This will check the vmas (even if our vmas arg is NULL)
> - * and return -ENOTSUPP if DAX isn't allowed in this case:
> - */
> - return __gup_longterm_locked(tsk, mm, start, nr_pages, pages,
> - vmas, gup_flags | FOLL_TOUCH |
> - FOLL_REMOTE);
> - }
> -
> - return __get_user_pages_locked(tsk, mm, start, nr_pages, pages, vmas,
> - locked,
> - gup_flags | FOLL_TOUCH | FOLL_REMOTE);
> + return __get_user_pages_remote(tsk, mm, start, nr_pages, gup_flags,
> + pages, vmas, locked);
> }
> EXPORT_SYMBOL(get_user_pages_remote);
>
> --
> 2.25.0
>
--
Jan Kara <jack@xxxxxxxx>
SUSE Labs, CR