lkml.org 
[lkml]   [2024]   [Feb]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 13/25] arm64/mm: ptep_test_and_clear_young(): New layer to manage contig bit
    Date
    Create a new layer for the in-table PTE manipulation APIs. For now, The
    existing API is prefixed with double underscore to become the
    arch-private API and the public API is just a simple wrapper that calls
    the private API.

    The public API implementation will subsequently be used to transparently
    manipulate the contiguous bit where appropriate. But since there are
    already some contig-aware users (e.g. hugetlb, kernel mapper), we must
    first ensure those users use the private API directly so that the future
    contig-bit manipulations in the public API do not interfere with those
    existing uses.

    Tested-by: John Hubbard <jhubbard@nvidia.com>
    Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
    ---
    arch/arm64/include/asm/pgtable.h | 18 +++++++-----------
    1 file changed, 7 insertions(+), 11 deletions(-)

    diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
    index 5f560326116e..77a8b100e1cd 100644
    --- a/arch/arm64/include/asm/pgtable.h
    +++ b/arch/arm64/include/asm/pgtable.h
    @@ -899,8 +899,9 @@ static inline bool pud_user_accessible_page(pud_t pud)
    /*
    * Atomic pte/pmd modifications.
    */
    -#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
    -static inline int __ptep_test_and_clear_young(pte_t *ptep)
    +static inline int __ptep_test_and_clear_young(struct vm_area_struct *vma,
    + unsigned long address,
    + pte_t *ptep)
    {
    pte_t old_pte, pte;

    @@ -915,18 +916,11 @@ static inline int __ptep_test_and_clear_young(pte_t *ptep)
    return pte_young(pte);
    }

    -static inline int ptep_test_and_clear_young(struct vm_area_struct *vma,
    - unsigned long address,
    - pte_t *ptep)
    -{
    - return __ptep_test_and_clear_young(ptep);
    -}
    -
    #define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
    static inline int ptep_clear_flush_young(struct vm_area_struct *vma,
    unsigned long address, pte_t *ptep)
    {
    - int young = ptep_test_and_clear_young(vma, address, ptep);
    + int young = __ptep_test_and_clear_young(vma, address, ptep);

    if (young) {
    /*
    @@ -949,7 +943,7 @@ static inline int pmdp_test_and_clear_young(struct vm_area_struct *vma,
    unsigned long address,
    pmd_t *pmdp)
    {
    - return ptep_test_and_clear_young(vma, address, (pte_t *)pmdp);
    + return __ptep_test_and_clear_young(vma, address, (pte_t *)pmdp);
    }
    #endif /* CONFIG_TRANSPARENT_HUGEPAGE */

    @@ -1142,6 +1136,8 @@ void vmemmap_update_pte(unsigned long addr, pte_t *ptep, pte_t pte);
    #define pte_clear __pte_clear
    #define __HAVE_ARCH_PTEP_GET_AND_CLEAR
    #define ptep_get_and_clear __ptep_get_and_clear
    +#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
    +#define ptep_test_and_clear_young __ptep_test_and_clear_young

    #endif /* !__ASSEMBLY__ */

    --
    2.25.1

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