[Devel] [PATCH vz8 2/2] mm/memcg: fix cache growth above cache.limit_in_bytes

Andrey Ryabinin aryabinin at virtuozzo.com
Fri Oct 2 19:08:43 MSK 2020


Exceeding cache above cache.limit_in_bytes schedules high_work_func()
which tries to reclaim 32 pages. If cache generated fast enough or it allows
cgroup to steadily grow above cache.limit_in_bytes because we don't reclaim
enough. Try to reclaim exceeded amount of cache instead.

https://jira.sw.ru/browse/PSBM-106384
Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
---
 mm/memcontrol.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index c30150b8732d..37d4df653f39 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -2213,14 +2213,18 @@ static void reclaim_high(struct mem_cgroup *memcg,
 {
 
 	do {
+		long cache_overused;
 
 		if (page_counter_read(&memcg->memory) > memcg->high) {
 			memcg_memory_event(memcg, MEMCG_HIGH);
 			try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask, true);
 		}
 
-		if (page_counter_read(&memcg->cache) > memcg->cache.max)
-			try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask, false);
+		cache_overused = page_counter_read(&memcg->cache) -
+			memcg->cache.max;
+
+		if (cache_overused > 0)
+			try_to_free_mem_cgroup_pages(memcg, cache_overused, gfp_mask, false);
 	} while ((memcg = parent_mem_cgroup(memcg)));
 }
 
-- 
2.26.2



More information about the Devel mailing list