From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933535AbeAJMn1 (ORCPT + 1 other); Wed, 10 Jan 2018 07:43:27 -0500 Received: from mail-ve1eur01on0114.outbound.protection.outlook.com ([104.47.1.114]:28256 "EHLO EUR01-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752580AbeAJMnY (ORCPT ); Wed, 10 Jan 2018 07:43:24 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=aryabinin@virtuozzo.com; From: Andrey Ryabinin To: Andrew Morton Cc: Michal Hocko , Johannes Weiner , Vladimir Davydov , cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Shakeel Butt , Andrey Ryabinin Subject: [PATCH v4] mm/memcg: try harder to decrease [memory,memsw].limit_in_bytes Date: Wed, 10 Jan 2018 15:43:17 +0300 Message-Id: <20180110124317.28887-1-aryabinin@virtuozzo.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180109152622.31ca558acb0cc25a1b14f38c@linux-foundation.org> References: <20180109152622.31ca558acb0cc25a1b14f38c@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR05CA0136.eurprd05.prod.outlook.com (2603:10a6:7:28::23) To DB6PR08MB2824.eurprd08.prod.outlook.com (2603:10a6:6:1d::27) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1f01e843-f9d2-49e7-fe56-08d55827baf1 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(4534020)(4602075)(7168020)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020);SRVR:DB6PR08MB2824; X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2824;3:avDMQY7oBFB6YDB4bibK7/AabxsKWKT/1QcDS8BQy9HhRSfLaqRKroTtXVCqJcBW3kr6DndiHjEIpVDfeRgUBHGIE7kUb3Wfcs4apAwlkP/UTPrvFps3b53e9Sznc0FtDOfSjAzME51+omeS6MJptKtuYp2z3neR2nYB9lNgI0bRf+eu6YZYTtU6Gz5AxM1QDqolE3MqbVbTn1gr3HdD4vv+PMIh+1JjS34nEDdhevetoveBG+OAWCcxuSlhLMjP;25:qTKJu6FnenG0xvmRLb+wwgIIbdGpKeQCsVijg7xfCfXVRUB9U4cSO+gRP0lWXpoje1geugKzFdNICs/olvz5d+KrdaNm9pLDCHGKxL/47x0Z4lYVPz00BnNpmPRFqEiuQChUr1dJj0et43NXls0HbzDiU3QVVKaAYXiHVZyFZalj+Ih8W60SPAjU48x7VwigPeOFsaET0XAtTvbPaETivDO6dDYWwe3E+4qXApm7iDE63Na2EhzSwlejT0HrNY3EqYCDF729ptyYKQbptiw++pWF5PcnpLjR8wFQse2Xh53wa3rUxXvktSWaNeBa0IkhlHCzl3DfrdxnJfIthZVxMQ==;31:EWRpZs64+ExUFGHndIovmCeWpr7FduNVf6sUl5VbXnOqsK4lJUpB5Ihe0q+JH98Qvf0AdqzkrCjcnprwfHphVhBPlPIfPIRpxF2s9vp7Wcb0RAgrCOpuCPEB7CQ3MZ1x9kJwryl4eDR9fjoXPrHtSlm4a+BSfbCwT+Km+obDXmPC8sXh5UqLe6RG0iTa8aUJeEHezQwdamiOU6cjls8FSDLaqdcAr62g+r/8t8DEKU4= X-MS-TrafficTypeDiagnostic: DB6PR08MB2824: X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2824;20:s29Cpr8GdlimvDMMxfafdMRTV/b5X6S7U9ToYCcSS8Ie8sAL7hzVqi2+Ws3xwFmzqRZr/sA43kRuhC3JosG6Ln6vKG1E1RyZmaW72ZRy7czezftCL6CTT7svHqWyEdJPempwuHbjYKoVL9zwpkEEKCnAmfo+T+RUKhX+9vKcuPGI7bMGLstB+YXypuQ5tOyDY9eLyAv5y//dGnpFHa44NALtiESggVcWm2T1HUZihTZPI7OnoXGSPCY166R+vE7xlNbIauHfNo22u/bHr2xvMF+hDLo/xbZls3OnvRGQsSIALA++8+R4ltJGYDX4pY1oZpgmlQMhj4PBYzP0O0HN88fWqIAZy40dILjkQ5wlXGyqqvov4PrF8xQPRzpqXL13FPJ1Wb7EvYcykc19AnFYdyGABJK3WUSmAx5EIThP9Bs=;4:iWrhl8pFfIDPiRvIlKWEMgsSVg62zruHnQu7RLBUyDwy/7nRWsX/CRGVtNBEnlatWLSJEzBKjvMTBrR4VZuLhQKEs6UTAA/E3u9EYRgnxcQx1t02HooydbKdHDZYlSOvAAbJBf0esBN60aOmDU8EVhBii7LCLuNM2juAsNpMESMW4tXjjhh9x/LgKk/QXdbfgCq3H5+pQYzPB/GPAoqHJxGu94yIjTxqK8SxGoLlcJymSEaumH1680/4MafVPBZSame4VQKc2km6I2susixWXBol0EYvFzOnfByToHF1qOXyDdNCDtQkHoBi30HMrq7sune30kbF5GWB5ykckkQKE3vrsMX+lHT85WI6OlHBoDs= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(211936372134217)(153496737603132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040470)(2401047)(5005006)(8121501046)(3002001)(10201501046)(93006095)(93001095)(3231023)(944501075)(6041268)(20161123564045)(20161123562045)(20161123558120)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011);SRVR:DB6PR08MB2824;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:DB6PR08MB2824; X-Forefront-PRVS: 0548586081 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6069001)(39850400004)(39380400002)(346002)(376002)(366004)(396003)(199004)(189003)(54534003)(54906003)(16586007)(2950100002)(5660300001)(6916009)(97736004)(2906002)(6486002)(1076002)(478600001)(6116002)(6512007)(16526018)(316002)(59450400001)(39060400002)(386003)(105586002)(76176011)(6506007)(8936002)(4326008)(52116002)(55236004)(86362001)(51416003)(106356001)(68736007)(81156014)(76506005)(50226002)(25786009)(305945005)(47776003)(7736002)(50466002)(81166006)(3846002)(69596002)(107886003)(53416004)(53936002)(36756003)(66066001)(48376002)(8676002)(34023003)(148693002)(142933001);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR08MB2824;H:localhost.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR08MB2824;23:QHEbBuxTwqCH3rNYs3PGlGr5zMBiE2vrJBEnnZ4Ra?= =?us-ascii?Q?UXTlRAi6hMBHtcDMKPWwxunuSVElHdnALr5mgJO9oIHxWoOg1dJAxF4PSAia?= =?us-ascii?Q?6Dt+lte9TtAX00X5xA+hDIsputUwPoEmkLLRKnJqpKNx4PTr3DczE574R+lS?= =?us-ascii?Q?ZHCYFo3nxSSnKqBDl+HzQJ5YVQN0UHfI+qwLWYTzOttuMNreYVJLOHfAL0Pt?= =?us-ascii?Q?B9Dr2WFGDMiGkBod600hYAPQwu2pNfweofZBeiEuoLinpaiFQX6t8eDT3x/O?= =?us-ascii?Q?COrmXxR4OexoH6KIzFNHzkJA1Qle102ebpCi7aMsiZXqh9BX0Bk6KhO8/TD7?= =?us-ascii?Q?kTWe0i5JpG1B5twfD5hTsZ8lDCILtTigeD67OFbwtk3W8j754Wml3Rh34y44?= =?us-ascii?Q?N/uAm9K8sfqRlm6NaffqTYSG3ZVVywPDjwS1eM+5mC4hOoGppriThkd36BWw?= =?us-ascii?Q?lpfB7OW8b7Y9JxNNtRlVdOP+w3EHJp3gkym1ReXghhpvUsAiY5tOwqpUB89w?= =?us-ascii?Q?WYF+3E8OsAR+R/DWDecsM4GuFMA4P3TyQdSKlc4nkox8sp9AdtjlYdGE/QyT?= =?us-ascii?Q?HOGx2z7ygtsZA8BlLkTPpjENdnzol0CPS4DbpLPkvJls8ADpoDKeFF7+Zrbj?= =?us-ascii?Q?vzMcZ7QeEVyAHiSRMSZlYLDh584eejjxUB9XB29zUbRNWAPiGVp81f45Wh6L?= =?us-ascii?Q?PSv6yvNNLbOjomZV/NldsEnfo1FMxueGPkCU5D+X60Asg6rORBrg5+Qxybor?= =?us-ascii?Q?hUI74fHRHwktw4ekTkmH+be4vUBTJy1tWIdNfItVgkfGFNZvb7cCqxf2Vwp5?= =?us-ascii?Q?Vz1P5+4WXoLzRNvYTqYX02VQJe2rpIQVzGn7U0S9myWg84ROcJxJh3bovgxU?= =?us-ascii?Q?rt7W0c8L6g1T19Oe1i8Y5LrIM2bFhR1CmBqgdYVHCxm2d/pnxEHTs7D21peK?= =?us-ascii?Q?88SolydUdB7CbZPo79qCTS7YryHFIHD6KeNKEEtxvId7FJxHQbI84YDWSjLT?= =?us-ascii?Q?OfkZZ3cKZRZ3H5s3MMeA6aZWO0rs/fJ6PGqmzrkHyIkgsPY0RUC4wfrasniM?= =?us-ascii?Q?KwcuJ9TV64tJpGe9Bq+L4LQ3NJknmn1NpbhL4d69gIUGPtwG967xBWbqa24K?= =?us-ascii?Q?88AQ5oNxaUnjYGYCadMM/j2ziDGT8Ab9RhIz/jIQFDrE8O+sxuCdrhAeJ9qo?= =?us-ascii?Q?eyZ0nYxYUSeTYJgXfQMbcZohtSAM8AklFojTUqjBeLdlgossrwiLDrhr+pLH?= =?us-ascii?Q?RCgMFDlMJUcOS5CCNyERT1NBvCSuzfWO4JoXJQyld+QUB2NpoU7FYTRA4fQm?= =?us-ascii?Q?8p+dJAgaAwyzta+VubyK5J828qeLnoAIvvlXe5oqhIc5b++4eTjdO252mURg?= =?us-ascii?Q?DmtbQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2824;6:iTY5lWQU3uGXJoNQ80PridoOdoeuuRBi31oP+IWD02AbXxk6k/3EkkuvN0JPrCkuYr9rPSYA5byC2ce7g6iRT5QcQpPbTjEkKX13f8GEteq2TFWAlFRH908bngE8r8Wcr1vxfCwSA8F5b1zs+YI09E6ZebfTb/HDLfPvHpckQ0XYhobgaE/cFf0Zf7fvH18lb2SNZv527jlJDznNhUQaI7FlmLLzAqsCazBa53jw7UD98aXcNpbo/4RJgtyNOatVUq9805QHsn34bJyd2mo9njduBiUHzuN6IgfJAwxCNYhNIrDBI8mplWdBY6L6/07ZAJHEDMAZIZYCu0ezBcijxsGr2Pt4tFCKLvXYiOZF08U=;5:y2rqIuFhqdx0tghMgTgSdu2YJ2gI57CgPzCLFsQBm3dahxK5tehr+97wjWVjFJ92oswdlWNxotuAC10BpkP8dZRDyc1NN6yRPLQZz/H9IsW99jK1cO3xUX3iU1Lv4LrHJWjIN3wr5/07SycqTUsZ8dkdJgeXfiYe6bgeQNoJsdE=;24:DLGhkSCwYR+QUk9kjg6s6DgyaYSeu9k1p1mIUTWRYSem5MBkUc4Lc6epCSIYGrL47N3+KWuUPlbrIjBsZYeAyrQ/hC1J93ce55hkc37AFQo=;7:QBKjdVxWykJxh2I8mVm1AwRCXsbAa97GxbpxOu60Zu/USjQGz4hm9YqjoEGX+z+vEndt5sWWbEDUET5bgq9wxt4xukM2IyRdEUd7MyHumLPZDlqgj4Mmot5eH9J3DUaF96uHeQkHtpVqPpUh1Q7dMrl3tFJdDZteNUof/Y62VMAo+y1rRE+WsxawtrpMJhdeDJ3Owd1e60eDOwptyUHjNspKC/JOf2ubWyQeYMWhDCc8Txz3TQJEacd4vpbjFOVu SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR08MB2824;20:mRG0R0w3c3/Nu1Lq8jZZxbwZNheQPrkAjEB+bJx2ammCAUVWFHRYZNqSnwRrzWyTb/aDlpIe0xsp1O4icRWmfJ/rmsCIdMJhC07Fg5eriHm9aw6Cq54GwdYYh8AxcxHudBLocPA5Q1WBS99xM6YeOSxPJZ0nUMi8GERqaLzzPCs= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jan 2018 12:43:19.7902 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1f01e843-f9d2-49e7-fe56-08d55827baf1 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR08MB2824 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: 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 retrying the reclaim until the desired limit is reached or fail if the reclaim doesn't make any progress or a signal is pending. Signed-off-by: Andrey Ryabinin Reviewed-by: Shakeel Butt --- Changes since v3: - Rebase Changes since v2: - Changelog wording per mhocko@ mm/memcontrol.c | 44 ++++++++------------------------------------ 1 file changed, 8 insertions(+), 36 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 13aeccf32c2e..c3d1eaef752d 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,24 +2448,12 @@ static DEFINE_MUTEX(memcg_limit_mutex); static int mem_cgroup_resize_limit(struct mem_cgroup *memcg, unsigned long limit, bool memsw) { - unsigned long curusage; - unsigned long oldusage; + unsigned long usage; bool enlarge = false; - int retry_count; int ret; bool limits_invariant; struct page_counter *counter = memsw ? &memcg->memsw : &memcg->memory; - /* - * 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(counter); - do { if (signal_pending(current)) { ret = -EINTR; @@ -2506,15 +2480,13 @@ static int mem_cgroup_resize_limit(struct mem_cgroup *memcg, if (!ret) break; - try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL, !memsw); - - curusage = page_counter_read(counter); - /* Usage is reduced ? */ - if (curusage >= oldusage) - retry_count--; - else - oldusage = curusage; - } while (retry_count); + usage = page_counter_read(counter); + if (!try_to_free_mem_cgroup_pages(memcg, usage - limit, + GFP_KERNEL, !memsw)) { + ret = -EBUSY; + break; + } + } while (true); if (!ret && enlarge) memcg_oom_recover(memcg); -- 2.13.6