In the memcg case count_shadow_nodes() sums the number of pages in lru lists and the amount of slab memory (reclaimable and non-reclaimable) as a baseline for the allowed number of shadow entries.
It seems to be a good analogy for the !memcg case, where node_present_pages() is used. However, it's not quite true, as there two problems: 1) Due to slab reparenting introduced by commit fb2f2b0adb98 ("mm: memcg/slab: reparent memcg kmem_caches on cgroup removal") local per-lruvec slab counters might be inaccurate on non-leaf levels. It's the only place where local slab counters are used. 2) Shadow nodes by themselves are backed by slabs. So there is a loop dependency: the more shadow entries are there, the less pressure the kernel applies to reclaim them. Fortunately, there is a simple way to solve both problems: slab counters shouldn't be taken into the account by count_shadow_nodes(). Signed-off-by: Roman Gushchin <g...@fb.com> Cc: Johannes Weiner <han...@cmpxchg.org> Cc: Michal Hocko <mho...@suse.com> Cc: Shakeel Butt <shake...@google.com> --- mm/workingset.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mm/workingset.c b/mm/workingset.c index 92e66113a577..50d53f3699e4 100644 --- a/mm/workingset.c +++ b/mm/workingset.c @@ -495,10 +495,6 @@ static unsigned long count_shadow_nodes(struct shrinker *shrinker, for (pages = 0, i = 0; i < NR_LRU_LISTS; i++) pages += lruvec_page_state_local(lruvec, NR_LRU_BASE + i); - pages += lruvec_page_state_local( - lruvec, NR_SLAB_RECLAIMABLE_B) >> PAGE_SHIFT; - pages += lruvec_page_state_local( - lruvec, NR_SLAB_UNRECLAIMABLE_B) >> PAGE_SHIFT; } else #endif pages = node_present_pages(sc->nid); -- 2.26.2