diff options
author | Matthew Wilcox (Oracle) <willy@infradead.org> | 2021-05-04 16:12:09 -0400 |
---|---|---|
committer | Matthew Wilcox (Oracle) <willy@infradead.org> | 2021-10-18 07:49:40 -0400 |
commit | fc9b6a538b222eaeb4d1e3f93e716b6626d9b653 (patch) | |
tree | bace0aa13d6853d8cb612fa7a599999018b16adc /mm | |
parent | 85d4d2ebc86f02740c5f5f72ec43cc47d3560720 (diff) | |
download | linux-fc9b6a538b222eaeb4d1e3f93e716b6626d9b653.tar.gz linux-fc9b6a538b222eaeb4d1e3f93e716b6626d9b653.tar.bz2 linux-fc9b6a538b222eaeb4d1e3f93e716b6626d9b653.zip |
mm/writeback: Add folio_account_cleaned()
Get the statistics right; compound pages were being accounted as a
single page. This didn't matter before now as no filesystem which
supported compound pages did writeback. Also move the declaration
to pagemap.h since this is part of the page cache. Add a wrapper for
account_page_cleaned().
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Howells <dhowells@redhat.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/page-writeback.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index a501dad430af..82e3bc3d4eae 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -2470,14 +2470,15 @@ static void folio_account_dirtied(struct folio *folio, * * Caller must hold lock_page_memcg(). */ -void account_page_cleaned(struct page *page, struct address_space *mapping, +void folio_account_cleaned(struct folio *folio, struct address_space *mapping, struct bdi_writeback *wb) { if (mapping_can_writeback(mapping)) { - dec_lruvec_page_state(page, NR_FILE_DIRTY); - dec_zone_page_state(page, NR_ZONE_WRITE_PENDING); - dec_wb_stat(wb, WB_RECLAIMABLE); - task_io_account_cancelled_write(PAGE_SIZE); + long nr = folio_nr_pages(folio); + lruvec_stat_mod_folio(folio, NR_FILE_DIRTY, -nr); + zone_stat_mod_folio(folio, NR_ZONE_WRITE_PENDING, -nr); + wb_stat_mod(wb, WB_RECLAIMABLE, -nr); + task_io_account_cancelled_write(nr * PAGE_SIZE); } } |