lkml.org 
[lkml]   [2024]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 09/13] mm/gup: Cache *pudp in follow_pud_mask()
    Date
    From: Peter Xu <peterx@redhat.com>

    Introduce "pud_t pud" in the function, so the code won't dereference *pudp
    multiple time. Not only because that looks less straightforward, but also
    because if the dereference really happened, it's not clear whether there
    can be race to see different *pudp values if it's being modified at the
    same time.

    Acked-by: James Houghton <jthoughton@google.com>
    Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Peter Xu <peterx@redhat.com>
    ---
    mm/gup.c | 17 +++++++++--------
    1 file changed, 9 insertions(+), 8 deletions(-)

    diff --git a/mm/gup.c b/mm/gup.c
    index ef46a7053e16..26b8cca24077 100644
    --- a/mm/gup.c
    +++ b/mm/gup.c
    @@ -753,26 +753,27 @@ static struct page *follow_pud_mask(struct vm_area_struct *vma,
    unsigned int flags,
    struct follow_page_context *ctx)
    {
    - pud_t *pud;
    + pud_t *pudp, pud;
    spinlock_t *ptl;
    struct page *page;
    struct mm_struct *mm = vma->vm_mm;

    - pud = pud_offset(p4dp, address);
    - if (pud_none(*pud))
    + pudp = pud_offset(p4dp, address);
    + pud = READ_ONCE(*pudp);
    + if (pud_none(pud))
    return no_page_table(vma, flags, address);
    - if (pud_devmap(*pud)) {
    - ptl = pud_lock(mm, pud);
    - page = follow_devmap_pud(vma, address, pud, flags, &ctx->pgmap);
    + if (pud_devmap(pud)) {
    + ptl = pud_lock(mm, pudp);
    + page = follow_devmap_pud(vma, address, pudp, flags, &ctx->pgmap);
    spin_unlock(ptl);
    if (page)
    return page;
    return no_page_table(vma, flags, address);
    }
    - if (unlikely(pud_bad(*pud)))
    + if (unlikely(pud_bad(pud)))
    return no_page_table(vma, flags, address);

    - return follow_pmd_mask(vma, address, pud, flags, ctx);
    + return follow_pmd_mask(vma, address, pudp, flags, ctx);
    }

    static struct page *follow_p4d_mask(struct vm_area_struct *vma,
    --
    2.44.0

    \
     
     \ /
      Last update: 2024-05-27 16:12    [W:9.064 / U:0.432 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site