From patchwork Tue May 24 08:49:28 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Davydov X-Patchwork-Id: 625560 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3rDVPC4XXDz9s5w for ; Tue, 24 May 2016 19:25:03 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b=B6ZROeXA; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755268AbcEXJYs (ORCPT ); Tue, 24 May 2016 05:24:48 -0400 Received: from mail-db3on0127.outbound.protection.outlook.com ([157.55.234.127]:39232 "EHLO emea01-db3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753144AbcEXJYq (ORCPT ); Tue, 24 May 2016 05:24:46 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:To:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Wc0klb0Lc8YmSeMU8x3VlA5EMvWwass4Dx/fxNFz8eo=; b=B6ZROeXAUkOcnOxziv5aEwSc/bttPISgaPXyGjxUGiWHU5ASZLceQ1SJJqA062j2iEg/AwCUcmgSwzJ9tlw23xZU+476w9sU6shcKE7TDFDLXhPWfOGdpsDVwnwCj+xLMuHyyKFRs6iHyNF7B0e6HeHeRSe1Et5sykJz+yyQ0mY= Authentication-Results: linux-foundation.org; dkim=none (message not signed) header.d=none; linux-foundation.org; dmarc=none action=none header.from=virtuozzo.com; Received: from virtuozzo.com (195.214.232.10) by VI1PR08MB0592.eurprd08.prod.outlook.com (10.163.169.22) with Microsoft SMTP Server (TLS) id 15.1.497.12; Tue, 24 May 2016 08:49:43 +0000 From: Vladimir Davydov To: Andrew Morton CC: Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Johannes Weiner , "Michal Hocko" , , , , , Subject: [PATCH RESEND 6/8] arch: x86: charge page tables to kmemcg Date: Tue, 24 May 2016 11:49:28 +0300 Message-ID: <7d5c54f6a2bcbe76f03171689440003d87e6c742.1464079538.git.vdavydov@virtuozzo.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: References: MIME-Version: 1.0 X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: VI1PR0901CA0081.eurprd09.prod.outlook.com (10.167.203.177) To VI1PR08MB0592.eurprd08.prod.outlook.com (10.163.169.22) X-MS-Office365-Filtering-Correlation-Id: 929a5357-f8d8-4d58-8e29-08d383b05a6c X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0592; 2:zYtC2qsUBtjb4616TwiTNoTML+SFbMTKOupcCtSyyuwYo06jKZQ2LxWfyQgFSilB9gwrgcbTTHBYacY4yb+9iQmTLHxXRtTWaHYRCYZTgZujZ6Y+nwu6LWLJUQiwcVsbMeKefafcZS9CJJ70uXGMOZL41DTiw8lAVmao8N7NSzRcwifTtKUwgUQlcHVSBi2f; 3:c9MQicg96UxiYCrZfYXX2eIyWHd+AkvZ/o5afxZmtteNab2Y+jDANbhO0XGJpAJ0TF0m4Wfv1cTe9WGge5LypZ0U8ktnz//4Iy1qfo5V2rHBhyUzmaEpE71NJ0qUSl3l; 25:AHm8+eeexoRKnOyTD4MUs/O2cMCS/ZNAR6Yi9X3X2XYfkLGcpeCZ1hom56DMgayk5THPYRM2tQAKwYJNyV2oySWtOlkpjK/QaZGdVxQrQGRaff/xu5xGm+BLsXxWfEVs0SO9/hrVT7lgW+Jl9D4lYEMPtzJF/K/WRzpavRuG6DxUpSDYPZqPBuebrUq2iNDNeKC9a5Ws7jM3OpXVIEWeX4/hRvp0MrVmlMPLnEv7RhFn2q5PszEvfamb649t+QFRPD6yACxWMHNxJ4G2eznuL9UEL6XWiLlx/Qs+WHrb6feqiGYqb6Dj4flcDh4tD7ojAyQ4VOUdv+dGkfLaTv0XcV81W8l9j06Y5LAl4TtBnVvCME2T4GbT6c061RVVnY2bSzmuJQVYDyl0K5+awO/T0hLYXW2iBcNsrmU2mdtGg84= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR08MB0592; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040130)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6041072)(6043046); SRVR:VI1PR08MB0592; BCL:0; PCL:0; RULEID:; SRVR:VI1PR08MB0592; X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0592; 4:+cMV16FCmU0FhbcngKT6Emn4842m6MwMzUbZNv9CQUtEi086kmrTBJIQ4Iqb2Q72E3ciQNO6orVmz+JfMXrHJIA8xVh8m8AW7UuxTLfj7V3315lHUAxuNLD+/8UDiKmeWWLeXPzH/4LEbdfmRiWAYf1qrlWMJ7glbs9FYoyG6yRyF3h/Awf7gZ5Q61IywLwTR4CvHZCa71d0l3HsX4roCltmGeOjRPohbA02GvkgSdM51DugpErvLnpwDIqr8fPSWd8QGlPkey8g6ZLzHH0KT9LS6uAOnmKhze21ljRNysy/4UsXd3YI7pEIjRdMxx867QQ9OTsrlFpcBYGmEWhtCHpkZ3/n9wYZlo60zCoZchREK0r2hEIMcZ6QbjISXjsiFGlgHXesRp+P6WU/031rYxR3OlgsQa3mDPPqDZRpHzs= X-Forefront-PRVS: 09525C61DB X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(586003)(36756003)(3846002)(6116002)(2950100001)(77096005)(76176999)(50986999)(575784001)(86362001)(110136002)(92566002)(19580405001)(118296001)(19580395003)(5008740100001)(189998001)(229853001)(2906002)(4326007)(47776003)(5004730100002)(66066001)(50466002)(8676002)(80792005)(5003940100001)(33646002)(81166006)(42186005)(48376002)(50226002)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR08MB0592; H:virtuozzo.com; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR08MB0592; 23:IkKiK1V/hHxm4ocxSOjmpFGBy4SRWmSz8wUqb1XIe?= =?us-ascii?Q?HhVGpwus1jn77kDWS9+rpN76o0NhCFJXxp2cqUBHRbl4aV/9QF4iRGEQqDld?= =?us-ascii?Q?+BmZUf77EVsaEXBKGTBseidE9GPhwVdo50A/qHpCue4Db9My5iqxfnYL9Dkd?= =?us-ascii?Q?cQjW0SEkBRgeZiEH2/pBKrBgp/pXiV7QPBLmAy5uQ8Y0rbrIg61zX4ncINyf?= =?us-ascii?Q?C8ccdB+QFNy3TDOlonMO5qxSMXIkBy0J9to8zt4s6hxPE6W+nYWooxcET3pz?= =?us-ascii?Q?BhgVNLXW5Jh2o6111wxl+RTnNICGfwVhJbCLbOPeKBdnU3MmOb37do2BIWAp?= =?us-ascii?Q?DQ4WUanS38NqReE0MhZgc+kok9cgnOeAczt8vAL4KvpS/AoXUnHdQpO/GfjQ?= =?us-ascii?Q?MfSlolIOpKVmtYNGTZ+WR51+RQ4qGae8piUFglghyMQwAjTkmvVDNx6Bd1Dw?= =?us-ascii?Q?YxAd2QyewDRYR/8j+kqezrA0cx6Hz1Ukof47SadNnkGs3q2TckpqZMR6NtW2?= =?us-ascii?Q?KZ+0fNMdOdukND70dh22hdKKGCikJFSFamfK5G/zRId9g8eZwsknvtCwz4cF?= =?us-ascii?Q?SpEUKaP5LCQBh+A+LEynqCvzJp8kwI8GTITaE4T1jCmoonTpEJo6le0v3eAl?= =?us-ascii?Q?xsHWH+3oDr+Dm3kf18mzzU014RZwiMF3eMnsavUJQgcC7EJDiDmLVLXrpSSy?= =?us-ascii?Q?C0xDuWKI1Fp2iYx5yfYM2EG2jV9UVIXq5TZtXipt9SLj5NDAmZKJ+ozatmOS?= =?us-ascii?Q?A5qCN/K0nByLl8oocj2cgBHUlPuJHwF64OghNUytL9C++ktChCa2+QRpdUSX?= =?us-ascii?Q?Ke5viWFDl86pNwQsMw7O/Kwg0DAjIBai0h3kUQEVxvi5Yn/RFBl4kyu2gzFQ?= =?us-ascii?Q?ASA0Tlan1lldkcS0eoZSte2R8c1s1bmkj0RmyuZfZC9tJM0z2lN795WyAUou?= =?us-ascii?Q?KpOp+ESO5KU5raa2h/6T718YuGlFJ4AniJosFFH6A=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0592; 5:v7qDA507mSgw3nG/U53xLKMniFOFHSSr+hopAX/BKdYV+N1gpc+0tufvkQHhj9dHaF082uciRQxc/5sROl/VTPN+8j1FAYfq7xRi+4gcqd7h66G6EzKXOqb2XoxHjDF78/Yat3s71tjPrQRN4uRQmw==; 24:rTVnOzSAG47MDWQ8C+zo9/6k3jGo9co16UGySfwfjtwODKKvcCnKyatL+ltD+yZpHPWLrWAToyQbP+2wVi4YTtcurCmrjg8T+WRYc76SGTQ=; 7:A02IXyO+Tpn3hwlWrnqX6Bh9xJUF2YPw3i+W+3ZU9bXB1aIeUKHiL6sTL2RST/DU36dxCIXUftMFjS0piKfiw33D3gKVNI6ZCqKuI3bhk+cW2rAkBunkSsaWXY0f+bC2K8kwehsUYie7wI7ITvsMa9CkVuF3PP2LgmTIWN2ElPIp/Yueaye2mHAfMNMUJ4/n; 20:ntiUPJZZEGI1Wqslg4yMcK6fmbgGjFF+kx/JHZ1yczLLGYUO+UbkmaYOi6DRwm29S+4W46Cw6PIsxHHnFDQYPBiNJZH9IHXBu/C2vLBN/CSFUFmrFZB7f0zPbFcmv9d/s2atvKo2xRDM5vHD/zNtQ7DoKvKAIr9vzgH4w9VdQsI= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 May 2016 08:49:43.2980 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB0592 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@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))) {