Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753358AbbHCME4 (ORCPT ); Mon, 3 Aug 2015 08:04:56 -0400 Received: from relay.parallels.com ([195.214.232.42]:42571 "EHLO relay.parallels.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753298AbbHCMEu (ORCPT ); Mon, 3 Aug 2015 08:04:50 -0400 From: Vladimir Davydov To: Andrew Morton CC: Johannes Weiner , Michal Hocko , Minchan Kim , Rik van Riel , Mel Gorman , , Subject: [PATCH 3/3] mm: workingset: make shadow node shrinker memcg aware Date: Mon, 3 Aug 2015 15:04:23 +0300 Message-ID: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain X-ClientProxiedBy: US-EXCH2.sw.swsoft.com (10.255.249.46) To US-EXCH2.sw.swsoft.com (10.255.249.46) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2215 Lines: 63 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 --- 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 from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/