mm: memcontrol: per-lruvec stats infrastructure
lruvecs are at the intersection of the NUMA node and memcg, which is the scope for most paging activity. Introduce a convenient accounting infrastructure that maintains statistics per node, per memcg, and the lruvec itself. Then convert over accounting sites for statistics that are already tracked in both nodes and memcgs and can be easily switched. [hannes@cmpxchg.org: fix crash in the new cgroup stat keeping code] Link: http://lkml.kernel.org/r/20170531171450.GA10481@cmpxchg.org [hannes@cmpxchg.org: don't track uncharged pages at all Link: http://lkml.kernel.org/r/20170605175254.GA8547@cmpxchg.org [hannes@cmpxchg.org: add missing free_percpu()] Link: http://lkml.kernel.org/r/20170605175354.GB8547@cmpxchg.org [linux@roeck-us.net: hexagon: fix build error caused by include file order] Link: http://lkml.kernel.org/r/20170617153721.GA4382@roeck-us.net Link: http://lkml.kernel.org/r/20170530181724.27197-6-hannes@cmpxchg.org Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Signed-off-by: Guenter Roeck <linux@roeck-us.net> Acked-by: Vladimir Davydov <vdavydov.dev@gmail.com> Cc: Josef Bacik <josef@toxicpanda.com> Cc: Michal Hocko <mhocko@suse.com> Cc: Rik van Riel <riel@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
ed52be7bfd
commit
00f3ca2c2d
@@ -2433,8 +2433,7 @@ void account_page_dirtied(struct page *page, struct address_space *mapping)
|
||||
inode_attach_wb(inode, page);
|
||||
wb = inode_to_wb(inode);
|
||||
|
||||
inc_memcg_page_state(page, NR_FILE_DIRTY);
|
||||
__inc_node_page_state(page, NR_FILE_DIRTY);
|
||||
__inc_lruvec_page_state(page, NR_FILE_DIRTY);
|
||||
__inc_zone_page_state(page, NR_ZONE_WRITE_PENDING);
|
||||
__inc_node_page_state(page, NR_DIRTIED);
|
||||
__inc_wb_stat(wb, WB_RECLAIMABLE);
|
||||
@@ -2455,8 +2454,7 @@ void account_page_cleaned(struct page *page, struct address_space *mapping,
|
||||
struct bdi_writeback *wb)
|
||||
{
|
||||
if (mapping_cap_account_dirty(mapping)) {
|
||||
dec_memcg_page_state(page, NR_FILE_DIRTY);
|
||||
dec_node_page_state(page, NR_FILE_DIRTY);
|
||||
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);
|
||||
@@ -2712,8 +2710,7 @@ int clear_page_dirty_for_io(struct page *page)
|
||||
*/
|
||||
wb = unlocked_inode_to_wb_begin(inode, &locked);
|
||||
if (TestClearPageDirty(page)) {
|
||||
dec_memcg_page_state(page, NR_FILE_DIRTY);
|
||||
dec_node_page_state(page, NR_FILE_DIRTY);
|
||||
dec_lruvec_page_state(page, NR_FILE_DIRTY);
|
||||
dec_zone_page_state(page, NR_ZONE_WRITE_PENDING);
|
||||
dec_wb_stat(wb, WB_RECLAIMABLE);
|
||||
ret = 1;
|
||||
@@ -2759,8 +2756,7 @@ int test_clear_page_writeback(struct page *page)
|
||||
ret = TestClearPageWriteback(page);
|
||||
}
|
||||
if (ret) {
|
||||
dec_memcg_page_state(page, NR_WRITEBACK);
|
||||
dec_node_page_state(page, NR_WRITEBACK);
|
||||
dec_lruvec_page_state(page, NR_WRITEBACK);
|
||||
dec_zone_page_state(page, NR_ZONE_WRITE_PENDING);
|
||||
inc_node_page_state(page, NR_WRITTEN);
|
||||
}
|
||||
@@ -2814,8 +2810,7 @@ int __test_set_page_writeback(struct page *page, bool keep_write)
|
||||
ret = TestSetPageWriteback(page);
|
||||
}
|
||||
if (!ret) {
|
||||
inc_memcg_page_state(page, NR_WRITEBACK);
|
||||
inc_node_page_state(page, NR_WRITEBACK);
|
||||
inc_lruvec_page_state(page, NR_WRITEBACK);
|
||||
inc_zone_page_state(page, NR_ZONE_WRITE_PENDING);
|
||||
}
|
||||
unlock_page_memcg(page);
|
||||
|
||||
Reference in New Issue
Block a user