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>
This commit is contained in:
parent
85d4d2ebc8
commit
fc9b6a538b
|
@ -39,7 +39,6 @@ struct anon_vma_chain;
|
||||||
struct file_ra_state;
|
struct file_ra_state;
|
||||||
struct user_struct;
|
struct user_struct;
|
||||||
struct writeback_control;
|
struct writeback_control;
|
||||||
struct bdi_writeback;
|
|
||||||
struct pt_regs;
|
struct pt_regs;
|
||||||
|
|
||||||
extern int sysctl_page_lock_unfairness;
|
extern int sysctl_page_lock_unfairness;
|
||||||
|
@ -2006,8 +2005,6 @@ extern void do_invalidatepage(struct page *page, unsigned int offset,
|
||||||
|
|
||||||
int redirty_page_for_writepage(struct writeback_control *wbc,
|
int redirty_page_for_writepage(struct writeback_control *wbc,
|
||||||
struct page *page);
|
struct page *page);
|
||||||
void account_page_cleaned(struct page *page, struct address_space *mapping,
|
|
||||||
struct bdi_writeback *wb);
|
|
||||||
bool folio_mark_dirty(struct folio *folio);
|
bool folio_mark_dirty(struct folio *folio);
|
||||||
bool set_page_dirty(struct page *page);
|
bool set_page_dirty(struct page *page);
|
||||||
int set_page_dirty_lock(struct page *page);
|
int set_page_dirty_lock(struct page *page);
|
||||||
|
|
|
@ -778,6 +778,13 @@ static inline void __set_page_dirty(struct page *page,
|
||||||
{
|
{
|
||||||
__folio_mark_dirty(page_folio(page), mapping, warn);
|
__folio_mark_dirty(page_folio(page), mapping, warn);
|
||||||
}
|
}
|
||||||
|
void folio_account_cleaned(struct folio *folio, struct address_space *mapping,
|
||||||
|
struct bdi_writeback *wb);
|
||||||
|
static inline void account_page_cleaned(struct page *page,
|
||||||
|
struct address_space *mapping, struct bdi_writeback *wb)
|
||||||
|
{
|
||||||
|
return folio_account_cleaned(page_folio(page), mapping, wb);
|
||||||
|
}
|
||||||
|
|
||||||
int __set_page_dirty_nobuffers(struct page *page);
|
int __set_page_dirty_nobuffers(struct page *page);
|
||||||
int __set_page_dirty_no_writeback(struct page *page);
|
int __set_page_dirty_no_writeback(struct page *page);
|
||||||
|
|
|
@ -2470,14 +2470,15 @@ static void folio_account_dirtied(struct folio *folio,
|
||||||
*
|
*
|
||||||
* Caller must hold lock_page_memcg().
|
* 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)
|
struct bdi_writeback *wb)
|
||||||
{
|
{
|
||||||
if (mapping_can_writeback(mapping)) {
|
if (mapping_can_writeback(mapping)) {
|
||||||
dec_lruvec_page_state(page, NR_FILE_DIRTY);
|
long nr = folio_nr_pages(folio);
|
||||||
dec_zone_page_state(page, NR_ZONE_WRITE_PENDING);
|
lruvec_stat_mod_folio(folio, NR_FILE_DIRTY, -nr);
|
||||||
dec_wb_stat(wb, WB_RECLAIMABLE);
|
zone_stat_mod_folio(folio, NR_ZONE_WRITE_PENDING, -nr);
|
||||||
task_io_account_cancelled_write(PAGE_SIZE);
|
wb_stat_mod(wb, WB_RECLAIMABLE, -nr);
|
||||||
|
task_io_account_cancelled_write(nr * PAGE_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue