diff options
author | Tejun Heo <tj@kernel.org> | 2015-05-22 17:13:39 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-06-02 10:33:35 -0400 |
commit | 910181343774cd5fed95900d9fd2cb4ff7758162 (patch) | |
tree | 4f158076120521833c3eb484ce19a48725c25bd6 /mm/page-writeback.c | |
parent | ce7acfeaf0363c8b75810908448f61af04d38f91 (diff) |
writeback: attribute stats to the matching per-cgroup bdi_writeback
Until now, all WB_* stats were accounted against the root wb
(bdi_writeback), now that multiple wb (bdi_writeback) support is in
place, let's attributes the stats to the respective per-cgroup wb's.
As no filesystem has FS_CGROUP_WRITEBACK yet, this doesn't lead to
visible behavior differences.
v2: Updated for per-inode wb association.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'mm/page-writeback.c')
-rw-r--r-- | mm/page-writeback.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 9b95cf80b407..4d0a9da2de6b 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
@@ -2130,7 +2130,7 @@ void account_page_cleaned(struct page *page, struct address_space *mapping, | |||
2130 | if (mapping_cap_account_dirty(mapping)) { | 2130 | if (mapping_cap_account_dirty(mapping)) { |
2131 | mem_cgroup_dec_page_stat(memcg, MEM_CGROUP_STAT_DIRTY); | 2131 | mem_cgroup_dec_page_stat(memcg, MEM_CGROUP_STAT_DIRTY); |
2132 | dec_zone_page_state(page, NR_FILE_DIRTY); | 2132 | dec_zone_page_state(page, NR_FILE_DIRTY); |
2133 | dec_wb_stat(&inode_to_bdi(mapping->host)->wb, WB_RECLAIMABLE); | 2133 | dec_wb_stat(inode_to_wb(mapping->host), WB_RECLAIMABLE); |
2134 | task_io_account_cancelled_write(PAGE_CACHE_SIZE); | 2134 | task_io_account_cancelled_write(PAGE_CACHE_SIZE); |
2135 | } | 2135 | } |
2136 | } | 2136 | } |
@@ -2191,10 +2191,13 @@ EXPORT_SYMBOL(__set_page_dirty_nobuffers); | |||
2191 | void account_page_redirty(struct page *page) | 2191 | void account_page_redirty(struct page *page) |
2192 | { | 2192 | { |
2193 | struct address_space *mapping = page->mapping; | 2193 | struct address_space *mapping = page->mapping; |
2194 | |||
2194 | if (mapping && mapping_cap_account_dirty(mapping)) { | 2195 | if (mapping && mapping_cap_account_dirty(mapping)) { |
2196 | struct bdi_writeback *wb = inode_to_wb(mapping->host); | ||
2197 | |||
2195 | current->nr_dirtied--; | 2198 | current->nr_dirtied--; |
2196 | dec_zone_page_state(page, NR_DIRTIED); | 2199 | dec_zone_page_state(page, NR_DIRTIED); |
2197 | dec_wb_stat(&inode_to_bdi(mapping->host)->wb, WB_DIRTIED); | 2200 | dec_wb_stat(wb, WB_DIRTIED); |
2198 | } | 2201 | } |
2199 | } | 2202 | } |
2200 | EXPORT_SYMBOL(account_page_redirty); | 2203 | EXPORT_SYMBOL(account_page_redirty); |
@@ -2373,8 +2376,7 @@ int clear_page_dirty_for_io(struct page *page) | |||
2373 | if (TestClearPageDirty(page)) { | 2376 | if (TestClearPageDirty(page)) { |
2374 | mem_cgroup_dec_page_stat(memcg, MEM_CGROUP_STAT_DIRTY); | 2377 | mem_cgroup_dec_page_stat(memcg, MEM_CGROUP_STAT_DIRTY); |
2375 | dec_zone_page_state(page, NR_FILE_DIRTY); | 2378 | dec_zone_page_state(page, NR_FILE_DIRTY); |
2376 | dec_wb_stat(&inode_to_bdi(mapping->host)->wb, | 2379 | dec_wb_stat(inode_to_wb(mapping->host), WB_RECLAIMABLE); |
2377 | WB_RECLAIMABLE); | ||
2378 | ret = 1; | 2380 | ret = 1; |
2379 | } | 2381 | } |
2380 | mem_cgroup_end_page_stat(memcg); | 2382 | mem_cgroup_end_page_stat(memcg); |
@@ -2392,7 +2394,8 @@ int test_clear_page_writeback(struct page *page) | |||
2392 | 2394 | ||
2393 | memcg = mem_cgroup_begin_page_stat(page); | 2395 | memcg = mem_cgroup_begin_page_stat(page); |
2394 | if (mapping) { | 2396 | if (mapping) { |
2395 | struct backing_dev_info *bdi = inode_to_bdi(mapping->host); | 2397 | struct inode *inode = mapping->host; |
2398 | struct backing_dev_info *bdi = inode_to_bdi(inode); | ||
2396 | unsigned long flags; | 2399 | unsigned long flags; |
2397 | 2400 | ||
2398 | spin_lock_irqsave(&mapping->tree_lock, flags); | 2401 | spin_lock_irqsave(&mapping->tree_lock, flags); |
@@ -2402,8 +2405,10 @@ int test_clear_page_writeback(struct page *page) | |||
2402 | page_index(page), | 2405 | page_index(page), |
2403 | PAGECACHE_TAG_WRITEBACK); | 2406 | PAGECACHE_TAG_WRITEBACK); |
2404 | if (bdi_cap_account_writeback(bdi)) { | 2407 | if (bdi_cap_account_writeback(bdi)) { |
2405 | __dec_wb_stat(&bdi->wb, WB_WRITEBACK); | 2408 | struct bdi_writeback *wb = inode_to_wb(inode); |
2406 | __wb_writeout_inc(&bdi->wb); | 2409 | |
2410 | __dec_wb_stat(wb, WB_WRITEBACK); | ||
2411 | __wb_writeout_inc(wb); | ||
2407 | } | 2412 | } |
2408 | } | 2413 | } |
2409 | spin_unlock_irqrestore(&mapping->tree_lock, flags); | 2414 | spin_unlock_irqrestore(&mapping->tree_lock, flags); |
@@ -2427,7 +2432,8 @@ int __test_set_page_writeback(struct page *page, bool keep_write) | |||
2427 | 2432 | ||
2428 | memcg = mem_cgroup_begin_page_stat(page); | 2433 | memcg = mem_cgroup_begin_page_stat(page); |
2429 | if (mapping) { | 2434 | if (mapping) { |
2430 | struct backing_dev_info *bdi = inode_to_bdi(mapping->host); | 2435 | struct inode *inode = mapping->host; |
2436 | struct backing_dev_info *bdi = inode_to_bdi(inode); | ||
2431 | unsigned long flags; | 2437 | unsigned long flags; |
2432 | 2438 | ||
2433 | spin_lock_irqsave(&mapping->tree_lock, flags); | 2439 | spin_lock_irqsave(&mapping->tree_lock, flags); |
@@ -2437,7 +2443,7 @@ int __test_set_page_writeback(struct page *page, bool keep_write) | |||
2437 | page_index(page), | 2443 | page_index(page), |
2438 | PAGECACHE_TAG_WRITEBACK); | 2444 | PAGECACHE_TAG_WRITEBACK); |
2439 | if (bdi_cap_account_writeback(bdi)) | 2445 | if (bdi_cap_account_writeback(bdi)) |
2440 | __inc_wb_stat(&bdi->wb, WB_WRITEBACK); | 2446 | __inc_wb_stat(inode_to_wb(inode), WB_WRITEBACK); |
2441 | } | 2447 | } |
2442 | if (!PageDirty(page)) | 2448 | if (!PageDirty(page)) |
2443 | radix_tree_tag_clear(&mapping->page_tree, | 2449 | radix_tree_tag_clear(&mapping->page_tree, |