From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753504AbcEWMxt (ORCPT ); Mon, 23 May 2016 08:53:49 -0400 Received: from mail-am1on0113.outbound.protection.outlook.com ([157.56.112.113]:9618 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753314AbcEWMxr (ORCPT ); Mon, 23 May 2016 08:53:47 -0400 Authentication-Results: linux-foundation.org; dkim=none (message not signed) header.d=none;linux-foundation.org; dmarc=none action=none header.from=virtuozzo.com; From: Vladimir Davydov To: Andrew Morton CC: Johannes Weiner , Michal Hocko , , Subject: [PATCH 5/8] mm: memcontrol: teach uncharge_list to deal with kmem pages Date: Mon, 23 May 2016 13:20:26 +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: DB5PR06CA0038.eurprd06.prod.outlook.com (2a01:111:e400:52c2::48) To AM3PR08MB0579.eurprd08.prod.outlook.com (2a01:111:e400:c408::13) X-MS-Office365-Filtering-Correlation-Id: 476160ad-5ff2-4492-2497-08d382f3e557 X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;2:8TdrJHhJTUbO/kBArRwkZsuxGQSVQu76rQ3UyYGQiOydw1F5bFeYYspL3Cc6zOU8jJdRnuyzHCTNURWwQ3HGIBStFy7pbQauJxDGutRl0XOUwpwAYNj00ArlkvlgBH3z59U+MsHhq/omBx63aTPiiYQrOm623n7AePW9HHRoqDYT1Ediri3FBkRktnZh9u8f;3:qOzbN7NMdMdhC6M/trtJxZAocjAFyp95Q1SBUYt/Lj1YCcD1FX7OlLtG5dm69Ay1xTNTV5xeCld+QCcBVVVF60nlyjENMmco/3rmNpLhHLWmrKXIAR2GfKDBFi8mkSt6;25:9C2McX7kYvlypJJ6FSgyun6ORavbm1CWVDLiGzH44GikkQJIW4tPznSoC8iHjUx+tlC7PFGdRxCXO69tX+jNb1T1bpHmrmrx1Dm9miItC8IlgqUJE8Y3RszuhTGSlhf5OOvCX9ByakAexrgjMXJjaEauQpag671hwC83ozI/0OkguwoN8IkrYqQxGN2PK9CRWz3TvKFDsd3/5V2nIj+X5+a1WlLdRXOs9L2T7FA9ad7/+iat6yeHV1UYSAP0a/wq9lsvmCy8L9/LXjat+lpRhFhrq6ZzlMqM8DNxB2vVJE8rnfxhchqsDJFJUmF17SGNOXr24YCHQPK1t3vBhURLdNg1KAiMf/f21DuO3rD25+l+50IJXXE/H27p2K7Mz2U0H0tzpluiKNC/5bOcZ72E3pB2m9wpPMM6orRNAEsrwpI= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM3PR08MB0579; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040130)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6041072)(6043046);SRVR:AM3PR08MB0579;BCL:0;PCL:0;RULEID:;SRVR:AM3PR08MB0579; X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;4:TLE5UWcroQ/aouboyj3HQV8RPhbp9Hg7rh7Fxeno9xvbQ9PpuAa3yba7RRBAMEhB85Nn2Q+Btu4a3fOaNlgrUhxdPa/AqYP0+pyRU92WmcROtVUt+5pO3aM4dKOBqpfRMc18mhagiQAXJ6BtxihOUDU4ky9WlGek5MEirD1SuNT2HaRUKCuc955y3arZCMWbJW+//64MjXed3Y8/BF7Z/nQ6M9z0RkurEi3YpbgIWAWObHHasx3Dm5q3Uy+0XNXVvvHTL50yz3IBvHFtO8rI/PxbAlhl/cER9tK3xzb0X5rgnDQ6GkN23q6RxCDpT6b0PjiEIzhJJt9mjU+XfCdmg8DNHddFS/54b1iOvNwTjMIj198Z1E4KMrCHqCtYScxg+QYvS21T7UDlX9/MmVYK0owoO568SGgbQvbPdBKXKyE= X-Forefront-PRVS: 0951AB0A30 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6116002)(3846002)(19580405001)(8676002)(19580395003)(586003)(80792005)(36756003)(42186005)(76176999)(92566002)(86362001)(50226002)(110136002)(189998001)(4326007)(2906002)(575784001)(81166006)(5008740100001)(33646002)(66066001)(229853001)(2950100001)(47776003)(50986999)(118296001)(48376002)(5003940100001)(5004730100002)(50466002);DIR:OUT;SFP:1102;SCL:1;SRVR:AM3PR08MB0579;H:virtuozzo.com;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;23:dHVhL+gLGpprdg2c40UwcGnopuP1a/QSTyrYwlJrrJp9kjMFKS/uilSyxgQxnPaqrQp9E/gkGKIFg91p+z1x/AjeM2TFa6TQwgVVAZzWG6fxCztyHXNXSGle2hYZxXIEoCPUzYeIO5vPmoMk2zkauR2NuINEvo4j8MKPUU6QV/dNAY/SoMMW0rzAq+/DS6tLwM4A/wsKDUWMWgnhEKa6Peh7bsto+RQDE9O8W3jy4Op/xB08Saqv19Ux7WHyaUF5dfb9zv+uGR1Kv1ARBfFhThObCRjaS8ZYHLXMGhtRCIjlTtwrx3+UqU25gDWqiPyJ6xti4I5/UzPomScloOAb4THHHdhJjig+Wk10zaHLDYr4UYFxaN5wQcd2KoHgwPU57UM2RIZjCOtfT/PClTjCmv4rRWaQ3AWXYWNaydgnNlXfBeMRTUj98T8ylY0th546G2xLNTXgWqNzhZp6IhLj8OCncSSh84nPSrZmHyPANfMuZVibhNezLWM5NEZYxhSN/Vd6uiKtbOa1BUzJai+I9JHVCPUQDwQkloSTdluGVl28eks6gnMhi9cq68Q8YdCpxUp0pbdm8s4SXukC8kUS1VChtuDzpCBUefTl5pX+F1ZnKH0GSfELS5sV4XEbkF3Fa+/dXFhmY7U7wYoXsw+zjPpcrhncvN/jMWQYyAmv271Kx3zPxvkvuxedTyBxSjc057o08UM4tU+KuSoIGwSDkqdG4wBSm7BEoR+Ic97s5aijmpMknvNieub2c/wzBlLSOeL+G3E4kTKnCp6M7rJMl5Tfjb5S04G+EIMnyjbFLXdDp6bH3TJNpqWXhzIFkX3heP/1bhu7ljAturQ1A8r1YNjt/WFZYUKSbNy5LwC7aZdy24bXBqplupN5PvwGCK0001c6xGseaeDyyUuYHcq2Cjfyu8ndUUBS+ox5FUCOCg0= X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;5:N5ecTbW/3PUsiNIguvHtbdtmfDyaXDZpLILlF19QxBpPbycDalyj08fLjwLAqntdT52sZlSFvjiHclk/tktix008CrYGMwVzonnlxKtquVP3Zh4+7J7WZgxFNXimIzimtBmBa5aWRy6Rl0jA1W0YJw==;24:rfEYBhrxKsKcnkzpCyXcXnALYHA9Fhwl29CloMOU12uid7PV958632YHQff/8+PkxE6SjqatN/KN3klFu2xE+b+VQeZAAfGzRLmBNKN4sng=;7:99CJoStw+apzZAOkQIedJokx2r8SSzWZp7vvPB3Uk/PNKbo/ycGHD2wmsSmmXXhkTmKaal5YRRoAbJZJQe6RX5XwTx6CCmNEFx8CCB2bPOmeloiUjwuQb4CAxlh2g+02/I/OLpjyqmb0ZjylHPFx9A6aoTwiFXaBmzEKxpT9UzfHQwUBjtY87pjLb5kgWQn+;20:qjV0HdzZyLPWT6aZUvgzkG4lXo3dB6kgpsmF1MlLszsnUrBOJWdILj+7aRzmFKsxtDj6urzoBgct/QAQIRvjbg+XzXQaVAxp80Ep15ydLupG8ry123NNN2E+1v1cODV/G7aP5UTiJTHystNS9xa3WHSejtaRcntYTvhBDpaslf4= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2016 10:20:41.8541 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR08MB0579 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Page table pages are batched-freed in release_pages on most architectures. If we want to charge them to kmemcg (this is what is done later in this series), we need to teach mem_cgroup_uncharge_list to handle kmem pages. Signed-off-by: Vladimir Davydov --- mm/memcontrol.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 482b4a0c97e4..89a421ee4713 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -5432,15 +5432,18 @@ void mem_cgroup_cancel_charge(struct page *page, struct mem_cgroup *memcg, static void uncharge_batch(struct mem_cgroup *memcg, unsigned long pgpgout, unsigned long nr_anon, unsigned long nr_file, - unsigned long nr_huge, struct page *dummy_page) + unsigned long nr_huge, unsigned long nr_kmem, + struct page *dummy_page) { - unsigned long nr_pages = nr_anon + nr_file; + unsigned long nr_pages = nr_anon + nr_file + nr_kmem; unsigned long flags; if (!mem_cgroup_is_root(memcg)) { page_counter_uncharge(&memcg->memory, nr_pages); if (do_memsw_account()) page_counter_uncharge(&memcg->memsw, nr_pages); + if (!cgroup_subsys_on_dfl(memory_cgrp_subsys) && nr_kmem) + page_counter_uncharge(&memcg->kmem, nr_kmem); memcg_oom_recover(memcg); } @@ -5463,6 +5466,7 @@ static void uncharge_list(struct list_head *page_list) unsigned long nr_anon = 0; unsigned long nr_file = 0; unsigned long nr_huge = 0; + unsigned long nr_kmem = 0; unsigned long pgpgout = 0; struct list_head *next; struct page *page; @@ -5473,8 +5477,6 @@ static void uncharge_list(struct list_head *page_list) */ next = page_list->next; do { - unsigned int nr_pages = 1; - page = list_entry(next, struct page, lru); next = page->lru.next; @@ -5493,31 +5495,35 @@ static void uncharge_list(struct list_head *page_list) if (memcg != page->mem_cgroup) { if (memcg) { uncharge_batch(memcg, pgpgout, nr_anon, nr_file, - nr_huge, page); - pgpgout = nr_anon = nr_file = nr_huge = 0; + nr_huge, nr_kmem, page); + pgpgout = nr_anon = nr_file = + nr_huge = nr_kmem = 0; } memcg = page->mem_cgroup; } - if (PageTransHuge(page)) { - nr_pages <<= compound_order(page); - VM_BUG_ON_PAGE(!PageTransHuge(page), page); - nr_huge += nr_pages; - } + if (!PageKmemcg(page)) { + unsigned int nr_pages = 1; - if (PageAnon(page)) - nr_anon += nr_pages; - else - nr_file += nr_pages; + if (PageTransHuge(page)) { + nr_pages <<= compound_order(page); + VM_BUG_ON_PAGE(!PageTransHuge(page), page); + nr_huge += nr_pages; + } + if (PageAnon(page)) + nr_anon += nr_pages; + else + nr_file += nr_pages; + pgpgout++; + } else + nr_kmem += 1 << compound_order(page); page->mem_cgroup = NULL; - - pgpgout++; } while (next != page_list); if (memcg) uncharge_batch(memcg, pgpgout, nr_anon, nr_file, - nr_huge, page); + nr_huge, nr_kmem, page); } /** -- 2.1.4