[Devel] [PATCH RHEL7 COMMIT] ms/mm: workingset: make shadow node shrinker memcg aware

Konstantin Khorenko khorenko at virtuozzo.com
Wed Feb 20 16:32:24 MSK 2019


The commit is pushed to "branch-rh7-3.10.0-957.1.3.vz7.83.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-957.1.3.vz7.83.13
------>
commit efbc35a56a3268bfce201d44ec76ee09225099d3
Author: Vladimir Davydov <vdavydov at virtuozzo.com>
Date:   Wed Feb 20 16:32:21 2019 +0300

    ms/mm: workingset: make shadow node shrinker memcg aware
    
    Workingset code was recently made memcg aware, but shadow node shrinker
    is still global.  As a result, one small cgroup can consume all memory
    available for shadow nodes, possibly hurting other cgroups by reclaiming
    their shadow nodes, even though reclaim distances stored in its shadow
    nodes have no effect.  To avoid this, we need to make shadow node
    shrinker memcg aware.
    
    Signed-off-by: Vladimir Davydov <vdavydov at virtuozzo.com>
    
    Acked-by: Johannes Weiner <hannes at cmpxchg.org>
    Cc: Michal Hocko <mhocko at kernel.org>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
    
    https://pmc.acronis.com/browse/VSTOR-19037
    (cherry picked from commit 0a6b76dd23fa08c5fd7b68acdb55018a37afd4aa)
    Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
---
 include/linux/memcontrol.h | 10 ++++++++++
 mm/memcontrol.c            |  2 +-
 mm/workingset.c            | 10 +++++++---
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index 3e309ff5c3a7..575584dc1651 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -138,6 +138,9 @@ extern void mem_cgroup_note_oom_kill(struct mem_cgroup *memcg,
 extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg,
 					struct task_struct *p);
 
+unsigned long mem_cgroup_node_nr_lru_pages(struct mem_cgroup *memcg,
+					   int nid, unsigned int lru_mask);
+
 static inline void mem_cgroup_oom_enable(void)
 {
 	WARN_ON(current->memcg_oom.may_oom);
@@ -426,6 +429,13 @@ static inline unsigned long mem_cgroup_overdraft(struct mem_cgroup *memcg)
 	return 0;
 }
 
+static inline unsigned long
+mem_cgroup_node_nr_lru_pages(struct mem_cgroup *memcg,
+			     int nid, unsigned int lru_mask)
+{
+	return 0;
+}
+
 static inline void
 mem_cgroup_note_oom_kill(struct mem_cgroup *memcg, struct task_struct *task)
 {
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 01c67c49b68d..61b15e311afc 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1305,7 +1305,7 @@ mem_cgroup_zone_nr_lru_pages(struct mem_cgroup *memcg, int nid, int zid,
 	return ret;
 }
 
-static unsigned long
+unsigned long
 mem_cgroup_node_nr_lru_pages(struct mem_cgroup *memcg,
 			int nid, unsigned int lru_mask)
 {
diff --git a/mm/workingset.c b/mm/workingset.c
index 485bbd84b230..9f9264bb08ad 100644
--- a/mm/workingset.c
+++ b/mm/workingset.c
@@ -384,8 +384,12 @@ static unsigned long count_shadow_nodes(struct shrinker *shrinker,
 	 *
 	 * PAGE_SIZE / radix_tree_nodes / node_entries * 8 / PAGE_SIZE
 	 */
-	cache = node_page_state(sc->nid, NR_ACTIVE_FILE) +
-		node_page_state(sc->nid, NR_INACTIVE_FILE);
+	if (memcg_kmem_enabled())
+		cache = mem_cgroup_node_nr_lru_pages(sc->memcg, sc->nid,
+						     LRU_ALL_FILE);
+	else
+		cache = node_page_state(sc->nid, NR_ACTIVE_FILE) +
+			node_page_state(sc->nid, NR_INACTIVE_FILE);
 
 	max_nodes =  cache >> (RADIX_TREE_MAP_SHIFT - 3);
 
@@ -483,7 +487,7 @@ static struct shrinker workingset_shadow_shrinker = {
 	.count_objects = count_shadow_nodes,
 	.scan_objects = scan_shadow_nodes,
 	.seeks = DEFAULT_SEEKS,
-	.flags = SHRINKER_NUMA_AWARE,
+	.flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE,
 };
 
 /*



More information about the Devel mailing list