From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S936016AbcHBRlZ (ORCPT ); Tue, 2 Aug 2016 13:41:25 -0400 Received: from mail-db5eur01on0090.outbound.protection.outlook.com ([104.47.2.90]:50539 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S936062AbcHBRjh (ORCPT ); Tue, 2 Aug 2016 13:39:37 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=VDavydov@virtuozzo.com; From: Vladimir Davydov To: Andrew Morton CC: , Johannes Weiner , "Michal Hocko" , , Subject: [PATCH v2 2/3] mm: memcontrol: fix memcg id ref counter on swap charge move Date: Tue, 2 Aug 2016 18:00:49 +0300 Message-ID: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AM2PR09CA0004.eurprd09.prod.outlook.com (10.161.22.142) To AM5PR0801MB1860.eurprd08.prod.outlook.com (10.168.157.17) X-MS-Office365-Filtering-Correlation-Id: 82b695a2-66b3-4f8b-67a5-08d3bae5d00d X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1860;2:jex+dVIfa1QwFRd+UjlAtPQ+5gdG7npNinZgoLgvTy4OR2AH5uClXeQeSibaYQ0L3f3JzEP8RkgSrZcKTtM9DGq56SfpZR+2Dwtt7P6Icp+tXBYZeb/pZa9h62uAG6n3pzfw11nmwAYrM0EuE/kUxDPPpspqNxlLYBaQRRRXGM0cZ5qKWZAQCG8eOYeShing;3:OKW4qw0Dvd0SCpcS5h+k2X5YWs4uwWh96IMjPEZ4MUvuosw5nBUihEn80cXJzMHmuWqw//GrMrQkDNLAvvEEgojrUQN0gyW7FtSic6AN1o5NcHP8nYnVAjKyfKfQoyFX;25:BA1gSUsBQYBAhdvdXBSS1TWfGbZ1l72eQimGFtK36hqGOscrTXG6ktA7XuoWJo22JMoFSJtJBEwcXtA2ku7VG/wCY8o0oGKK83ZI128r9kXZdTSv8x1K5Beh3x2iu3w3KY8f07yR+h/jfrXSWf7DOVC9TxvaD6fAlFMOvUUCqJ7xW/z5OiHg7bhu4XbZqjAe+J46GL6S6DK3W9UF0HCPFwkGkzJ16CgG2RrGFB3SfV9SYKDN/uavHb9iAUnKElZ02hanhwmBHJmZEmPmy7MxNEz54+ZujU8WM4mfhZt1H375StvN7PLGfXGyGUFwyKSdIOQb2n2qL7PYfA8v54JMFFJPRK1EbqJo5UvVX8ZS3QmBIUyJsfic1MAKRmkov0WinnMcOKWBZsHt8O0aGWu+YQ== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0801MB1860; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1860;31:FwlxL7g8zWc5aG3yt7XLyHljP74TYH3An21PVUgUWCR8R5o4DPEt0wXq4oNCRIPYhVNtW7GB8/a0ZAM1QesBdvT2SxYbMzxgJmbWRIvzT8F7GHAubAV2oBLKCkTj4UZPBnjx+EkxqnX9MBh2urVSQ0Kk5rnz5ixvIuT+hghhEmrSQfULgwDd8gkD4/KXexyPjGuEGzaCavj9LU8+D2bKpe/dMs34+VT4mqlaL96mMQc=;4:rzOV0TcBnO0txs7Gotwy5oUViuL0ggM5JPaes4uvTQCeLxz/FNDaZXHZfBpOSlvegRy8/kIhepoJ8RkSp98q9RDaK+YgtkB63BgV0UOw17bi6Y+Qc1TaXwO13WlK0EY+piyhJJYEx/3eL1AxKsGnA1s6ZYbHZjmpAE7++q1yKE8qB0+N0GncCoUp2GfB6M3uJNxIpR3djiCaZsjhh1Zw/ssYkd5dopefOe9rKa2XadZZmc1sTtCX1wwJlf2OYerx1r6Z1Ccolm8SYZS/30QmsJdedxwxa6C/TGybuL7GTDY4uBTUgxpLTFozSTVP3JzHCnG/OkUkSUF3GpBVbWFV2bwCKDGohcxqBWIQ1ou5CO69cGoJRpYV8FBhrM24PlA7bTMY4J47QALirnTW/CKs7LAn0WnnmC89dA+wt9X2zikQhmPrSDFn76UycX+AYqkYTFg2WNJOrGUsTL0+j63/pw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(9452136761055); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040130)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6041072)(6043046);SRVR:AM5PR0801MB1860;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0801MB1860; X-Forefront-PRVS: 0022134A87 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(189002)(199003)(105586002)(101416001)(33646002)(36756003)(47776003)(8676002)(86362001)(42186005)(229853001)(4326007)(106356001)(118296001)(2906002)(21086003)(305945005)(19580395003)(3846002)(92566002)(19580405001)(586003)(5003940100001)(7736002)(50466002)(50226002)(2950100001)(110136002)(77096005)(81156014)(6116002)(69596002)(81166006)(48376002)(80792005)(66066001)(97736004)(7846002)(50986999)(76176999)(68736007)(189998001);DIR:OUT;SFP:1102;SCL:1;SRVR:AM5PR0801MB1860;H:virtuozzo.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM5PR0801MB1860;23:PajWkcrV2D+z59dEC2kY50FplPNU9JttnxDZJAu?= =?us-ascii?Q?70ZK4xXlkIqqVTsbkeJuRsGXh+DVtBRW23gpTGsCj3IT6WHOdP1Lr0Kh9nNw?= =?us-ascii?Q?NH1xtGQHdtsuX3XmeofmwBfHAel8Y2qZ2elMTzsekpGqKYtTCZo9W7nLliFb?= =?us-ascii?Q?mXSjnC7nEYyRQKTqaK/AYkumf44whmNgZ2CX3Y7Ca3B6GuIs3978ycyFAL1O?= =?us-ascii?Q?lakTcZXVWi9Mh8MM5DeQRTr4yDMcrrPs4DlwknDmsnzySMgyeRZoF/gsVB69?= =?us-ascii?Q?oRHOlnCm6VZR3WXrv24VCvoOD2AY/lhN49eBfkkVEYl8N91lmxh8k64oXlGh?= =?us-ascii?Q?gXgZmtTHVlC28bjnz/TxLlvxhqFC/5mP2PQyGhZJPIe9TlliIjIuUxO8Z3NT?= =?us-ascii?Q?7dQU6IAqC+n4B7ciMv7RBk4xhkQxZ0jcJV0gSAV63+Y3uyNcmRDchujxRZhu?= =?us-ascii?Q?zxzqFaswZH7khdOplbeYdy00tKNQk0LTJDeD8Oq84prc7yS6lFxiF2gdt9ef?= =?us-ascii?Q?sFVHPgt2PRJDTyzCyOLEJxLAifrmoLlBYmckWeDQM+rL+bDDF8WyI4GFBUTc?= =?us-ascii?Q?h6B0LSYTwObsKaN7hsDmi9mGwN9LjjoYIQUeKKMFXduoVkOkItLMNa0plxUD?= =?us-ascii?Q?6zK4E5N0ET6OKz8ZE8L5iBaleMLVksKNz6VODbez3tkCZV5quy4wsUikDpHF?= =?us-ascii?Q?sQdrRbyBfs7cqXLgZgoIeEacQINye8eVPJgllt6k15oSfpU9KLoWdLbmiTY8?= =?us-ascii?Q?RRZtS3ZQ0AU0STuYPf/5qXUqZRRGHytk3DIqAqCf1toaFEJZ/TjDrLhaaRPX?= =?us-ascii?Q?1r2XOZcgXIyrPM4bDpmPTLg+Lvx86Hzac7H+1fSAw9OnSxGjnxbPu2/PHNOz?= =?us-ascii?Q?qhW/azxMwImG9LV/uiYiLsv/qPhep17RNCULFeJrqpDrEtjL0vWZkiTN2Mq4?= =?us-ascii?Q?I4irm7rTdmQVafSquw6dyBCi3w7L1y4q8flrWV3CRpit6MV62WCwknuQTQVE?= =?us-ascii?Q?g6AE/aplOiZWrrBnaoDjk1UyZ6Xyw12TQWlOvJdmk36RXKYrV6gXcz6IyhTY?= =?us-ascii?Q?BWIfKpmSBGt2uigJMk1UsS5wtBI1A2XvgDZyZT7gBtIhIXD3z+A1Yv+BZYt5?= =?us-ascii?Q?LYZc7ffDxsDHepkglSeK9/Z5NbML/b85/?= X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1860;6:NKu2E4lw5AcrztRqSpyUhSx+KHjkPYGPaFnDK050una/6A2pzOma1VR7zMrW/aipBTApMxLxkZ0O9VBb/ycgxC3F8M2R51M5x86lfZUg1KBfxZzoleTahvajkC6BeULEJ4Q1d1qXWOqE/L+7tiyhfBYIV3i7p0yzJoueFO4MOauUNELaFAw+NQGJui0sUr/SZwf5boWzz3Kz+rVD7QWppGKMGdWgFfLYkush0aQvGwMgWhkbBQYW74P8z7GWUyCOBc+wIURdO7Xg0CvwfFgHkleyeafzuVkwMPaVrOFkqBU3xM3Yepq++bsj0qWAN2H9;5:mdpjRBsIsjZLmsduTSTfb0a3WgTKPxMOe+u/5HgAh+EMnqr4i3poxdPKc/7lmzc1q50AYoWzzFd9ZF+Herrnf6lC1t4CsTAnMUzTFWuxrZseNYjYq50ipzshbKiTwYKMkdnqBVUVYt+j8H+AcYW0Hw==;24:hHSShlefxTSifzAb2ziHBDX4RXrc3lVAHrBrd0uXoXs/v+1c1cvZMYP05y0p0XI6VIin34TK41aDuE3666b43pDNC6AhU/mz9T/lfHSejy0=;7:fX9KXcRyBVfCNXXSTAb4h93I2NDhUeKbZJMPXNWM+l16g77XCdCISr7rYdjqXGPuPnI13CORBcTjU4uEPWGiL1scDab3H5UP3gDK7xRTMf8dDvdrTYULqTuINaDvVQbI5cX4WeqFdrtNU1I9ohb1+pDIm+bG43VEVzttfFxlQ/Lm/+6kPyrjULAopYH4jHNKg9OJcj0asI/4gsdQFIKZ+2apSDBgJ2R5ArxxSaExZ4FLpkfxSA2iuGvuTdT1eP7t SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1860;20:xNn5qhnVkF/6GmggzZ8PyDSC+/mjr3nCcccYziq6vEr19siO5IKLPJAryNE58S7dqEiTpQQ2RJf4KxfOdNZRmDa5a/l7781O0K7uSA75jBcth+KtxpZUq8zG81GaHShUhR/LqWzL3hpmd93v4Qg7hpFMrAF7CA72JPmKHvyuP8k= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Aug 2016 15:00:58.6365 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0801MB1860 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since commit 73f576c04b941 swap entries do not pin memcg->css.refcnt directly. Instead, they pin memcg->id.ref. So we should adjust the reference counters accordingly when moving swap charges between cgroups. Fixes: 73f576c04b941 ("mm: memcontrol: fix cgroup creation failure after many small jobs") Signed-off-by: Vladimir Davydov Acked-by: Michal Hocko Cc: [3.19+] --- mm/memcontrol.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 4ae12effe347..67109d556a4a 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4031,9 +4031,9 @@ static struct cftype mem_cgroup_legacy_files[] = { static DEFINE_IDR(mem_cgroup_idr); -static void mem_cgroup_id_get(struct mem_cgroup *memcg) +static void mem_cgroup_id_get_many(struct mem_cgroup *memcg, unsigned int n) { - atomic_inc(&memcg->id.ref); + atomic_add(n, &memcg->id.ref); } static struct mem_cgroup *mem_cgroup_id_get_active(struct mem_cgroup *memcg) @@ -4054,9 +4054,9 @@ static struct mem_cgroup *mem_cgroup_id_get_active(struct mem_cgroup *memcg) return memcg; } -static void mem_cgroup_id_put(struct mem_cgroup *memcg) +static void mem_cgroup_id_put_many(struct mem_cgroup *memcg, unsigned int n) { - if (atomic_dec_and_test(&memcg->id.ref)) { + if (atomic_sub_and_test(n, &memcg->id.ref)) { idr_remove(&mem_cgroup_idr, memcg->id.id); memcg->id.id = 0; @@ -4065,6 +4065,16 @@ static void mem_cgroup_id_put(struct mem_cgroup *memcg) } } +static inline void mem_cgroup_id_get(struct mem_cgroup *memcg) +{ + mem_cgroup_id_get_many(memcg, 1); +} + +static inline void mem_cgroup_id_put(struct mem_cgroup *memcg) +{ + mem_cgroup_id_put_many(memcg, 1); +} + /** * mem_cgroup_from_id - look up a memcg from a memcg id * @id: the memcg id to look up @@ -4699,6 +4709,8 @@ static void __mem_cgroup_clear_mc(void) if (!mem_cgroup_is_root(mc.from)) page_counter_uncharge(&mc.from->memsw, mc.moved_swap); + mem_cgroup_id_put_many(mc.from, mc.moved_swap); + /* * we charged both to->memory and to->memsw, so we * should uncharge to->memory. @@ -4706,9 +4718,9 @@ static void __mem_cgroup_clear_mc(void) if (!mem_cgroup_is_root(mc.to)) page_counter_uncharge(&mc.to->memory, mc.moved_swap); - css_put_many(&mc.from->css, mc.moved_swap); + mem_cgroup_id_get_many(mc.to, mc.moved_swap); + css_put_many(&mc.to->css, mc.moved_swap); - /* we've already done css_get(mc.to) */ mc.moved_swap = 0; } memcg_oom_recover(from); -- 2.1.4