Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754444AbcL3Xdz (ORCPT ); Fri, 30 Dec 2016 18:33:55 -0500 Received: from mail-db5eur01on0113.outbound.protection.outlook.com ([104.47.2.113]:24980 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754025AbcL3Xdx (ORCPT ); Fri, 30 Dec 2016 18:33:53 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=dsafonov@virtuozzo.com; From: Dmitry Safonov To: CC: <0x7f454c46@gmail.com>, Dmitry Safonov , "Thomas Gleixner" , Ingo Molnar , "H. Peter Anvin" , Andy Lutomirski , "Kirill A. Shutemov" , Subject: [RFC 3/4] x86/mm: define TASK_SIZE as current->mm->task_size Date: Fri, 30 Dec 2016 18:56:33 +0300 Message-ID: <20161230155634.8692-4-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20161230155634.8692-1-dsafonov@virtuozzo.com> References: <20161230155634.8692-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: VI1PR09CA0080.eurprd09.prod.outlook.com (10.174.49.152) To HE1PR0801MB1740.eurprd08.prod.outlook.com (10.168.150.7) X-MS-Office365-Filtering-Correlation-Id: ba757b70-5f43-4008-371b-08d430ccf32a X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:HE1PR0801MB1740; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1740;3:BMh/duw4RSGmg+dB+pm9iK8nS3Zgy4pDx4N9TPHA8hWS+Aaji2GXbouVFwDwgP8PHFXxgCghv0L9EIZGVKT4mZNb3DsPC6e1XGMF/aauDaljTLzKnIuKXyZ/kISeZ9o3MXz10KVxZ7TJdlnL4ceODMewXC15ctGB86iiHB4sDPMvh0EQDVrSriuUrPYkiVA9nzBLLSaKs8NJelB0i456+VtXqyrlV1L4Vh+JTQc2D4tsZVmhH21cyrUGBJaeWxh0TCo8PhphAy5sEUX8gb5gvQ==;25:qDl2agqP243360xwE9jcg7XcmmXBKwcKkemZsjmg7GBMUuMWrg4KppxKstCARirih7ljwtBtzNnMIR2jC8l/C5zMwsSFpnecmhFfGLhkaassUnEao+lslcjj2jsY/idJ6d2rBiH5vRKxSzpBYU+17sCBVIhpdDoHl2mU2PKxB20CB6UvVCkHQ0YHtWOmhkCRtpfBYWt/HV3RhuenTOVhPIwH+/ub26KhOngocB4mW2je1s8bF7zUlvhC8SxXVATMYMZRL0SRzhhfGa1Up5x9FQmvflzljj4tJ3C+EFoCM2owndE+zjuhhIUuS/OyE5pEtGqnvEIzxyuFPDuF26rQdbHdDgMqzWlbzhvZVHST9XjSNRxSm0GM6qebFO8EmzIA1Nvgip7zsXqUURKxpcQfIWC7kCE7+d8J4jyEL+2xL3xvpbyqPYSFZGu3sMO1KGP3rKp6eJ5RdEK+Z3ia8omU2A== X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1740;31:gAp0PIgyxGqpbK5BXmya6MV/enTu7RkEOlXRi841DEcDCFMyFQFCLZ9zJliiShUjFZVrG68hjcYvu8OFke0V5ugBV+exFFJsFnj2c+DkV2ugmnhKI4mYkopni78IChLn696o8CAmxWH/IYE3Hop+rk+PgKr+1cF6vjGbxXzDJG8eTGoTYfTcWWdq8f47sHVbi/Ybw06LD2qNsDad7E87IoYVH+d5QcKVK57NUn99/+h92P3tg8p8vy8VfGUpKfLAz7uyK2g5Es4uaxMpIuLO2Q==;20:qXjfJJl9Q75Evrr8/2I2MmBfJZi1bq5GyyEnuZzq4b6TaDpP3R5HM2gSrQl8+aqLSjeWH0fG7Jo1tgEXKe8yuY9b+Y5fR8+WirhpupMXAFSyGKjOYn6v/yR8R5fnHeKBXRffEA/zAFjM7EXCuIs1fWqCBDlTrFQvjJCOZvlYYEk5RpExMuHaaYq9tmvGWopXUOCnxuzSfEyjRgUS1wGJutp2dZH0ghwm1TgBXcqIypjDoxj4E/fNWlWlLJ0/aM5z X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6041248)(20161123555025)(20161123560025)(20161123558021)(20161123564025)(20161123562025)(6072148);SRVR:HE1PR0801MB1740;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1740; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1740;4:bS4SgM927TZqCpx2HJ7xzPj0HYcSxyAMPhX6kDiXQ/k7qVYn9RWZexWv4SVLDlYQdB1zegq5Uq2qGve+8AAfuR3EZzbIrUmzh3wjWPT41RFRYpxlDeNKbLCad/jRTahYyPE/HTqIb4hMH4ubA3llJjI20rm5hz4bHj6gqUGKtkgDN4PGD7OmLLTxcRMj/nioc5F45HKq76C1CgQcCUG9JjijRJr7bENcFhwFNDp7Z/tO0qyI+lSMsJCNJ8priWnD8UN60uQVe4N9pe9JSWXNvV8oUAss3xjP2yOixGLzWPDi02l+wjD83uok3CcHDYJtI6SIpzJCRozorIJvRNjQz1amxV4IkUdIrspN0UzLvsdX3aa8fPN2IAghKqCxCUau+DtdJLwtr4BKiyENa5a1dio9E9uD+iA+qgj5WQM9xixBTypRJIy2QZq17MI6noP+MIcaTi/SeAaYBQhPkGZrownyI4Goko78HxV+NwzBnZe5S8looI3ehxMWV5LPZq6oFO2aaDzLP13AEDQq8adTvk02pPB2zNYkbBb3WNnHg0SMeyeeiIVWt62y+vi3CsLta0DB4L1/BjP75W3iw3uY1+6hIsaRZSQXKTy83JJG+K0= X-Forefront-PRVS: 0172F0EF77 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(39450400003)(199003)(189002)(36756003)(81156014)(50226002)(2950100002)(6666003)(6916009)(110136003)(5003940100001)(69596002)(66066001)(6512006)(81166006)(101416001)(68736007)(8676002)(47776003)(25786008)(76176999)(86362001)(50986999)(106356001)(33646002)(92566002)(6486002)(5660300001)(2351001)(189998001)(53416004)(38730400001)(42186005)(105586002)(305945005)(1076002)(6116002)(97736004)(3846002)(39060400001)(2906002)(48376002)(7736002)(50466002)(4326007)(6506006);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB1740;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;HE1PR0801MB1740;23:I1kSe4RAvKZEKSk3vLfCELIZkF2QEhcbB6SMy5w?= =?us-ascii?Q?WJqG+q/tzSaQVkE5NVDNxz1W8Nm0J5/flIB09fDoaL/Pxj4yUN+2O+CPFy9N?= =?us-ascii?Q?rNEWzpMfj6RqQI4NZ3dggnHFvX2IldFOGvjK8UPq0AcSCtpjMxQUSGzXt6s0?= =?us-ascii?Q?197alHXppR/ARKNCukJFTepgaECItEamW06eCE8i43qErr33TxDvh8aoa8TF?= =?us-ascii?Q?mW76+UDJHEfPgWeArr4T867Wctzla/XXcrowK/g7kEC3fsFYjvUu8PGhFQFB?= =?us-ascii?Q?W+uZ9xsU1e+zANAVc6I82PZe78DWxwE2iuDW+X7GqOuHTU61lmCTWIYQ58Dc?= =?us-ascii?Q?ZGBxnsyCgIbSS68Kl/ID3Jvevt7/85Ac3Wxja1xojqnMn2AktzRjsTUFVHfK?= =?us-ascii?Q?Xl7oH8Z6ti95IlX+eYEYepA6lN6hkL6KMRH7E2oXFm+EIX4s9Kruwjof146J?= =?us-ascii?Q?8u9Zoa5STFiMjUupQ3MIP/4cwrt9gHf/GrzCoZ4uP0Hhy4ymsiKlnBuBHYgO?= =?us-ascii?Q?CEnj6mYJ2sscTKzg2wvJ0pgnytKrNTJcp+RIMuwIBDpoEVTGfnmPy68XAYe0?= =?us-ascii?Q?IbGy0THYQU9v5RbXaKswAJlngC693NgOePzQdu/9FN++x+Ok6ddvZ8mbFWGR?= =?us-ascii?Q?1yQrog3W8ZGigm26Dtl1WzyLLIfeXM7ve202mURmlHno5UuM38kaMsKQ1hkl?= =?us-ascii?Q?h9jpcwWy7lq51aq4qIqogAR31aevDlkc7r89IpJ8Cq+jIofqTeq46Khr2kEw?= =?us-ascii?Q?fGlwhr+PbWZW4vjMFUJpZm14K2/6sH7IaQhoy5xTJ2HmpWc9pm8hz+f8C39q?= =?us-ascii?Q?hkzNxvWZJGg8t3YF1PPafhNtIZhLF5GirZHk6/e5WyYmPB+/oJrlzsEObwHR?= =?us-ascii?Q?DwujOMcJMT2eXidVha+d0h37sK2UfOqfvfOdv0JRBUqgu7FN+ebwwzuudczd?= =?us-ascii?Q?lw0GOiJp2cHbMDvDTGtO1aIIS5XoWFAO6TqDj+TKjq/6gZvxG1UVJrMBE10a?= =?us-ascii?Q?9ZZHxwBuIzwARWA+uZXSSE2KPlyBs3u4u34OTS/Xq4f57+xQGJBvrbrcxrpi?= =?us-ascii?Q?Xt2nXniVEOW/+xfVcEPdj2veltpA5sdBAskRxWa2a6PXLtwsQuLFPMOngCcA?= =?us-ascii?Q?mtmvTMqqJUat0bbjQO1WnAQoAoQTo7SVWcjDi9K+fOekn84mXGln1BnEtZJg?= =?us-ascii?Q?rU4kg6Mw5hRlmRiI=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1740;6:/Vh8t0jsSjvvZw/QdSQfWfl6es80tIOc8vKUsZI8hsdSZ/j4ZQWbLDr1xUufKD/eWxNvhxa7SiE7Tsu7X8hrifKmlDsy7K7xvLeh/kr3IUx5GKvt2d4ks22gbimTDHP2zajpLvEVmqJKKJOQOPKRXtH9RVbnMOmntK/BI9nK+ucIfCaYH0AUHXslShGilajG+tDqM42aye3b/QPZqPpDhxK5nzOPy7GlcBwqOm/q2lnL9Ou+Rbslm13rd882WzXYZRqFALcRLMCcNz45BsJRjD77yDvMjXb8j5JQ1xf1sPrbH9jWsmltxxiQVAVdkqHisW1a7+UCWkvtbAe/+AlN0UZD6JaKEktplNXDd3pIRin/4IVL9QKlslzSyjtKCt5SamYvhCzl5EcMpe0UFGOKGsKKXSr7Yu4i++iZXWSmCeE=;5:ByslDUzyGpopXhiVY5wZ9U6VKt4vSlBjIpov9gjztahPx9zZvBXn/WJdrkkBzFyw1Jb1eeEnyIeRn6Prsv+011JHM8WS9RQqKop9O5CaMCNakQsxngnDpRh/H664BGcrG0WkC5WLOF3kIHphrQQrDg==;24:I6UynP3osBYlFonN7uqTQcOYCxq4CcxRH6AQUTQFbJ5yzYBhSCBwfv+EmqxxyqgK0JWXx89GOMBZyc9qUGz6VBniGM04EaYFAC3AWgpaxcE= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1740;7:J5q/3DpnsMIEmuxBrADdRhtqtPawNvFZVz4DOdnMyQG23mNLj3LcWZQoBwVFpIffj4Z9e9JnCy7V6D+jfvUg3nKveJIE99Cl99QZNeAh9lPEOmcyqHk58sgO831uP0xbf1MyQ0zOCZ3P88+qi3RfTN85qcCjW7++aFEO0fhvP+ZuUL/3IxAH9c5bjj1XIPZeKfCWQZsD9ryqPC7ILjWIKqHVVP+XjeiVEHVcVhCdesvQCokvCiaoPHvBrDODcRUviFhaAKtjPgodkQUd/fMOEMe7YiTKcqhAPJI61ZaNpsVi9xQFFUd4BH3Oh0nkOLItt4Lh8S83uSUHpAmEtGhfbDByG8fHpjffbkCCeda1wYHex9u8UoMoBgmC0ha8+fn+ovV/jCiJt5YFeg0Hqi9+d0EYwLvBvVMJVW0/EmUM/HeP0Q06/bv18OnuTZQdBmcqmjKQC6OfxXlssTLe5M99Qg==;20:DoB3OGFOLPQjpahp15yNS/FAHEnaVN5fbxc6fpBlVvKr+sHGMesop0NkclJgU8DkQJ1jt8BfNconNSXKJa0iRDQdGA//lZO5LxiG+OTrVc0IHJ0/sCssQykAJl384KwptOsgX4Mu4oXDfG+AjUCncPosq7rn0dwDbAfHp+BriNY= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Dec 2016 16:00:16.6935 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1740 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5161 Lines: 141 Keep task's virtual address space size as mm_struct field which exists for a long time - it's initialized in setup_new_exec() depending on the new task's personality. This way TASK_SIZE will always be the same as current->mm->task_size. Previously, there could be an issue about different values of TASK_SIZE and current->mm->task_size: e.g, a 32-bit process can unset ADDR_LIMIT_3GB personality (with personality syscall) and so TASK_SIZE will be 4Gb, which is larger than mm->task_size = 3Gb. As TASK_SIZE *and* current->mm->task_size are used both in code frequently, this difference creates a subtle situations, for example: one can mmap addresses > 3Gb, but they will be hidden in /proc/pid/pagemap as it checks mm->task_size. I've moved initialization of mm->task_size earlier in setup_new_exec() as arch_pick_mmap_layout() initializes mmap_legacy_base with TASK_UNMAPPED_BASE, which depends on TASK_SIZE. Signed-off-by: Dmitry Safonov --- arch/x86/include/asm/processor.h | 17 +++++++++-------- arch/x86/um/asm/segment.h | 2 +- arch/x86/xen/mmu.c | 4 ++-- fs/exec.c | 17 +++++++++++------ 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index dbc7dec5fa84..47ebde614f06 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -768,10 +768,8 @@ static inline void spin_lock_prefetch(const void *x) /* * User space process size: 3GB (default). */ -#define TASK_SIZE PAGE_OFFSET -#define TASK_SIZE_MAX TASK_SIZE -#define STACK_TOP TASK_SIZE -#define STACK_TOP_MAX STACK_TOP +#define TASK_SIZE_MAX PAGE_OFFSET +#define INIT_TASK_SIZE TASK_SIZE_MAX #define INIT_THREAD { \ .sp0 = TOP_OF_INIT_STACK, \ @@ -817,12 +815,9 @@ static inline void spin_lock_prefetch(const void *x) #define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? \ 0xc0000000 : 0xFFFFe000) -#define TASK_SIZE (current->personality & ADDR_LIMIT_32BIT ? \ +#define INIT_TASK_SIZE (current->personality & ADDR_LIMIT_32BIT ? \ IA32_PAGE_OFFSET : TASK_SIZE_MAX) -#define STACK_TOP TASK_SIZE -#define STACK_TOP_MAX TASK_SIZE_MAX - #define INIT_THREAD { \ .sp0 = TOP_OF_INIT_STACK, \ .addr_limit = KERNEL_DS, \ @@ -833,6 +828,12 @@ extern unsigned long KSTK_ESP(struct task_struct *task); #endif /* CONFIG_X86_64 */ +#define TASK_SIZE \ + ((current->mm) ? current->mm->task_size : TASK_SIZE_MAX) + +#define STACK_TOP TASK_SIZE +#define STACK_TOP_MAX TASK_SIZE_MAX + extern unsigned long thread_saved_pc(struct task_struct *tsk); extern void start_thread(struct pt_regs *regs, unsigned long new_ip, diff --git a/arch/x86/um/asm/segment.h b/arch/x86/um/asm/segment.h index 41dd5e1f3cd7..3a9aa9f050df 100644 --- a/arch/x86/um/asm/segment.h +++ b/arch/x86/um/asm/segment.h @@ -13,6 +13,6 @@ typedef struct { #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) #define KERNEL_DS MAKE_MM_SEG(~0UL) -#define USER_DS MAKE_MM_SEG(TASK_SIZE) +#define USER_DS MAKE_MM_SEG(TASK_SIZE_MAX) #endif diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 7d5afdb417cc..264ca3b7be58 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c @@ -830,7 +830,7 @@ static void __xen_pgd_pin(struct mm_struct *mm, pgd_t *pgd) #else /* CONFIG_X86_32 */ #ifdef CONFIG_X86_PAE /* Need to make sure unshared kernel PMD is pinnable */ - xen_pin_page(mm, pgd_page(pgd[pgd_index(TASK_SIZE)]), + xen_pin_page(mm, pgd_page(pgd[pgd_index(TASK_SIZE_MAX)]), PT_PMD); #endif xen_do_pin(MMUEXT_PIN_L3_TABLE, PFN_DOWN(__pa(pgd))); @@ -949,7 +949,7 @@ static void __xen_pgd_unpin(struct mm_struct *mm, pgd_t *pgd) #ifdef CONFIG_X86_PAE /* Need to make sure unshared kernel PMD is unpinned */ - xen_unpin_page(mm, pgd_page(pgd[pgd_index(TASK_SIZE)]), + xen_unpin_page(mm, pgd_page(pgd[pgd_index(TASK_SIZE_MAX)]), PT_PMD); #endif diff --git a/fs/exec.c b/fs/exec.c index e57946610733..826b73600fc2 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1303,8 +1303,19 @@ void would_dump(struct linux_binprm *bprm, struct file *file) } EXPORT_SYMBOL(would_dump); +#ifndef INIT_TASK_SIZE +#define INIT_TASK_SIZE TASK_SIZE +#endif + void setup_new_exec(struct linux_binprm * bprm) { + + /* Set the new mm task size. We have to do that late because it may + * depend on TIF_32BIT which is only updated in flush_thread() on + * some architectures like powerpc + */ + current->mm->task_size = INIT_TASK_SIZE; + arch_pick_mmap_layout(current->mm); /* This is the point of no return */ @@ -1318,12 +1329,6 @@ void setup_new_exec(struct linux_binprm * bprm) perf_event_exec(); __set_task_comm(current, kbasename(bprm->filename), true); - /* Set the new mm task size. We have to do that late because it may - * depend on TIF_32BIT which is only updated in flush_thread() on - * some architectures like powerpc - */ - current->mm->task_size = TASK_SIZE; - /* install the new credentials */ if (!uid_eq(bprm->cred->uid, current_euid()) || !gid_eq(bprm->cred->gid, current_egid())) { -- 2.11.0