mm: Support arbitrary THP sizes
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sat, 30 May 2020 00:54:38 +0000 (20:54 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 21 Mar 2022 17:01:36 +0000 (13:01 -0400)
For code which has not yet been converted from THP to folios, use the
compound size of the page instead of assuming PTE or PMD size.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
include/linux/huge_mm.h
include/linux/mm.h

index e0348bc..0734aff 100644 (file)
@@ -250,30 +250,6 @@ static inline spinlock_t *pud_trans_huge_lock(pud_t *pud,
                return NULL;
 }
 
-/**
- * thp_order - Order of a transparent huge page.
- * @page: Head page of a transparent huge page.
- */
-static inline unsigned int thp_order(struct page *page)
-{
-       VM_BUG_ON_PGFLAGS(PageTail(page), page);
-       if (PageHead(page))
-               return HPAGE_PMD_ORDER;
-       return 0;
-}
-
-/**
- * thp_nr_pages - The number of regular pages in this huge page.
- * @page: The head page of a huge page.
- */
-static inline int thp_nr_pages(struct page *page)
-{
-       VM_BUG_ON_PGFLAGS(PageTail(page), page);
-       if (PageHead(page))
-               return HPAGE_PMD_NR;
-       return 1;
-}
-
 /**
  * folio_test_pmd_mappable - Can we map this folio with a PMD?
  * @folio: The folio to test
@@ -336,18 +312,6 @@ static inline struct list_head *page_deferred_list(struct page *page)
 #define HPAGE_PUD_MASK ({ BUILD_BUG(); 0; })
 #define HPAGE_PUD_SIZE ({ BUILD_BUG(); 0; })
 
-static inline unsigned int thp_order(struct page *page)
-{
-       VM_BUG_ON_PGFLAGS(PageTail(page), page);
-       return 0;
-}
-
-static inline int thp_nr_pages(struct page *page)
-{
-       VM_BUG_ON_PGFLAGS(PageTail(page), page);
-       return 1;
-}
-
 static inline bool folio_test_pmd_mappable(struct folio *folio)
 {
        return false;
@@ -489,15 +453,4 @@ static inline int split_folio_to_list(struct folio *folio,
        return split_huge_page_to_list(&folio->page, list);
 }
 
-/**
- * thp_size - Size of a transparent huge page.
- * @page: Head page of a transparent huge page.
- *
- * Return: Number of bytes in this page.
- */
-static inline unsigned long thp_size(struct page *page)
-{
-       return PAGE_SIZE << thp_order(page);
-}
-
 #endif /* _LINUX_HUGE_MM_H */
index a879c58..c1966ad 100644 (file)
@@ -939,6 +939,37 @@ static inline unsigned int page_shift(struct page *page)
        return PAGE_SHIFT + compound_order(page);
 }
 
+/**
+ * thp_order - Order of a transparent huge page.
+ * @page: Head page of a transparent huge page.
+ */
+static inline unsigned int thp_order(struct page *page)
+{
+       VM_BUG_ON_PGFLAGS(PageTail(page), page);
+       return compound_order(page);
+}
+
+/**
+ * thp_nr_pages - The number of regular pages in this huge page.
+ * @page: The head page of a huge page.
+ */
+static inline int thp_nr_pages(struct page *page)
+{
+       VM_BUG_ON_PGFLAGS(PageTail(page), page);
+       return compound_nr(page);
+}
+
+/**
+ * thp_size - Size of a transparent huge page.
+ * @page: Head page of a transparent huge page.
+ *
+ * Return: Number of bytes in this page.
+ */
+static inline unsigned long thp_size(struct page *page)
+{
+       return PAGE_SIZE << thp_order(page);
+}
+
 void free_compound_page(struct page *page);
 
 #ifdef CONFIG_MMU