From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754046AbcEWKgO (ORCPT ); Mon, 23 May 2016 06:36:14 -0400 Received: from mail-am1on0111.outbound.protection.outlook.com ([157.56.112.111]:25664 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753310AbcEWKgI (ORCPT ); Mon, 23 May 2016 06:36:08 -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: Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Johannes Weiner , Michal Hocko , , Subject: [PATCH 6/8] arch: x86: charge page tables to kmemcg Date: Mon, 23 May 2016 13:20:27 +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: fb009d24-b391-42e4-e129-08d382f3e634 X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;2:q89zlhfsTV+56rGsa0qYUCRomM6bP2Yjryvfv8aKRjezRbtAyk8a4FxAsfAV+B36vUwnH05q3cuHMxF9ukN/4jVG+SoZUxkZNw63YngN2TpAor/zpdaX02cufA/shuU9G/lvP2jzW6J5ER7/tzYAWPclmgy1jlfR2lIf6j7PcAvcTZIwSXFMHqAeK2CLo+z8;3:YjuXA4HXUr1MDmKV0JwsAeCOVBH2p1LQiSv/RPTUle0iRptdFsgYNyhGoIysWjILiuWu2FMsWPpAsL1R+z/GUmM5KczbOhQ5TQsauBQc5XHerFFjguuVvVx27sjjnZIc X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM3PR08MB0579; X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;25:PNsZvHVsu2aYekpbFKXWvWIdpoK9Pke9oQX+poUcXWtAfvipD3DK+V89O0mBRl+K5hGmrQugDjoy+amrzV1f50LF8YGehXgd0mYSg60+7YR0Tej7NuzkhzdP29CJYdT7zfKDR4Dp/JBwr8UVdgksZxN6v9RUZfthm/B/WuBRjLrnicc4ZGkdkWkDmMsaWXh36BGcZOMC4aIc6+qmBdlMCAG2Bofll79Q9jXIXyfKpwBqosX0C755jmcfYvR8DUKDgpJ4UjWKtPXWTaKUkzIPKU8lYydadcTot16r/TsYxk8ds3esO3Q2pxxydFnzmjM3Yoew8jp+1WpLRD6y6eyiZz+1zDaEBylp3dJXQsjrBB6BaW6KN6pCgwKEn5nRgLjd73e9o2F7sjwECHbY0gGddUDNLhkDrsUC2rZ9PdMx3rEPguqEfyuZXqPR3a+hfC71rrfK6MiltspVdT+FOsaZta5lQZcGUpcMBvcmmqBnojVtzQdYVWtzCuiIRnKJuJOjP+UDNQaSTUhN6NZMew7nqCCeXavG2ZLbm7jQPQ2pivxa3gPkG36ro9zGVcUUwKOIOASPLU1niAIHolpyUZhYL5SHTXph8NES8YBE5H+YeRM1wTg+U/dx092zrdKhK9Mzb0sLfizfqS3O7ohjqMgUFP7cfh51CCm1p6vMUAsNPyU9Jke3UO0SibyJqz385pLNxjJviZTeVfmZLtMdRkigP0duCqbUYm8CXzZBmavnOPcuDjl4p29zETNoONa1IrvS 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:fHUjmqUuPZimqpCB/jk2K04uEq51pdq2a6DXEYWhvhgTj0AjCHNnJCJ7/EEqiY0tXyZLsy7WVfEe+yiVObl+J8si0WDi3h6YTP+aKFV3SUzxDYBLP0wlmfJC8leB0u0wuMjySjzB82i+FSvhqqWxuv+7ZcNCevGpzla9ceD/XoieC10ch7XlAtyx9ADWZv98qNsPhXDw3qthc16GHypj7qgSPzXUClFmt2UaNopOnSILJX2W8ZRUbAy2Bi+Wo6ArCxrU2RIVeIWVYWXNnlvTVSYJXWHN9SyFC+QJWYAlIBIoBZ4VfRRJ5/uOIjdw9N3vpG9oBwP/+FvYjPg3MFJ4vblsBbTdi1aVWubPLHrz2Pu2aBFvhRURH/r0idw4HuvP0IEcicewMOSpUqyWCM+i/mnBhI4kGyJfa8eZUF4uINI= 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:omzaxUsqQGEsmCbf+siYrvsgpnYlV+b78i5+zimUjDCp7mz1iROcQi28BYXnDk7htGT/KtHhwPKN7FN8KO92i3U800gJSuhzv3ZcDEu3VVvD/lNO9wz2Vi/qXawvtGTOLOVNr0KwT3Y+Jd5I/N1QBiO/WGYjPuupiQytGb96FqAr/sLddhCHS3PAI9Ty48pHto73O4vgTfGKRI+Gpl69+x9Y0yx8tErCW/2UTgpJ1+hPVP6Z5aosCRtGk8qvA0cU16t5yTrUDSEJQyM8o3mzLgw+Phy9SVtRLtuhN7KHakgaxWLwDugqOug16mjVQsEXYEoIIj/9jZNLN4YDE/W4IfIT4qR1/IMDMXHPiO89H8YSi688FNbDNkJu8r2QBBQzlDwuQbCcGnGk3SGH8av6iYLZCgVIcYb1TBTf4dFRcaGCXqyOr0hpj71ocV3mpD5sHg7/OU7vrNtAYccP/yMSwvM7PJWtCDelcW4Q+9WPOxXmBswA6Auj93KD+yDU4o5jIDtrhhCW2DXwgVYf7dVeV8YY7KTN67nKEd0KIiFUW0dF3cybM47mEFPqmQaVdKjYf4T4mBmh4zY3WfWNu509mhUx6OORJbiZnYNlEdbqNKQYRPdB6gK9meOfLLv6Okd6tWg9YrgnPdDUloUvQHZ5dmQzrQFrL/aTNo3usnHnrc+WByGAebx7BTE0NcsJ2XbKfTPegbjSOWssnSsi3MCts/Py9smi166ih8E21huepeG8emXJ/fSmtmGQOr/YChMtGWwAgciSQYLHBPDZwvRKVFOGTet76IBk+DHkZ/vDauafE45ttku3WliApog8U66Va0trmKbFVpAKquTqVqkIJSHz12gBjkYsxDgVujvrn6eFhA+rCkSzElvMOvXYe+XXaoPOmwTU8o+3GoYZYq4/1g3pD8Plv6XnM0F1IJoMsNA= X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;5:8MHxvzUSd3e28biWhztM/YR+Jr71GDz67/hw7vm8s8o+OidpokzD4/xVOCLLtrzM0EsCVtO3drTdkoXErkAUZqt4a97wbv+T5/AW/MkCmQiaulIsl2uKVC8gDIZuEMY3z0rxgWZdtDyrv5f/mWTReg==;24:FDzAAXSzri3fxMo8cPARucMEFlZkivn1Q/bzYZNLhlzHA6HujHCRqp5GS44acNph/5z3xgo7Jmk80796+zsoY+KUJBMC4b++TVg7doYmHAI=;7:r//fu3MXhYhN1oRfK4iSlbwvEFa/juFZfLdT0x8Og1UZ/NchT4lmLXBXQFwFnw64lcocxcphPn2zcriRtk1hqdRs1Rz+EV9pWUTb9tjuls4lScwsXojC6U4nFtT1Cz/IkRFOzu8UYU8lNaHYMfulSezigaVNhz+Rm4zY0mLvq7fuio7fHZ9Kgb14mnHglDKm;20:6FibuJjbIPWYOX5kbbFDZPQMGUGjuqjB/veU9gwRk/15KZMtQE7aHDh/ymhvYQa3r9HX59SU7QGkAXT7b+HU40MgrLKu2Y3CIdI20PXmD9CEaKXae0uu4KcS5XtGdkJWMDhuQGxPqQoRUQt4NRTeI2oZSDxWcSqeNMljb6jOciY= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 May 2016 10:20:42.9010 (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 tables can bite a relatively big chunk off system memory and their allocations are easy to trigger from userspace, so they should be accounted to kmemcg. This patch marks page table allocations as __GFP_ACCOUNT for x86. Note we must not charge allocations of kernel page tables, because they can be shared among processes from different cgroups so accounting them to a particular one can pin other cgroups for indefinitely long. So we clear __GFP_ACCOUNT flag if a page table is allocated for the kernel. Signed-off-by: Vladimir Davydov Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" --- arch/x86/include/asm/pgalloc.h | 12 ++++++++++-- arch/x86/mm/pgtable.c | 11 ++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/arch/x86/include/asm/pgalloc.h b/arch/x86/include/asm/pgalloc.h index bf7f8b55b0f9..2f531633cb16 100644 --- a/arch/x86/include/asm/pgalloc.h +++ b/arch/x86/include/asm/pgalloc.h @@ -81,7 +81,11 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) { struct page *page; - page = alloc_pages(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO, 0); + gfp_t gfp = GFP_KERNEL_ACCOUNT | __GFP_REPEAT | __GFP_ZERO; + + if (mm == &init_mm) + gfp &= ~__GFP_ACCOUNT; + page = alloc_pages(gfp, 0); if (!page) return NULL; if (!pgtable_pmd_page_ctor(page)) { @@ -125,7 +129,11 @@ static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud) static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr) { - return (pud_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT); + gfp_t gfp = GFP_KERNEL_ACCOUNT | __GFP_REPEAT; + + if (mm == &init_mm) + gfp &= ~__GFP_ACCOUNT; + return (pud_t *)get_zeroed_page(gfp); } static inline void pud_free(struct mm_struct *mm, pud_t *pud) diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index 4eb287e25043..421ac6b74d11 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c @@ -6,7 +6,8 @@ #include #include -#define PGALLOC_GFP GFP_KERNEL | __GFP_NOTRACK | __GFP_REPEAT | __GFP_ZERO +#define PGALLOC_GFP (GFP_KERNEL_ACCOUNT | __GFP_NOTRACK | __GFP_REPEAT | \ + __GFP_ZERO) #ifdef CONFIG_HIGHPTE #define PGALLOC_USER_GFP __GFP_HIGHMEM @@ -18,7 +19,7 @@ gfp_t __userpte_alloc_gfp = PGALLOC_GFP | PGALLOC_USER_GFP; pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) { - return (pte_t *)__get_free_page(PGALLOC_GFP); + return (pte_t *)__get_free_page(PGALLOC_GFP & ~__GFP_ACCOUNT); } pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) @@ -207,9 +208,13 @@ static int preallocate_pmds(struct mm_struct *mm, pmd_t *pmds[]) { int i; bool failed = false; + gfp_t gfp = PGALLOC_GFP; + + if (mm == &init_mm) + gfp &= ~__GFP_ACCOUNT; for(i = 0; i < PREALLOCATED_PMDS; i++) { - pmd_t *pmd = (pmd_t *)__get_free_page(PGALLOC_GFP); + pmd_t *pmd = (pmd_t *)__get_free_page(gfp); if (!pmd) failed = true; if (pmd && !pgtable_pmd_page_ctor(virt_to_page(pmd))) { -- 2.1.4