From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755331AbdLTNSC (ORCPT ); Wed, 20 Dec 2017 08:18:02 -0500 Received: from mail-ve1eur01on0124.outbound.protection.outlook.com ([104.47.1.124]:43908 "EHLO EUR01-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755311AbdLTNRy (ORCPT ); Wed, 20 Dec 2017 08:17:54 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=aryabinin@virtuozzo.com; From: Andrey Ryabinin To: Andrew Morton Cc: Johannes Weiner , Michal Hocko , Vladimir Davydov , cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrey Ryabinin Subject: [PATCH v2 1/2] mm/memcg: try harder to decrease [memory,memsw].limit_in_bytes Date: Wed, 20 Dec 2017 16:21:13 +0300 Message-Id: <20171220132114.6883-1-aryabinin@virtuozzo.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171220102429.31601-1-aryabinin@virtuozzo.com> References: <20171220102429.31601-1-aryabinin@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR02CA0099.eurprd02.prod.outlook.com (2603:10a6:7:29::28) To DB6PR08MB2823.eurprd08.prod.outlook.com (2603:10a6:6:1d::26) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1502a153-abd1-4da4-da26-08d547ac11f1 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(5600026)(4604075)(4534020)(4602075)(7168020)(4627115)(201703031133081)(201702281549075)(2017052603307)(7153060);SRVR:DB6PR08MB2823; X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2823;3:GJHMtriAsqo8vni4SHPdYugd+qSCgxlMNewVFOrlDQaAmAErR6/s8KcZEkZbv0xJbhSEq7umZwA8CDIVWl4TjoAu8uEJe8hxDgV6Q7Tq1F5q5r9vFfSWwWvWkVEB1fLmp1slPUxpb6BKoqUvzVQADQWg0nHqSEbPBZ156BVu3z3hZ7nPfTdE+XACgnHwUaI3FtZDZILmKUHOe3UZFjfp9q70yHUp1JBqmxT0SnoBnfbFKlZXxXH3l1CmYP7tTDhi;25:NXAx6Zq8yWe8zp+mxIBpsJBct8trYpWRV2+3+75El/wcR+p8Bk/LBeAgOmXFKr5SiVjxR3i/HfoCVEswEYqENlHVfnVl6f19SiTJbhQ9qJg5qgKTJ/TA6+0P2GJevzPhIKTYXvdkb6SGAwMLL2IPqw4IevQrPO4n89YKiAbG0qxAMAjpYDHM/q7kNnNOH07et1gxQO11QPECqi3l0VRxcCWEc9jSYWYNAk8gf9ccn8rKvtfcCjwk+eFfP6I11ffe1saQB7pQZSohL/w3XDawy7hFoaQhKhhVHIGmrWM5IS9CciFQu2TmDIcvIlYAeTgvBxO/ubEVawSmXB5T5il8bQ==;31:ZmDwRWAatvjgMlETFzBsHuL2/m+yL/TbwSNp6Ag919xFKbAhyZltRRy1zfmv1D0Awwi3jzwBBFmuEkEkfd0vDn2rBELaqe9FnuLRj+2DGDaeXqijiJbYB0E09HkuKHkP8RpN/20b+aJGjs9irTyH0yMT0wOjDaVlJO0/sZ1NrDmy5xOXGuCSOTHy8e1PGzB+RWsNf6eSPEPQLR+gYiFSy6UwH8ZmwGAXgS1Rqt7rDRA= X-MS-TrafficTypeDiagnostic: DB6PR08MB2823: X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2823;20:1MNPetQjRpjxL0/QHu0uNOGsXGwCn0h0j2/id9P9iEGbUPQjh3yu7S9h1sPgQmtxkXH0JhbdjUV/FV5oVgTrLlbMf4WZUX0Jyhq6CcDlRF+NsD0YX2SboO61JVC3QRgdQ/U0t3AQc4H2PpTraZosdpkn9MqlP4cPgOL43f4lzNP8O/25sZT3A3OI+/6oXFYNpj0vx69+LpJpzKgGjwSHcZ5fZLwug1dhyIKR2rlg1H3XUe4yZshc4XOm4br8kFMW9QQyKbRy/UYazLs7INmo8gSbK/GTbKBWZcofaUP9Tuby4FPqNpgvC0I7QZv+ViQj6e5bXiksAQzJSx3H4EMGkZl7wvWcKnAVVj0sdZYge8yOZSHv98xALFeYaTVOX7QHNcVNtGnyDJCwwpyR7k9eSLr3wcUdetY/U1VO+nbXzrQ=;4:zrh6ridTwkBhvEgVSDhOMQW6jIeD+uRMm1T496iH7bQUYkAYsRrKLPgKnzTBomh0dYMlOuxZJINzFnv9+R37/qQ5uYqsKybjOrU7hiUa5KAAzVuVPwohSwmtSxbyIzUWml9Kj+9kWIYYp0rNSMCWTJZs+NHmnEPEtuwuk44yZ2ilq9aeIGlWrWrvKg3+wvmk6eVF0yr0uBxIS1eUppUzy/Wt01oTuWy/mXXZhjyZRK2P2p71E9OBTU32Pq1n4Ak2O4DmHDFEZoTwH9Us0nh3YA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040470)(2401047)(8121501046)(5005006)(3002001)(10201501046)(3231023)(93006095)(93001095)(6041268)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(6072148)(201708071742011);SRVR:DB6PR08MB2823;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:DB6PR08MB2823; X-Forefront-PRVS: 0527DFA348 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6069001)(396003)(346002)(366004)(39840400004)(376002)(39380400002)(189003)(199004)(66066001)(6666003)(5660300001)(36756003)(68736007)(6916009)(105586002)(106356001)(86362001)(16586007)(316002)(47776003)(76506005)(97736004)(54906003)(76176011)(55236004)(51416003)(69596002)(386003)(52116002)(2906002)(3846002)(6512007)(2950100002)(6486002)(50466002)(478600001)(6506007)(16526018)(59450400001)(107886003)(25786009)(81156014)(81166006)(53936002)(48376002)(53416004)(305945005)(4326008)(39060400002)(8676002)(1076002)(7736002)(50226002)(6116002)(8936002)(34023003)(148693002)(142933001);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR08MB2823;H:localhost.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR08MB2823;23:FGujdcUyQiPysz8iWamhfdNmLe3kpFcXVEkgsmfIJ?= =?us-ascii?Q?xbak/EmaHz3ZP7iu9hgNSbCalDfXKbI7efV9lwgphMlwGEyV68ZH5VjQL4dF?= =?us-ascii?Q?b+3MXS3VJI+2vYy1k0Eg3IUKRIn688xEJsUDftBiCvgHokAAekVrANZR9oFS?= =?us-ascii?Q?WVvsNzmBY47/JqQhzDWnSp2Vaqi5/FOcNbTVaBYwvbSGJx8gJjYjeyOqW5Ab?= =?us-ascii?Q?PwXRZZHGnWB4aF++F7qv0q4urhV716bf1wbHUiIaB1Vk9xiq0kyXIbqVrMad?= =?us-ascii?Q?NH2a2AK8tsvK7qY8zbnu5XBvGhrMaj3l8fqfLyG7n4YC/cKXd+XyM99VRE29?= =?us-ascii?Q?pcgX3dihBOMZT4VulZL7Uaj430ljYQgIdarKRZx9HZdjjLqOyhaEXvS8IndM?= =?us-ascii?Q?8ZNn/Xfu0xZl7m5tvljJF/34Np64R4EPALa3yGclcyWIWesHOrz3qOJUuOi+?= =?us-ascii?Q?hEKcmnBTXByi59JQg8gejNulw/3d0vmZeoNCwoRybnb8krczm9BYmZ51uD2b?= =?us-ascii?Q?sjcl0S8MANFukdM0Q+0e7/NiMfqnyPDUqwrFqz6ej3WzHyHc1RDS/2sFFHax?= =?us-ascii?Q?1oPpHOgo/OgdjZKE/2RjO6OECMtyEZKn0ZVNZVjHjG8zocSS+ku7lleOnXX+?= =?us-ascii?Q?EUSzGWtFcfmgtcsDK50yzw4V+Xl8lPuXOVCYWroqvOElHS+pBOyFvCmzOHN4?= =?us-ascii?Q?JmWOHxNqYfDT/Xq+tqazSD5G9KpWiGljyP7gDWG4iVs+MQvjkaLwMvcYMN3i?= =?us-ascii?Q?14Cw5SyAxzgqVIxfOvtzwKudaPkk4mMTgp+/DM+FE/XzoUdJoRaSUp6JHPHq?= =?us-ascii?Q?afR48jp284dIWu3U9shFsoNO63wVXV6MmqIu9cGOIucBehBWTyMGvt9oo1Z1?= =?us-ascii?Q?QZ7iyhWwSZILBYaC5p1tr4Lw9nv0GE9QyJQ7tHw/MiXy6aTsqlc4C+yDMHwS?= =?us-ascii?Q?wD0LUh6tiG5TC/kC5fszB+nta3YcL3LCTOI/GkLMS35kvKNFk+tA1ioiZnsr?= =?us-ascii?Q?EADE0O5oeXiPh3Y57qqArFfBo1dN0z9oxSbtNK31nmzk6LT1SLsvrjRVRwHJ?= =?us-ascii?Q?JN1Ah/aAOHwKZ6Yjl7tbaZjQHhRCW7hVJ5IrnRdi82nabNkvZVzFUrzP6zmE?= =?us-ascii?Q?z6PRat4DM7YNl6ksjFZEXwXQr0+OmL5uosNWyE+zHV/Jey5iENiEBzBRJCKR?= =?us-ascii?Q?JGHlQI7KgIeHWBvguFAM2BhQf8i5sYI8oT4bjuvHSVJBMeqkaja/6fa9WNWz?= =?us-ascii?Q?bzrx9NI/56FrZBI4o+CKZTfsqMq/bQWE2staE4R7z5x01Tj9u58LW+ZZj3P/?= =?us-ascii?Q?OCS8fILjmh8Iu46HTI1fg/SKfeKxXp9QLwSv/4FK7VWnm4UZuuhsvSSx48bQ?= =?us-ascii?Q?PZlWw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2823;6:YQfJUx5/v/TMpjzFmLmisLT8RP3pBmVyMf05Yghh36yUzlOHssnbNj373n1C4MhZW3oMthM04USVIDJTgwOVqoxbQo4cDZmdSG/X15X4BDzLICn0Ayd0sm/ulh0yMQrlsI6GjtGtaa9qUjulySwNWBDhB/yjfQLL7ec/07jh/HNFApoq6F5B7jtUDGzJGukm36llcV5ONOC02ZnKUP3+Qy28D/vLo7AAZvfdWqrTCG3uWFmFKaJdvvs3PJBxw3h1BQV+25yaH0quy3fHjZBd6EIRn5LMNTrqo32QKq4vA1UqfJyxVQprKZvf/DIp7P1gzXGv8lWRFADLZN8RpgT13riuGBPOeSTTqZwwZIl/GG8=;5:PFS/tfOdsDs3lgAP7cVm1uijO9ggEzCsqhSlXZEANRfypfjV/DneW1FtOymV0wx3vU4YQgCKXOChu2ld8uAD5qs6w5U6MijZoCYAjXHrxyv34uW7yNSVJ9CFoClZahK3tqw7Y6FzEMZh9VPkSuzbIJAsmKU6jUlbosXVO3gsOrY=;24:GsZpajbWWNc2Npj6uAz2KbKvA8Ern0nBAJiqY0D3URBcQV0kSPpDplLdLl8TKS17Bfs/O5KnZlpDYE8p9XJddJF9uR5VD15c8myRworaPSQ=;7:BoVuyScK0MtWKOP4tQQbl0pTUjkgoP4LLM8uA3j8xn4T4guykWPGWtCgpZUF5RWmxwbmmA1Lodja+GkwA0FM4j/etBuHZxKijCgZs4Ra0mOzVQNUUmGB3xkqhQ/xkmXzOpstMBzsEZFlFQRidjNJNHO3RM+OozbtdCDkUL/BaEDR2jCQ25aUle/rzDEpY/qqve84Vkc9dpGT7Cm2OAAr3kCSB+iQy6Mx/V9jqCXXRhyehTYqCz+a9+lsjepP6Z4P SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2823;20:mOaifuw1p/Up+7YRrNSZqGJV4PgN1u3aYYyF/h1cGFWXg6I7+YBjApqjQqrsSzfrDpyE+boDGp0agK0TCeJUku1VYPjsWd+sQw3nJSkoOI5UwXykoa9M//QTIA7J6ZicwUs6B42vNf9XKu2ecYIisVSe0PvShgVA8rTWi3Nc94M= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Dec 2017 13:17:49.6302 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1502a153-abd1-4da4-da26-08d547ac11f1 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR08MB2823 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org mem_cgroup_resize_[memsw]_limit() tries to free only 32 (SWAP_CLUSTER_MAX) pages on each iteration. This makes practically impossible to decrease limit of memory cgroup. Tasks could easily allocate back 32 pages, so we can't reduce memory usage, and once retry_count reaches zero we return -EBUSY. Easy to reproduce the problem by running the following commands: mkdir /sys/fs/cgroup/memory/test echo $$ >> /sys/fs/cgroup/memory/test/tasks cat big_file > /dev/null & sleep 1 && echo $((100*1024*1024)) > /sys/fs/cgroup/memory/test/memory.limit_in_bytes -bash: echo: write error: Device or resource busy Instead of relying on retry_count, keep trying to free required amount of pages until reclaimer makes any progress. Signed-off-by: Andrey Ryabinin --- mm/memcontrol.c | 70 +++++++++++++-------------------------------------------- 1 file changed, 16 insertions(+), 54 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index f40b5ad3f959..0d26db9a665d 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1176,20 +1176,6 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p) } /* - * This function returns the number of memcg under hierarchy tree. Returns - * 1(self count) if no children. - */ -static int mem_cgroup_count_children(struct mem_cgroup *memcg) -{ - int num = 0; - struct mem_cgroup *iter; - - for_each_mem_cgroup_tree(iter, memcg) - num++; - return num; -} - -/* * Return the memory (and swap, if configured) limit for a memcg. */ unsigned long mem_cgroup_get_limit(struct mem_cgroup *memcg) @@ -2462,22 +2448,10 @@ static DEFINE_MUTEX(memcg_limit_mutex); static int mem_cgroup_resize_limit(struct mem_cgroup *memcg, unsigned long limit) { - unsigned long curusage; - unsigned long oldusage; + unsigned long usage; bool enlarge = false; - int retry_count; int ret; - /* - * For keeping hierarchical_reclaim simple, how long we should retry - * is depends on callers. We set our retry-count to be function - * of # of children which we should visit in this loop. - */ - retry_count = MEM_CGROUP_RECLAIM_RETRIES * - mem_cgroup_count_children(memcg); - - oldusage = page_counter_read(&memcg->memory); - do { if (signal_pending(current)) { ret = -EINTR; @@ -2498,15 +2472,13 @@ static int mem_cgroup_resize_limit(struct mem_cgroup *memcg, if (!ret) break; - try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL, true); - - curusage = page_counter_read(&memcg->memory); - /* Usage is reduced ? */ - if (curusage >= oldusage) - retry_count--; - else - oldusage = curusage; - } while (retry_count); + usage = page_counter_read(&memcg->memory); + if (!try_to_free_mem_cgroup_pages(memcg, usage - limit, + GFP_KERNEL, true)) { + ret = -EBUSY; + break; + } + } while (true); if (!ret && enlarge) memcg_oom_recover(memcg); @@ -2517,18 +2489,10 @@ static int mem_cgroup_resize_limit(struct mem_cgroup *memcg, static int mem_cgroup_resize_memsw_limit(struct mem_cgroup *memcg, unsigned long limit) { - unsigned long curusage; - unsigned long oldusage; + unsigned long usage; bool enlarge = false; - int retry_count; int ret; - /* see mem_cgroup_resize_res_limit */ - retry_count = MEM_CGROUP_RECLAIM_RETRIES * - mem_cgroup_count_children(memcg); - - oldusage = page_counter_read(&memcg->memsw); - do { if (signal_pending(current)) { ret = -EINTR; @@ -2549,15 +2513,13 @@ static int mem_cgroup_resize_memsw_limit(struct mem_cgroup *memcg, if (!ret) break; - try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL, false); - - curusage = page_counter_read(&memcg->memsw); - /* Usage is reduced ? */ - if (curusage >= oldusage) - retry_count--; - else - oldusage = curusage; - } while (retry_count); + usage = page_counter_read(&memcg->memsw); + if (!try_to_free_mem_cgroup_pages(memcg, usage - limit, + GFP_KERNEL, false)) { + ret = -EBUSY; + break; + } + } while (true); if (!ret && enlarge) memcg_oom_recover(memcg); -- 2.13.6 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrey Ryabinin Subject: [PATCH v2 1/2] mm/memcg: try harder to decrease [memory,memsw].limit_in_bytes Date: Wed, 20 Dec 2017 16:21:13 +0300 Message-ID: <20171220132114.6883-1-aryabinin@virtuozzo.com> References: <20171220102429.31601-1-aryabinin@virtuozzo.com> Mime-Version: 1.0 Return-path: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=TarpDy4wJjgcQWjBCPBrmhXpYOaqtipmEeurDp4CvuA=; b=bXzsdTb9oPGw5HWELoP1ntOh/XALE+Z/WaKBnVgC1I5J9xoO++9GKswAyNXAIQHZ1RV7bVPOr4LpLvOqRwiyjOX8U5SecJfm0TlTFrHtprJw73Qz8DDZV1G6Jkuy8nMnS6hK8silq0AfSRlwDxnuYlllMKiSNY2F7yHmjDac8Vs= In-Reply-To: <20171220102429.31601-1-aryabinin@virtuozzo.com> Sender: owner-linux-mm@kvack.org List-ID: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Andrew Morton Cc: Johannes Weiner , Michal Hocko , Vladimir Davydov , cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrey Ryabinin mem_cgroup_resize_[memsw]_limit() tries to free only 32 (SWAP_CLUSTER_MAX) pages on each iteration. This makes practically impossible to decrease limit of memory cgroup. Tasks could easily allocate back 32 pages, so we can't reduce memory usage, and once retry_count reaches zero we return -EBUSY. Easy to reproduce the problem by running the following commands: mkdir /sys/fs/cgroup/memory/test echo $$ >> /sys/fs/cgroup/memory/test/tasks cat big_file > /dev/null & sleep 1 && echo $((100*1024*1024)) > /sys/fs/cgroup/memory/test/memory.limit_in_bytes -bash: echo: write error: Device or resource busy Instead of relying on retry_count, keep trying to free required amount of pages until reclaimer makes any progress. Signed-off-by: Andrey Ryabinin --- mm/memcontrol.c | 70 +++++++++++++-------------------------------------------- 1 file changed, 16 insertions(+), 54 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index f40b5ad3f959..0d26db9a665d 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1176,20 +1176,6 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p) } /* - * This function returns the number of memcg under hierarchy tree. Returns - * 1(self count) if no children. - */ -static int mem_cgroup_count_children(struct mem_cgroup *memcg) -{ - int num = 0; - struct mem_cgroup *iter; - - for_each_mem_cgroup_tree(iter, memcg) - num++; - return num; -} - -/* * Return the memory (and swap, if configured) limit for a memcg. */ unsigned long mem_cgroup_get_limit(struct mem_cgroup *memcg) @@ -2462,22 +2448,10 @@ static DEFINE_MUTEX(memcg_limit_mutex); static int mem_cgroup_resize_limit(struct mem_cgroup *memcg, unsigned long limit) { - unsigned long curusage; - unsigned long oldusage; + unsigned long usage; bool enlarge = false; - int retry_count; int ret; - /* - * For keeping hierarchical_reclaim simple, how long we should retry - * is depends on callers. We set our retry-count to be function - * of # of children which we should visit in this loop. - */ - retry_count = MEM_CGROUP_RECLAIM_RETRIES * - mem_cgroup_count_children(memcg); - - oldusage = page_counter_read(&memcg->memory); - do { if (signal_pending(current)) { ret = -EINTR; @@ -2498,15 +2472,13 @@ static int mem_cgroup_resize_limit(struct mem_cgroup *memcg, if (!ret) break; - try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL, true); - - curusage = page_counter_read(&memcg->memory); - /* Usage is reduced ? */ - if (curusage >= oldusage) - retry_count--; - else - oldusage = curusage; - } while (retry_count); + usage = page_counter_read(&memcg->memory); + if (!try_to_free_mem_cgroup_pages(memcg, usage - limit, + GFP_KERNEL, true)) { + ret = -EBUSY; + break; + } + } while (true); if (!ret && enlarge) memcg_oom_recover(memcg); @@ -2517,18 +2489,10 @@ static int mem_cgroup_resize_limit(struct mem_cgroup *memcg, static int mem_cgroup_resize_memsw_limit(struct mem_cgroup *memcg, unsigned long limit) { - unsigned long curusage; - unsigned long oldusage; + unsigned long usage; bool enlarge = false; - int retry_count; int ret; - /* see mem_cgroup_resize_res_limit */ - retry_count = MEM_CGROUP_RECLAIM_RETRIES * - mem_cgroup_count_children(memcg); - - oldusage = page_counter_read(&memcg->memsw); - do { if (signal_pending(current)) { ret = -EINTR; @@ -2549,15 +2513,13 @@ static int mem_cgroup_resize_memsw_limit(struct mem_cgroup *memcg, if (!ret) break; - try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL, false); - - curusage = page_counter_read(&memcg->memsw); - /* Usage is reduced ? */ - if (curusage >= oldusage) - retry_count--; - else - oldusage = curusage; - } while (retry_count); + usage = page_counter_read(&memcg->memsw); + if (!try_to_free_mem_cgroup_pages(memcg, usage - limit, + GFP_KERNEL, false)) { + ret = -EBUSY; + break; + } + } while (true); if (!ret && enlarge) memcg_oom_recover(memcg); -- 2.13.6 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org