From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752589AbdBNSkv (ORCPT ); Tue, 14 Feb 2017 13:40:51 -0500 Received: from mail-eopbgr00136.outbound.protection.outlook.com ([40.107.0.136]:45034 "EHLO EUR02-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752482AbdBNSka (ORCPT ); Tue, 14 Feb 2017 13:40:30 -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 , Borislav Petkov , , , Cyrill Gorcunov Subject: [PATCHv5 2/5] x86/mm: add task_size parameter to mmap_base() Date: Tue, 14 Feb 2017 21:36:18 +0300 Message-ID: <20170214183621.2537-3-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 In-Reply-To: <20170214183621.2537-1-dsafonov@virtuozzo.com> References: <20170214183621.2537-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: DB6P191CA0023.EURP191.PROD.OUTLOOK.COM (10.175.236.161) To DB6PR0801MB1736.eurprd08.prod.outlook.com (10.169.227.7) X-MS-Office365-Filtering-Correlation-Id: 58e361ed-3eae-471b-378e-08d45508efde X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:DB6PR0801MB1736; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1736;3:4lrrSgoFsxyVUe8bq/6Zz13+eSbYW4LSEcs96Cek4EQJBbvTPmR3hs+UUp8W/N4Bt3IaxmTMO4n4DDLxztztlbxyPJqVLj45722/q0tRnJpb7iJz8ML2IQwr9cIIGo+rCQYgVxsLdV9oA9g6WkZQPxRdfoMn64TGK+uIR7ggXFQOjZfpzd3YLSFMLOfOT3dajPYQgyveHZaWCLmksFl1NfdktKZDTFvrUxUnARCtYkwWUyBZ/g4w5/TPro+whFHzCTgaCQpxp/UUw4t+q8Q1vQ==;25:o8YqiUgUyPyNSd28SKwcUs2/QUrC573wkZuw81m6y+w26xoWJP8s0yBpYDBdBC4b5gYm3BcLuTFqwRFSk56OluPfh2BgtJWDx9yYla0FNJdqFZ9iP3so1QqapMHa6fLssRauHsH6hIVCzliJT+HW9MreLcwAlfRXuwtBqitsdiTRF1Uno+NUf5GCZ0qnHqxpF7XiX5YZE9i+nC/869UzAQqmT3NkKAcn9ZMif+5Wa3cD7g1ZcpdQw5kULr6pESF7fch5g0bE0wL1S8OPDFpulFSkU0ghNRlmsBcNRJifcJ4Tw4xjMOFbSVRTJQrvQsa6pGLNffOlKUO3fvin0E5emSaZL9tUUw/tUDkDR6V7V2YxlGaLSO/sETFvs6ExnHb+4Oc1/7kkoV/rH8fCgR8HjH8mWmOfYi4oxDwEdwo8QCqzFM8elubPpdevGkH6HZuUSP1C+hmBYJ7fkmkhPzQVaQ== X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1736;31:kS5zflNouiVRBf6sahyM5Xl74Dk1EBSBxziJR0ehViKuSy9FA2RKv9wWqM++HNHsCqIfi+xB795fL0cfoI530N9f8iLMILHr0PBxcx2BRwvisFhHhJ1qSmZoiOUrVhvubNG6gy0LFunzDc2DMVOQz67gClpvXB3n+Qmim3CIUyir3U4LXOhmwBDCxnr7IjRPdaQYBXY84+bM7JfDojnDL+N2/8mP3QFmzI/ivjbgqnfaecDvzGb0oHksxctCGISG;20:Tfry1yj5JUq87hodYIJChgLc293j2ZqTOL7iefvPlG6KXJwhDnPCtSYdXEbHCI7+eVWYV7k4U/57p15rNMLd4lFgU/AG6FnQk7nWmwkIcEpMCuQ6YQKRlsFQ+vQQ4//eWdUjVARile+U9VpqWmpJym5qjJKLbHY294nmESv1HAHSSAzS0RFwaTj5qG0qLA+Yp+zb6ycN6mba2i2FM5wdspUYcNLK9P9Cv743Hfcg0DvTaaFZKBIIkQM89VFFR3XlxaLz6ddsW1IlFjXvV1vWLhSt95fYQTU1E/B+TcIrKDA1Zskit8rE4SVoRpTXJPojeGCtWWdVmEOvCSiv7FIBgrgIwIeD7J3rciMOid5pSBbX3peVi3rG17IVF7Q/aoyAhunXuiFY8++q6xtDlCIrLbVtlBr0gqm/kqqE2Bhc3Yc= 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)(20161123560025)(20161123555025)(20161123558025)(20161123562025)(20161123564025)(6072148);SRVR:DB6PR0801MB1736;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1736; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1736;4:WGXJ+LeJPy0GCemnSIFnsbsujStRBFcSX9kIvpqf/i8vVz4VEyHS2qJoHTOncSLhmDrnXseFNkgBzbk71lUDVL5WGz/uoEP7ZgKUP2BtwufeiRISt13lZ33moI8IlGOnBHnY26SB2IuSjHM52anIjZ27Vo1vko3aHlec8ogJmhOXNg9d+GaPOHcBuvUJx0GYaYmtVN+vxcIjkQA57ShYn1oYD//s3FioQbSbiUs0iCixzxGqrbUxJTIE+ctQeJZ9eXZ8DKvk4wATpg5TPud36e6UFHErQrvsIwhrkx0gRmBua0S833VKTmJCplmI5DQXWi9QmvKFHgrXRoSnekv3vNwyI5AhQHWU1wXZfpZBgvRcr0SxN+kF1EpFhNf26X1f6plUaiFTwoN+3Kz8X7vTne6nIm91bCMsl1GczWv43SqR+I633/4U3CcL9h8ugulwZvRleHcoEtQQ7Tqob8Mg9VXRbkSCHmvEmU1sidXfzku+eoT3G+yRX5a73BiikhqGcCVUDeKgVLBU9iZQ8sL/mWeALaalZ/Rf8u3EQ/z2ZRN6wVSoMcdPvkXAw8u1V8alm+bCwY/y99Clk7eNlfMtmqH0M/XxSvLUxdE7BjulXGQ= X-Forefront-PRVS: 0218A015FA X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(39450400003)(199003)(189002)(106356001)(110136004)(105586002)(42186005)(86362001)(38730400002)(107886003)(2351001)(97736004)(36756003)(25786008)(6486002)(6666003)(54906002)(2950100002)(6506006)(5003940100001)(5660300001)(92566002)(53416004)(6116002)(69596002)(6512007)(6916009)(68736007)(53936002)(575784001)(101416001)(66066001)(33646002)(7736002)(4326007)(189998001)(48376002)(305945005)(47776003)(50466002)(76176999)(2906002)(1076002)(3846002)(8676002)(50226002)(81156014)(81166006)(81003)(50986999);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0801MB1736;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0801MB1736;23:HruoSpcwj4IACtP8kGaLrTlTmfucyBHm4ESdqmf?= =?us-ascii?Q?+51zYftaXND7fOfIhuUaexY1JoQjs0tW62q7pV1rQz9tfO6jl+qSqLCt6oH6?= =?us-ascii?Q?XAbckSvP8DGn2qHau/7xwIs/u/LH54T+SNDY3oRzLCrho/KnjoasdhloJVAJ?= =?us-ascii?Q?eqt4vrFOPoRl7S5JObs82ZUS8/2kDOiksuvjCuN1+NqNpdqfaty74Hvm9y+M?= =?us-ascii?Q?2ww4ArCRvT2xs6qu7GeYHBDOTnjGENTjAs6iLiYa0zL40RyaGq3EIGaeyvTK?= =?us-ascii?Q?n3uuBoM5ISg1a4FYjgnwLvGd5J+AjqqjvX+19WIBTo8VDFAHXDgmzaNUUV0i?= =?us-ascii?Q?M5X7FFhVu7bZDy5j/ULevdN6qo36+7zgkcNt7FChct/bCzBWau2W9M0zMGPA?= =?us-ascii?Q?dXBF9ovSmG/fBaI4Vb6hNwt2asDUCozFur1lNvss7w7k8l4VQyW7mPxbozdl?= =?us-ascii?Q?HJMKLzl/GTyf8Wi9u7aZppk5t0WUm05DxvxXApktX6t8NNo8G/ghxw2qojb/?= =?us-ascii?Q?mBbelZXCzXiqRRZV2+5bgBiIASkDFWLyO57PRGkqEEGtIy/3FU5brimi6C9m?= =?us-ascii?Q?JnnT5+On2uqspWYqKRdUOeU0+LPsbtpjiKj/nXOZb/Orrkj4Gj9rlBcwCrF8?= =?us-ascii?Q?veTcBE0i3/08VBcOXbbRrgVXxKnRLSFWoI4Ev5g5Kk+uaCBNFOFrvWBOSdjU?= =?us-ascii?Q?zl7HKarLcMrBSrVxZ8zL5LQQdX0hS+jafyIhTN6KYjLstJ46Id1WzqSLMxu4?= =?us-ascii?Q?+Sv3xxS0y8eQd2qYVN0F65jnNeRIWA07Kd7eCoVDQYQrMoc3pcaaPQR8Vnpd?= =?us-ascii?Q?uhdGFJ1bN8hoU5jjSzTmEgreW/0HixXnz/XPQR8YYEY70XdatfMnZWLddJap?= =?us-ascii?Q?cXKfXcNpLQ6D8a5Rm9sYUGlUOB5Ph9Qa1+iTVkCFnxiOY9/e6A/mEkuUITtD?= =?us-ascii?Q?qtVBkdmfeBnO2Tv9KmKnDQPNFNo23OTfI793ShK2c8/siK+0dLhuM+DZcJlT?= =?us-ascii?Q?D2IS+pW1N+nmZ6wN3rKHq6CxAmgXROAilJmkOYOfPeto2MJHhGDLHV957A/X?= =?us-ascii?Q?+LtTfu2fDQB9tqUpsv/2q4j96uOR5l/hGddN4Ky6q5Me+cfO9gXnUJ731FDJ?= =?us-ascii?Q?imIlLkHF168DVDTQjuozrGScx0QAtYlL08+yACW2uxXkOjhdWwc5j6GLC4sx?= =?us-ascii?Q?WKv+mmIT8xatuRxIcVaeAn1bSAquFN7uW2sqLadwljUnByzRAPMPDgwZqnBL?= =?us-ascii?Q?mQKSV/UMLrLGhlNBXu0bV+5Ka1T62NQnxM8ai5YBE?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1736;6:0WLXgtdY+80gjDkY6K0/S25AnmdwrTZdVRvAd/nEBM7Vnbx62rrxOT2hJR22gL2xgv61iUtFdnVAy2fXI9+eumFAxvzJGlwFxIk9JXWIHrLzGAGNvddhnmeGAAnZZ6KRmjXeVEISTR2pXOPxVViN8ZT0zxhakNmjFqS/mQFr3tDhH3GI/3Xva4ms29JtE+OxEDG4UGwZbHY2KrFw1XkNHK3gdD1NAwd3iP6OisHoSW6gX2v8VouABLYFFRBPJtmDnpzRGDU7wBOMbUh0K4sIzOdAOYKkYFQwfbtEkdNH173eXdPtsXraXVVSM0h6r4lpqN2xl0SBlqYas5oonYARUGKn/HV1PceuHHZdB5OsEpGhFSEkTiKLZ9xeZndtEP6ObN0t3a0d6ZczMK5EmUWl5Q==;5:2Neb3Qi0epZQrXuWF1QHdLj9k5A7uPBxw5HgMp9gHmlHxp/WVyTJTJx52xirOTJk+kHjyNNfKGKGk6jLstILtSGrAnn+ME8oq2SjKgrjxPG3t4P1m03HuRMDPDaGf3szUWySZwn1lAgWNxKOxs4oSA==;24:ymx8Hd5cvq/qGE3jeM9RR/6XgxKzWA/MCa3h3zwWLXcXxZ3dZpuEmYqkTigxfSIAdf4Jg/hCGNsNsuAPnDUZHJzsnMwCNpr8qt+G6uvFjLQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1736;7:z81mogJvG9Vzc3zCivuF9ba7K4FpsecLTx0/vFSVwD1m8oTxDJ7iAzpqc/Qpyjjd8kywXA3Yabm82YPebXgrIXc6now/4YO9Rq0GFzTR8aVDPjj5gQEsEoXA5l+0FBuTj2aTRXrBFFi6macJrWGNPupz4nEAWpfn9NQrYHeaj4taOqEuZyro6aTcramu9vYAGZyCgOZp918Idlp5JYZPkB5WXI4e0fhDuNQ9/wd/T0ZbJIdI/Ch5+02acobauodLWDvvpPa1/l6/7vN/BNIxhlfKTf1Yan9Lnem69yJ5U7tF1GvArRpBsDWKoqxmb52TCNjnHVUMgM3tsWH9DtjBb+YoFfXIZA1RIXDfyO/nNvv0lxYU86na2/acg+nBrzf5mHcBsYP1IhZvWSXRVLBNEpMqSbPZABRoox6UO07WtRxjB2Ue8L3+QvkJ1uAgXtTK2DILDhYVtg758r28UfSByLe5zA93PArEBazpqZXdBMSrhhXhz9/O2fup4u4yELJfau1GmRok9+C1MzZHcgpbCA==;20:1DyQ8sXZNfjnlqVPykdYnUU1yWAOZmrS4HU/8iwDpjF/VhvZUOIkIjS0nE62uMN4oL9Pkw7jC/zHBNTFu8B2zjwHcxqw8w5X9COH6VQAW9E3V3hbBknIqcENPUKbVR/eQ8Uaw2ktsiHmKtvx3mPdV1QWJiP4563+WP+uqRFMQ38= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Feb 2017 18:40:22.9832 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1736 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org To correctly handle 32-bit and 64-bit mmap() syscalls, we need different mmap bases to start allocation from. So, introduce mmap_legacy_base() helper and change mmap_base() to return base address according to specified task size. It'll prepare the mmap base computing code for splitting mmap_base on two bases: for 64-bit syscall and for 32-bit syscalls. Signed-off-by: Dmitry Safonov --- arch/x86/include/asm/elf.h | 24 ++++++++++--------- arch/x86/include/asm/processor.h | 4 +++- arch/x86/mm/mmap.c | 50 +++++++++++++++++++++++++--------------- 3 files changed, 48 insertions(+), 30 deletions(-) diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index e7f155c3045e..8aedc2a4d48c 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h @@ -284,8 +284,19 @@ do { \ } \ } while (0) +/* + * True on X86_32 or when emulating IA32 on X86_64 + */ +static inline int mmap_is_ia32(void) +{ + return IS_ENABLED(CONFIG_X86_32) || + (IS_ENABLED(CONFIG_COMPAT) && + test_thread_flag(TIF_ADDR32)); +} + #ifdef CONFIG_X86_32 +#define __STACK_RND_MASK(is32bit) (0x7ff) #define STACK_RND_MASK (0x7ff) #define ARCH_DLINFO ARCH_DLINFO_IA32 @@ -295,7 +306,8 @@ do { \ #else /* CONFIG_X86_32 */ /* 1GB for 64bit, 8MB for 32bit */ -#define STACK_RND_MASK (test_thread_flag(TIF_ADDR32) ? 0x7ff : 0x3fffff) +#define __STACK_RND_MASK(is32bit) ((is32bit) ? 0x7ff : 0x3fffff) +#define STACK_RND_MASK __STACK_RND_MASK(mmap_is_ia32()) #define ARCH_DLINFO \ do { \ @@ -339,16 +351,6 @@ extern int compat_arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp); #define compat_arch_setup_additional_pages compat_arch_setup_additional_pages -/* - * True on X86_32 or when emulating IA32 on X86_64 - */ -static inline int mmap_is_ia32(void) -{ - return IS_ENABLED(CONFIG_X86_32) || - (IS_ENABLED(CONFIG_COMPAT) && - test_thread_flag(TIF_ADDR32)); -} - /* Do not change the values. See get_align_mask() */ enum align_flags { ALIGN_VA_32 = BIT(0), diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index e6cfe7ba2d65..491f5a05a133 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -787,6 +787,7 @@ static inline void spin_lock_prefetch(const void *x) /* * User space process size: 3GB (default). */ +#define IA32_PAGE_OFFSET PAGE_OFFSET #define TASK_SIZE PAGE_OFFSET #define TASK_SIZE_MAX TASK_SIZE #define STACK_TOP TASK_SIZE @@ -863,7 +864,8 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_ip, * This decides where the kernel will search for a free chunk of vm * space during mmap's. */ -#define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) +#define __TASK_UNMAPPED_BASE(task_size) (PAGE_ALIGN(task_size / 3)) +#define TASK_UNMAPPED_BASE __TASK_UNMAPPED_BASE(TASK_SIZE) #define KSTK_EIP(task) (task_pt_regs(task)->ip) diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c index 9f3ac019e51c..88ef0c1b0e51 100644 --- a/arch/x86/mm/mmap.c +++ b/arch/x86/mm/mmap.c @@ -35,25 +35,23 @@ struct va_alignment __read_mostly va_align = { .flags = -1, }; -static unsigned long stack_maxrandom_size(void) +static inline unsigned long tasksize_32bit(void) +{ + return IA32_PAGE_OFFSET; +} + +static unsigned long stack_maxrandom_size(unsigned long task_size) { unsigned long max = 0; if ((current->flags & PF_RANDOMIZE) && !(current->personality & ADDR_NO_RANDOMIZE)) { - max = ((-1UL) & STACK_RND_MASK) << PAGE_SHIFT; + max = (-1UL) & __STACK_RND_MASK(task_size == tasksize_32bit()); + max <<= PAGE_SHIFT; } return max; } -/* - * Top of mmap area (just below the process stack). - * - * Leave an at least ~128 MB hole with possible stack randomization. - */ -#define MIN_GAP (128*1024*1024UL + stack_maxrandom_size()) -#define MAX_GAP (TASK_SIZE/6*5) - #ifdef CONFIG_64BIT # define mmap32_rnd_bits mmap_rnd_compat_bits # define mmap64_rnd_bits mmap_rnd_bits @@ -62,6 +60,8 @@ static unsigned long stack_maxrandom_size(void) # define mmap64_rnd_bits mmap_rnd_bits #endif +#define SIZE_128M (128 * 1024 * 1024UL) + static int mmap_is_legacy(void) { if (current->personality & ADDR_COMPAT_LAYOUT) @@ -83,16 +83,30 @@ unsigned long arch_mmap_rnd(void) return arch_rnd(mmap_is_ia32() ? mmap32_rnd_bits : mmap64_rnd_bits); } -static unsigned long mmap_base(unsigned long rnd) +static unsigned long mmap_base(unsigned long rnd, unsigned long task_size) { unsigned long gap = rlimit(RLIMIT_STACK); + unsigned long gap_min, gap_max; + + /* + * Top of mmap area (just below the process stack). + * Leave an at least ~128 MB hole with possible stack randomization. + */ + gap_min = SIZE_128M + stack_maxrandom_size(task_size); + gap_max = (task_size / 6) * 5; - if (gap < MIN_GAP) - gap = MIN_GAP; - else if (gap > MAX_GAP) - gap = MAX_GAP; + if (gap < gap_min) + gap = gap_min; + else if (gap > gap_max) + gap = gap_max; - return PAGE_ALIGN(TASK_SIZE - gap - rnd); + return PAGE_ALIGN(task_size - gap - rnd); +} + +static unsigned long mmap_legacy_base(unsigned long rnd, + unsigned long task_size) +{ + return __TASK_UNMAPPED_BASE(task_size) + rnd; } /* @@ -106,13 +120,13 @@ void arch_pick_mmap_layout(struct mm_struct *mm) if (current->flags & PF_RANDOMIZE) random_factor = arch_mmap_rnd(); - mm->mmap_legacy_base = TASK_UNMAPPED_BASE + random_factor; + mm->mmap_legacy_base = mmap_legacy_base(random_factor, TASK_SIZE); if (mmap_is_legacy()) { mm->mmap_base = mm->mmap_legacy_base; mm->get_unmapped_area = arch_get_unmapped_area; } else { - mm->mmap_base = mmap_base(random_factor); + mm->mmap_base = mmap_base(random_factor, TASK_SIZE); mm->get_unmapped_area = arch_get_unmapped_area_topdown; } } -- 2.11.1