Message ID | 20230815032645.1393700-5-willy@infradead.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Remove _folio_dtor and _folio_order | expand |
On 15.08.23 05:26, Matthew Wilcox (Oracle) wrote: > free_compound_page() is the only remaining dynamic destructor. > Call it unconditionally from destroy_large_folio() and convert it > to take a folio. It used to be the last thing called from > free_transhuge_folio(), and the call from destroy_large_folio() > will take care of that case too. > > This was the last entry in the compound_page_dtors array, so delete it > and reword the comments that referred to it. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> > --- [...] > int min_free_kbytes = 1024; > int user_min_free_kbytes = -1; > static int watermark_boost_factor __read_mostly = 15000; > @@ -587,17 +582,17 @@ 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) > +static void free_compound_page(struct folio *folio) "free_folio", maybe? Doesn't seem to be taken yet. Acked-by: David Hildenbrand <david@redhat.com>
On 15.08.23 09:47, David Hildenbrand wrote: > On 15.08.23 05:26, Matthew Wilcox (Oracle) wrote: >> free_compound_page() is the only remaining dynamic destructor. >> Call it unconditionally from destroy_large_folio() and convert it >> to take a folio. It used to be the last thing called from >> free_transhuge_folio(), and the call from destroy_large_folio() >> will take care of that case too. >> >> This was the last entry in the compound_page_dtors array, so delete it >> and reword the comments that referred to it. >> >> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> >> --- > > [...] > >> int min_free_kbytes = 1024; >> int user_min_free_kbytes = -1; >> static int watermark_boost_factor __read_mostly = 15000; >> @@ -587,17 +582,17 @@ 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) >> +static void free_compound_page(struct folio *folio) > > "free_folio", maybe? Doesn't seem to be taken yet. Ah, I see it gets removed in the following patch.
diff --git a/include/linux/mm.h b/include/linux/mm.h index 7fb529dbff31..cf6707a7069e 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1267,14 +1267,7 @@ 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 */ +/* Compound pages may have a special destructor */ enum compound_dtor_id { NULL_COMPOUND_DTOR, COMPOUND_PAGE_DTOR, @@ -1325,8 +1318,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 diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 516fe3c26ef3..99e36ad540c4 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -2797,7 +2797,6 @@ void free_transhuge_folio(struct folio *folio) } spin_unlock_irqrestore(&ds_queue->split_queue_lock, flags); } - free_compound_page(&folio->page); } void deferred_split_folio(struct folio *folio) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index feb2e95cf021..804982faba4e 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -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; @@ -587,17 +582,17 @@ 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) +static void free_compound_page(struct folio *folio) { - mem_cgroup_uncharge(page_folio(page)); - free_the_page(page, compound_order(page)); + mem_cgroup_uncharge(folio); + free_the_page(&folio->page, folio_order(folio)); } void prep_compound_page(struct page *page, unsigned int order) @@ -621,13 +616,9 @@ 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) free_transhuge_folio(folio); - return; - } - - VM_BUG_ON_FOLIO(dtor >= NR_COMPOUND_DTORS, folio); - compound_page_dtors[dtor](&folio->page); + free_compound_page(folio); } static inline void set_buddy_order(struct page *page, unsigned int order)
free_compound_page() is the only remaining dynamic destructor. Call it unconditionally from destroy_large_folio() and convert it to take a folio. It used to be the last thing called from free_transhuge_folio(), and the call from destroy_large_folio() will take care of that case too. This was the last entry in the compound_page_dtors array, so delete it and reword the comments that referred to it. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- include/linux/mm.h | 11 +---------- mm/huge_memory.c | 1 - mm/page_alloc.c | 23 +++++++---------------- 3 files changed, 8 insertions(+), 27 deletions(-)