--- v5
+++ v3
@@ -1,101 +1,76 @@
-Create pagetable_pte_ctor(), pagetable_pmd_ctor(), pagetable_pte_dtor(),
-and pagetable_pmd_dtor() and make the original pgtable
-constructor/destructors wrappers.
+This removes some direct accesses to struct page, working towards
+splitting out struct ptdesc from struct page.
Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com>
-Acked-by: Mike Rapoport (IBM) <rppt@kernel.org>
---
- include/linux/mm.h | 56 ++++++++++++++++++++++++++++++++++------------
- 1 file changed, 42 insertions(+), 14 deletions(-)
+ include/linux/mm.h | 10 +++++-----
+ mm/memory.c | 4 ++--
+ 2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/include/linux/mm.h b/include/linux/mm.h
-index 69e6d6696c44..356e79984cf9 100644
+index ffc82355fea6..72725aa6c30d 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
-@@ -2859,20 +2859,34 @@ static inline bool ptlock_init(struct ptdesc *ptdesc) { return true; }
- static inline void ptlock_free(struct ptdesc *ptdesc) {}
- #endif /* USE_SPLIT_PTE_PTLOCKS */
+@@ -2807,7 +2807,7 @@ static inline void pagetable_clear(void *x)
+ #if ALLOC_SPLIT_PTLOCKS
+ void __init ptlock_cache_init(void);
+ bool ptlock_alloc(struct ptdesc *ptdesc);
+-extern void ptlock_free(struct page *page);
++void ptlock_free(struct ptdesc *ptdesc);
--static inline bool pgtable_pte_page_ctor(struct page *page)
-+static inline bool pagetable_pte_ctor(struct ptdesc *ptdesc)
+ static inline spinlock_t *ptlock_ptr(struct ptdesc *ptdesc)
{
-- if (!ptlock_init(page_ptdesc(page)))
-+ struct folio *folio = ptdesc_folio(ptdesc);
-+
-+ if (!ptlock_init(ptdesc))
- return false;
-- __SetPageTable(page);
-- inc_lruvec_page_state(page, NR_PAGETABLE);
-+ __folio_set_pgtable(folio);
-+ lruvec_stat_add_folio(folio, NR_PAGETABLE);
+@@ -2823,7 +2823,7 @@ static inline bool ptlock_alloc(struct ptdesc *ptdesc)
return true;
}
-+static inline bool pgtable_pte_page_ctor(struct page *page)
-+{
-+ 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 ptlock_free(struct page *page)
++static inline void ptlock_free(struct ptdesc *ptdesc)
+ {
+ }
+
+@@ -2864,7 +2864,7 @@ static inline spinlock_t *pte_lockptr(struct mm_struct *mm, pmd_t *pmd)
+ }
+ static inline void ptlock_cache_init(void) {}
+ static inline bool ptlock_init(struct ptdesc *ptdesc) { return true; }
+-static inline void ptlock_free(struct page *page) {}
++static inline void ptlock_free(struct ptdesc *ptdesc) {}
+ #endif /* USE_SPLIT_PTE_PTLOCKS */
+
+ static inline bool pgtable_pte_page_ctor(struct page *page)
+@@ -2878,7 +2878,7 @@ static inline bool pgtable_pte_page_ctor(struct page *page)
+
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));
+- ptlock_free(page);
++ ptlock_free(page_ptdesc(page));
+ __ClearPageTable(page);
+ dec_lruvec_page_state(page, NR_PAGETABLE);
+ }
+@@ -2936,7 +2936,7 @@ static inline void pmd_ptlock_free(struct ptdesc *ptdesc)
+ #ifdef CONFIG_TRANSPARENT_HUGEPAGE
+ VM_BUG_ON_PAGE(ptdesc->pmd_huge_pte, ptdesc_page(ptdesc));
+ #endif
+- ptlock_free(ptdesc_page(ptdesc));
++ ptlock_free(ptdesc);
}
- pte_t *__pte_offset_map(pmd_t *pmd, unsigned long addr, pmd_t *pmdvalp);
-@@ -2965,20 +2979,34 @@ static inline spinlock_t *pmd_lock(struct mm_struct *mm, pmd_t *pmd)
- return ptl;
- }
-
--static inline bool pgtable_pmd_page_ctor(struct page *page)
-+static inline bool pagetable_pmd_ctor(struct ptdesc *ptdesc)
- {
-- if (!pmd_ptlock_init(page_ptdesc(page)))
-+ struct folio *folio = ptdesc_folio(ptdesc);
-+
-+ if (!pmd_ptlock_init(ptdesc))
- return false;
-- __SetPageTable(page);
-- inc_lruvec_page_state(page, NR_PAGETABLE);
-+ __folio_set_pgtable(folio);
-+ lruvec_stat_add_folio(folio, NR_PAGETABLE);
+ #define pmd_huge_pte(mm, pmd) (pmd_ptdesc(pmd)->pmd_huge_pte)
+diff --git a/mm/memory.c b/mm/memory.c
+index 8d37dd302f2f..df0251243dfa 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -5949,8 +5949,8 @@ bool ptlock_alloc(struct ptdesc *ptdesc)
return true;
}
-+static inline bool pgtable_pmd_page_ctor(struct page *page)
-+{
-+ 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)
+-void ptlock_free(struct page *page)
++void ptlock_free(struct ptdesc *ptdesc)
{
-- pmd_ptlock_free(page_ptdesc(page));
-- __ClearPageTable(page);
-- dec_lruvec_page_state(page, NR_PAGETABLE);
-+ pagetable_pmd_dtor(page_ptdesc(page));
+- kmem_cache_free(page_ptl_cachep, page->ptl);
++ kmem_cache_free(page_ptl_cachep, ptdesc->ptl);
}
-
- /*
+ #endif
--
2.40.1