diff --git a/include/linux/mm.h b/include/linux/mm.h index d0fb31bcd482..6fdc294ada0d 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2887,20 +2887,34 @@ static inline bool ptlock_init(struct ptdesc *ptdesc) { return true; } static inline void ptlock_free(struct ptdesc *ptdesc) {} #endif /* USE_SPLIT_PTE_PTLOCKS */ +static inline bool pagetable_pte_ctor(struct ptdesc *ptdesc) +{ + struct folio *folio = ptdesc_folio(ptdesc); + + if (!ptlock_init(ptdesc)) + return false; + __folio_set_pgtable(folio); + lruvec_stat_add_folio(folio, NR_PAGETABLE); + return true; +} + static inline bool pgtable_pte_page_ctor(struct page *page) { - if (!ptlock_init(page_ptdesc(page))) - return false; - __SetPageTable(page); - inc_lruvec_page_state(page, NR_PAGETABLE); - return true; + return pagetable_pte_ctor(page_ptdesc(page)); +} + +static inline void pagetable_pte_dtor(struct ptdesc *ptdesc) +{ + struct folio *folio = ptdesc_folio(ptdesc); + + ptlock_free(ptdesc); + __folio_clear_pgtable(folio); + lruvec_stat_sub_folio(folio, NR_PAGETABLE); } static inline void pgtable_pte_page_dtor(struct page *page) { - ptlock_free(page_ptdesc(page)); - __ClearPageTable(page); - dec_lruvec_page_state(page, NR_PAGETABLE); + pagetable_pte_dtor(page_ptdesc(page)); } pte_t *__pte_offset_map(pmd_t *pmd, unsigned long addr, pmd_t *pmdvalp); @@ -2998,20 +3012,34 @@ static inline spinlock_t *pmd_lock(struct mm_struct *mm, pmd_t *pmd) return ptl; } +static inline bool pagetable_pmd_ctor(struct ptdesc *ptdesc) +{ + struct folio *folio = ptdesc_folio(ptdesc); + + if (!pmd_ptlock_init(ptdesc)) + return false; + __folio_set_pgtable(folio); + lruvec_stat_add_folio(folio, NR_PAGETABLE); + return true; +} + static inline bool pgtable_pmd_page_ctor(struct page *page) { - if (!pmd_ptlock_init(page_ptdesc(page))) - return false; - __SetPageTable(page); - inc_lruvec_page_state(page, NR_PAGETABLE); - return true; + return pagetable_pmd_ctor(page_ptdesc(page)); +} + +static inline void pagetable_pmd_dtor(struct ptdesc *ptdesc) +{ + struct folio *folio = ptdesc_folio(ptdesc); + + pmd_ptlock_free(ptdesc); + __folio_clear_pgtable(folio); + lruvec_stat_sub_folio(folio, NR_PAGETABLE); } static inline void pgtable_pmd_page_dtor(struct page *page) { - pmd_ptlock_free(page_ptdesc(page)); - __ClearPageTable(page); - dec_lruvec_page_state(page, NR_PAGETABLE); + pagetable_pmd_dtor(page_ptdesc(page)); } /*