Add a wrapper function for users that are not yet converted to folios. With a distro config, this function shrinks from 213 bytes to 105 bytes due to elimination of repeated calls to compound_head(). Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> --- include/linux/pagemap.h | 6 +++++- mm/filemap.c | 30 +++++++++++++++--------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 131d1aa2af61..67d3badc9fe0 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -758,7 +758,11 @@ static inline void wait_on_page_fscache(struct page *page) int put_and_wait_on_page_locked(struct page *page, int state); void wait_on_page_writeback(struct page *page); -extern void end_page_writeback(struct page *page); +void end_folio_writeback(struct folio *folio); +static inline void end_page_writeback(struct page *page) +{ + return end_folio_writeback(page_folio(page)); +} void wait_for_stable_page(struct page *page); void page_endio(struct page *page, bool is_write, int err); diff --git a/mm/filemap.c b/mm/filemap.c index a54eb4641385..65008c42e47d 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1147,11 +1147,11 @@ static void wake_up_page_bit(struct page *page, int bit_nr) spin_unlock_irqrestore(&q->lock, flags); } -static void wake_up_page(struct page *page, int bit) +static void wake_up_folio(struct folio *folio, int bit) { - if (!PageWaiters(page)) + if (!FolioWaiters(folio)) return; - wake_up_page_bit(page, bit); + wake_up_page_bit(&folio->page, bit); } /* @@ -1443,10 +1443,10 @@ void unlock_page_fscache(struct page *page) EXPORT_SYMBOL(unlock_page_fscache); /** - * end_page_writeback - end writeback against a page - * @page: the page + * end_folio_writeback - End writeback against a page. + * @folio: The page. */ -void end_page_writeback(struct page *page) +void end_folio_writeback(struct folio *folio) { /* * TestClearPageReclaim could be used here but it is an atomic @@ -1455,26 +1455,26 @@ void end_page_writeback(struct page *page) * justify taking an atomic operation penalty at the end of * ever page writeback. */ - if (PageReclaim(page)) { - ClearPageReclaim(page); - rotate_reclaimable_page(page); + if (FolioReclaim(folio)) { + ClearFolioReclaim(folio); + rotate_reclaimable_page(&folio->page); } /* * Writeback does not hold a page reference of its own, relying * on truncation to wait for the clearing of PG_writeback. * But here we must make sure that the page is not freed and - * reused before the wake_up_page(). + * reused before the wake_up_folio(). */ - get_page(page); - if (!test_clear_page_writeback(page)) + get_folio(folio); + if (!test_clear_page_writeback(&folio->page)) BUG(); smp_mb__after_atomic(); - wake_up_page(page, PG_writeback); - put_page(page); + wake_up_folio(folio, PG_writeback); + put_folio(folio); } -EXPORT_SYMBOL(end_page_writeback); +EXPORT_SYMBOL(end_folio_writeback); /* * After completing I/O on a page, call this routine to update the page -- 2.29.2