• Peter Xu's avatar
    mm/gup: handle huge pud for follow_pud_mask() · 1b167618
    Peter Xu authored
    Teach follow_pud_mask() to be able to handle normal PUD pages like
    hugetlb.
    
    Rename follow_devmap_pud() to follow_huge_pud() so that it can process
    either huge devmap or hugetlb.  Move it out of TRANSPARENT_HUGEPAGE_PUD
    and and huge_memory.c (which relies on CONFIG_THP).  Switch to pud_leaf()
    to detect both cases in the slow gup.
    
    In the new follow_huge_pud(), taking care of possible CoR for hugetlb if
    necessary.  touch_pud() needs to be moved out of huge_memory.c to be
    accessable from gup.c even if !THP.
    
    Since at it, optimize the non-present check by adding a pud_present()
    early check before taking the pgtable lock, failing the follow_page()
    early if PUD is not present: that is required by both devmap or hugetlb. 
    Use pud_huge() to also cover the pud_devmap() case.
    
    One more trivial thing to mention is, introduce "pud_t pud" in the code
    paths along the way, so the code doesn'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 when it's being modified at the same time.
    
    Setting ctx->page_mask properly for a PUD entry.  As a side effect, this
    patch should also be able to optimize devmap GUP on PUD to be able to jump
    over the whole PUD range, but not yet verified.  Hugetlb already can do so
    prior to this patch.
    
    Link: https://lkml.kernel.org/r/20240327152332.950956-11-peterx@redhat.comSigned-off-by: default avatarPeter Xu <peterx@redhat.com>
    Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Tested-by: default avatarRyan Roberts <ryan.roberts@arm.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Andrew Jones <andrew.jones@linux.dev>
    Cc: Aneesh Kumar K.V (IBM) <aneesh.kumar@kernel.org>
    Cc: Axel Rasmussen <axelrasmussen@google.com>
    Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: James Houghton <jthoughton@google.com>
    Cc: John Hubbard <jhubbard@nvidia.com>
    Cc: Kirill A. Shutemov <kirill@shutemov.name>
    Cc: Lorenzo Stoakes <lstoakes@gmail.com>
    Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: "Mike Rapoport (IBM)" <rppt@kernel.org>
    Cc: Muchun Song <muchun.song@linux.dev>
    Cc: Rik van Riel <riel@surriel.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Yang Shi <shy828301@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    1b167618
huge_memory.c 100 KB