Move the page type setting from the constructor to the allocation site. Some of the architecture code is a little complex to reason about, but I think this is all correct. This makes __pagetable_ctor() empty, so remove it. While pagetable_pud_ctor() and higher levels are now empty, leave them alone as there may be call to have them do something in future. Signed-off-by: Matthew Wilcox (Oracle) --- include/linux/mm.h | 11 ----------- mm/memory.c | 2 ++ 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index ade37df5ea2b..edcb7d75542f 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -3044,15 +3044,9 @@ static inline bool ptlock_init(struct ptdesc *ptdesc) { return true; } static inline void ptlock_free(struct ptdesc *ptdesc) {} #endif /* defined(CONFIG_SPLIT_PTE_PTLOCKS) */ -static inline void __pagetable_ctor(struct ptdesc *ptdesc) -{ - __SetPageTable(ptdesc_page(ptdesc)); -} - static inline void pagetable_dtor(struct ptdesc *ptdesc) { ptlock_free(ptdesc); - __ClearPageTable(ptdesc_page(ptdesc)); } static inline void pagetable_dtor_free(struct ptdesc *ptdesc) @@ -3066,7 +3060,6 @@ static inline bool pagetable_pte_ctor(struct mm_struct *mm, { if (mm != &init_mm && !ptlock_init(ptdesc)) return false; - __pagetable_ctor(ptdesc); return true; } @@ -3174,7 +3167,6 @@ static inline bool pagetable_pmd_ctor(struct mm_struct *mm, if (mm != &init_mm && !pmd_ptlock_init(ptdesc)) return false; ptdesc_pmd_pts_init(ptdesc); - __pagetable_ctor(ptdesc); return true; } @@ -3199,17 +3191,14 @@ static inline spinlock_t *pud_lock(struct mm_struct *mm, pud_t *pud) static inline void pagetable_pud_ctor(struct ptdesc *ptdesc) { - __pagetable_ctor(ptdesc); } static inline void pagetable_p4d_ctor(struct ptdesc *ptdesc) { - __pagetable_ctor(ptdesc); } static inline void pagetable_pgd_ctor(struct ptdesc *ptdesc) { - __pagetable_ctor(ptdesc); } extern void __init pagecache_init(void); diff --git a/mm/memory.c b/mm/memory.c index 033fc4e29232..47eb5834db23 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -7287,6 +7287,7 @@ struct ptdesc *pagetable_alloc_noprof(gfp_t gfp, unsigned int order) pgdat = NODE_DATA(page_to_nid(page)); mod_node_page_state(pgdat, NR_PAGETABLE, 1 << order); + __SetPageTable(page); return page_ptdesc(page); } @@ -7304,6 +7305,7 @@ void pagetable_free(struct ptdesc *pt) unsigned int order = compound_order(page); mod_node_page_state(pgdat, NR_PAGETABLE, -(1L << order)); + __ClearPageTable(page); free_frozen_pages(page, order); } -- 2.47.2