summaryrefslogtreecommitdiffstats
path: root/mm/workingset.c
diff options
context:
space:
mode:
authorJohannes Weiner <hannes@cmpxchg.org>2017-07-06 18:40:52 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-07-06 19:24:35 -0400
commit00f3ca2c2d6635d85108571c4dd9a29088668662 (patch)
treed85532fc7416bcb2dc7c442f8ebf5536fb684ad5 /mm/workingset.c
parented52be7bfd45533b194b429f43361493d24599a7 (diff)
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>
Diffstat (limited to 'mm/workingset.c')
-rw-r--r--mm/workingset.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/mm/workingset.c b/mm/workingset.c
index b8c9ab678479..7119cd745ace 100644
--- a/mm/workingset.c
+++ b/mm/workingset.c
@@ -288,12 +288,10 @@ bool workingset_refault(void *shadow)
288 */ 288 */
289 refault_distance = (refault - eviction) & EVICTION_MASK; 289 refault_distance = (refault - eviction) & EVICTION_MASK;
290 290
291 inc_node_state(pgdat, WORKINGSET_REFAULT); 291 inc_lruvec_state(lruvec, WORKINGSET_REFAULT);
292 inc_memcg_state(memcg, WORKINGSET_REFAULT);
293 292
294 if (refault_distance <= active_file) { 293 if (refault_distance <= active_file) {
295 inc_node_state(pgdat, WORKINGSET_ACTIVATE); 294 inc_lruvec_state(lruvec, WORKINGSET_ACTIVATE);
296 inc_memcg_state(memcg, WORKINGSET_ACTIVATE);
297 rcu_read_unlock(); 295 rcu_read_unlock();
298 return true; 296 return true;
299 } 297 }
@@ -474,8 +472,7 @@ static enum lru_status shadow_lru_isolate(struct list_head *item,
474 } 472 }
475 if (WARN_ON_ONCE(node->exceptional)) 473 if (WARN_ON_ONCE(node->exceptional))
476 goto out_invalid; 474 goto out_invalid;
477 inc_node_state(page_pgdat(virt_to_page(node)), WORKINGSET_NODERECLAIM); 475 inc_lruvec_page_state(virt_to_page(node), WORKINGSET_NODERECLAIM);
478 inc_memcg_page_state(virt_to_page(node), WORKINGSET_NODERECLAIM);
479 __radix_tree_delete_node(&mapping->page_tree, node, 476 __radix_tree_delete_node(&mapping->page_tree, node,
480 workingset_update_node, mapping); 477 workingset_update_node, mapping);
481 478