lkml.org 
[lkml]   [2020]   [Jan]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 02/12] mm/gup: split get_user_pages_remote() into two routines
    Date
    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@nvidia.com>
    ---
    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
    \
     
     \ /
      Last update: 2020-02-01 04:42    [W:2.552 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site