Shadow nodes are accounted to memcg/kmem, so they must be reclaimed per memcg, otherwise they can eat all memory available to a memcg. Signed-off-by: Vladimir Davydov <vdavydov@xxxxxxxxxxxxx> --- include/linux/list_lru.h | 1 - mm/workingset.c | 9 +++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/linux/list_lru.h b/include/linux/list_lru.h index 2a6b9947aaa3..132d86f031ff 100644 --- a/include/linux/list_lru.h +++ b/include/linux/list_lru.h @@ -58,7 +58,6 @@ int __list_lru_init(struct list_lru *lru, bool memcg_aware, struct lock_class_key *key); #define list_lru_init(lru) __list_lru_init((lru), false, NULL) -#define list_lru_init_key(lru, key) __list_lru_init((lru), false, (key)) #define list_lru_init_memcg(lru) __list_lru_init((lru), true, NULL) int memcg_update_all_list_lrus(int num_memcgs); diff --git a/mm/workingset.c b/mm/workingset.c index 76bf9b6ee88c..424fdf5d0a80 100644 --- a/mm/workingset.c +++ b/mm/workingset.c @@ -286,6 +286,10 @@ static unsigned long count_shadow_nodes(struct shrinker *shrinker, local_irq_enable(); pages = node_present_pages(sc->nid); +#ifdef CONFIG_MEMCG + if (sc->memcg) + pages = min(pages, sc->memcg->memory.limit); +#endif /* * Active cache pages are limited to 50% of memory, and shadow * entries that represent a refault distance bigger than that @@ -394,7 +398,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, }; /* @@ -407,7 +411,8 @@ static int __init workingset_init(void) { int ret; - ret = list_lru_init_key(&workingset_shadow_nodes, &shadow_nodes_key); + ret = __list_lru_init(&workingset_shadow_nodes, true, + &shadow_nodes_key); if (ret) goto err; ret = register_shrinker(&workingset_shadow_shrinker); -- 2.1.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>