• David Hildenbrand's avatar
    mm: provide vm_normal_(page|folio)_pmd() with CONFIG_PGTABLE_HAS_HUGE_LEAVES · 3523a37e
    David Hildenbrand authored
    Patch series "mm: replace follow_page() by folio_walk".
    
    Looking into a way of moving the last folio_likely_mapped_shared() call in
    add_folio_for_migration() under the PTL, I found myself removing
    follow_page().  This paves the way for cleaning up all the FOLL_, follow_*
    terminology to just be called "GUP" nowadays.
    
    The new page table walker will lookup a mapped folio and return to the
    caller with the PTL held, such that the folio cannot get unmapped
    concurrently.  Callers can then conditionally decide whether they really
    want to take a short-term folio reference or whether the can simply unlock
    the PTL and be done with it.
    
    folio_walk is similar to page_vma_mapped_walk(), except that we don't know
    the folio we want to walk to and that we are only walking to exactly one
    PTE/PMD/PUD.
    
    folio_walk provides access to the pte/pmd/pud (and the referenced folio
    page because things like KSM need that), however, as part of this series
    no page table modifications are performed by users.
    
    We might be able to convert some other walk_page_range() users that really
    only walk to one address, such as DAMON with
    damon_mkold_ops/damon_young_ops.  It might make sense to extend folio_walk
    in the future to optionally fault in a folio (if applicable), such that we
    can replace some get_user_pages() users that really only want to lookup a
    single page/folio under PTL without unconditionally grabbing a folio
    reference.
    
    I have plans to extend the approach to a range walker that will try
    batching various page table entries (not just folio pages) to be a better
    replace for walk_page_range() -- and users will be able to opt in which
    type of page table entries they want to process -- but that will require
    more work and more thoughts.
    
    KSM seems to work just fine (ksm_functional_tests selftests) and
    move_pages seems to work (migration selftest).  I tested the leaf
    implementation excessively using various hugetlb sizes (64K, 2M, 32M, 1G)
    on arm64 using move_pages and did some more testing on x86-64.  Cross
    compiled on a bunch of architectures.
    
    
    This patch (of 11):
    
    We want to make use of vm_normal_page_pmd() in generic page table walking
    code where we might walk hugetlb folios that are mapped by PMDs even
    without CONFIG_TRANSPARENT_HUGEPAGE.
    
    So let's expose vm_normal_page_pmd() + vm_normal_folio_pmd() with
    CONFIG_PGTABLE_HAS_HUGE_LEAVES.
    
    Link: https://lkml.kernel.org/r/20240802155524.517137-1-david@redhat.com
    Link: https://lkml.kernel.org/r/20240802155524.517137-2-david@redhat.comSigned-off-by: default avatarDavid Hildenbrand <david@redhat.com>
    Cc: Alexander Gordeev <agordeev@linux.ibm.com>
    Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
    Cc: Claudio Imbrenda <imbrenda@linux.ibm.com>
    Cc: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
    Cc: Heiko Carstens <hca@linux.ibm.com>
    Cc: Janosch Frank <frankja@linux.ibm.com>
    Cc: Jonathan Corbet <corbet@lwn.net>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Sven Schnelle <svens@linux.ibm.com>
    Cc: Vasily Gorbik <gor@linux.ibm.com>
    Cc: Ryan Roberts <ryan.roberts@arm.com>
    Cc: Zi Yan <ziy@nvidia.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    3523a37e
memory.c 182 KB