mm: remove free_compound_page() and the compound_page_dtors array
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Wed, 16 Aug 2023 15:11:54 +0000 (16:11 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 21 Aug 2023 21:28:44 +0000 (14:28 -0700)
The only remaining destructor is free_compound_page().  Inline it into
destroy_large_folio() and remove the array it used to live in.

Link: https://lkml.kernel.org/r/20230816151201.3655946-7-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: David Hildenbrand <david@redhat.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Sidhartha Kumar <sidhartha.kumar@oracle.com>
Cc: Yanteng Si <siyanteng@loongson.cn>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/mm.h
mm/page_alloc.c

index 0d14e2045658478aaba52cab8ec99ef28b95ada2..0955b6b13fd0f04700eb286d6e17f2cba60f6ea7 100644 (file)
@@ -1239,14 +1239,6 @@ void folio_copy(struct folio *dst, struct folio *src);
 
 unsigned long nr_free_buffer_pages(void);
 
-/*
- * Compound pages have a destructor function.  Provide a
- * prototype for that function and accessor functions.
- * These are _only_ valid on the head of a compound page.
- */
-typedef void compound_page_dtor(struct page *);
-
-/* Keep the enum in sync with compound_page_dtors array in mm/page_alloc.c */
 enum compound_dtor_id {
        NULL_COMPOUND_DTOR,
        COMPOUND_PAGE_DTOR,
@@ -1299,8 +1291,6 @@ 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
 /*
  * Do pte_mkwrite, but only if the vma says VM_WRITE.  We do this when
index a97d6fa9cea0b25053215eeb1f2f41aad06f4aaf..31fec31be31efe522493ad52056055374fbef94b 100644 (file)
@@ -284,11 +284,6 @@ const char * const migratetype_names[MIGRATE_TYPES] = {
 #endif
 };
 
-static compound_page_dtor * const compound_page_dtors[NR_COMPOUND_DTORS] = {
-       [NULL_COMPOUND_DTOR] = NULL,
-       [COMPOUND_PAGE_DTOR] = free_compound_page,
-};
-
 int min_free_kbytes = 1024;
 int user_min_free_kbytes = -1;
 static int watermark_boost_factor __read_mostly = 15000;
@@ -577,19 +572,13 @@ static inline void free_the_page(struct page *page, unsigned int order)
  * The remaining PAGE_SIZE pages are called "tail pages". PageTail() is encoded
  * in bit 0 of page->compound_head. The rest of bits is pointer to head page.
  *
- * The first tail page's ->compound_dtor holds the offset in array of compound
- * page destructors. See compound_page_dtors.
+ * The first tail page's ->compound_dtor describes how to destroy the
+ * compound page.
  *
  * The first tail page's ->compound_order holds the order of allocation.
  * This usage means that zero-order pages may not be compound.
  */
 
-void free_compound_page(struct page *page)
-{
-       mem_cgroup_uncharge(page_folio(page));
-       free_the_page(page, compound_order(page));
-}
-
 void prep_compound_page(struct page *page, unsigned int order)
 {
        int i;
@@ -611,14 +600,11 @@ void destroy_large_folio(struct folio *folio)
                return;
        }
 
-       if (folio_test_transhuge(folio) && dtor == TRANSHUGE_PAGE_DTOR) {
+       if (folio_test_transhuge(folio) && dtor == TRANSHUGE_PAGE_DTOR)
                folio_undo_large_rmappable(folio);
-               free_compound_page(&folio->page);
-               return;
-       }
 
-       VM_BUG_ON_FOLIO(dtor >= NR_COMPOUND_DTORS, folio);
-       compound_page_dtors[dtor](&folio->page);
+       mem_cgroup_uncharge(folio);
+       free_the_page(&folio->page, folio_order(folio));
 }
 
 static inline void set_buddy_order(struct page *page, unsigned int order)