| From: "Matthew Wilcox (Oracle)" <willy@infradead.org> |
| Subject: mm: reimplement compound_nr() |
| Date: Wed, 11 Jan 2023 14:29:03 +0000 |
| |
| Turn compound_nr() into a wrapper around folio_nr_pages(). Similarly to |
| compound_order(), casting the struct page directly to struct folio |
| preserves the existing behaviour, while calling page_folio() would change |
| the behaviour. Move thp_nr_pages() down in the file so that compound_nr() |
| can be after folio_nr_pages(). |
| |
| [willy@infradead.org: fix assertion triggering] |
| Link: https://lkml.kernel.org/r/Y8AFgZEEjnUIaCbf@casper.infradead.org |
| Link: https://lkml.kernel.org/r/20230111142915.1001531-18-willy@infradead.org |
| Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> |
| Cc: Hugh Dickins <hughd@google.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| |
| --- a/include/linux/mm.h~mm-reimplement-compound_nr |
| +++ a/include/linux/mm.h |
| @@ -1005,18 +1005,6 @@ static inline void set_compound_order(st |
| #endif |
| } |
| |
| -/* Returns the number of pages in this potentially compound page. */ |
| -static inline unsigned long compound_nr(struct page *page) |
| -{ |
| - if (!PageHead(page)) |
| - return 1; |
| -#ifdef CONFIG_64BIT |
| - return page[1].compound_nr; |
| -#else |
| - return 1UL << compound_order(page); |
| -#endif |
| -} |
| - |
| /* Returns the number of bytes in this potentially compound page. */ |
| static inline unsigned long page_size(struct page *page) |
| { |
| @@ -1040,16 +1028,6 @@ static inline unsigned int thp_order(str |
| } |
| |
| /** |
| - * 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. |
| * |
| @@ -1758,6 +1736,33 @@ static inline long folio_nr_pages(struct |
| #endif |
| } |
| |
| +/* |
| + * compound_nr() returns the number of pages in this potentially compound |
| + * page. compound_nr() can be called on a tail page, and is defined to |
| + * return 1 in that case. |
| + */ |
| +static inline unsigned long compound_nr(struct page *page) |
| +{ |
| + struct folio *folio = (struct folio *)page; |
| + |
| + if (!test_bit(PG_head, &folio->flags)) |
| + return 1; |
| +#ifdef CONFIG_64BIT |
| + return folio->_folio_nr_pages; |
| +#else |
| + return 1L << folio->_folio_order; |
| +#endif |
| +} |
| + |
| +/** |
| + * 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) |
| +{ |
| + return folio_nr_pages((struct folio *)page); |
| +} |
| + |
| /** |
| * folio_next - Move to the next physical folio. |
| * @folio: The folio we're currently operating on. |
| _ |