From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753418AbdA3MFc (ORCPT ); Mon, 30 Jan 2017 07:05:32 -0500 Received: from mail-eopbgr40112.outbound.protection.outlook.com ([40.107.4.112]:47211 "EHLO EUR03-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753364AbdA3MFF (ORCPT ); Mon, 30 Jan 2017 07:05:05 -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 , , Subject: [PATCHv4 2/5] x86/mm: introduce mmap{,_legacy}_base Date: Mon, 30 Jan 2017 15:04:29 +0300 Message-ID: <20170130120432.6716-3-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170130120432.6716-1-dsafonov@virtuozzo.com> References: <20170130120432.6716-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: VI1P194CA0011.EURP194.PROD.OUTLOOK.COM (10.175.178.21) To HE1PR0801MB1740.eurprd08.prod.outlook.com (10.168.150.7) X-MS-Office365-Filtering-Correlation-Id: 9078a87a-56e6-4238-06ee-08d449083295 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:HE1PR0801MB1740; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1740;3:izwmE/4nHNNHXELgIM8O2DVNWDUjSvXMbhRE54E+KWns6cxt6BC4GO89E0QLesk4b5vQho8naA6PlmfzWd5s0ldArFsK0mcbZIYijMqJtbdjgd/8yRJklE6Y5xpJnJSs+YJEI4EA1MuWANO9yBM69YzeI5lnxbU+p4dldXwEGR/RNKTnh0CQSVviliAmjRuSWvdt5yE3dy0qTDQOEltZ+f6DvOzmG0mlWx6goUSTvlrHWOfHJwxZ5OacFPGVw6mVjIlc1VW3ifSWcZcVGSfcTQ== X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1740;25:87rrzQ79tfKVcTheJNalOzPu8XLXu/M0EsyDU5VQbZCewAbTvqMRUMISzBHk0d4l9s8mS7KbpTrdxYaXfiYVe1lOORdCaIwBTMCLVwg7JakmtLaS3Mmo1F8VPVV8rdjxUlx8Mty+xpba+OFwgLm77wxm/K4oe2K2yr6PmOWPVTrB6xLg60qai6EhT15x5uI1O+8Ux+M791KBVRJhvbUA1dxmwzy+IEZB/FOrs6YsqKw+vZ4dUmMIIvoayLCc6MjR430UXLNWXUpj+/rpK66h3ss3X/fj8xP5HIpsR2L3/taEIuN4MdERVv0RKkERqfaBpn8vnLiy6jl/INmdLxz6mJx8Z/GwtR+y7ozEDgtWbXMcg+eQVqEzbgD1/7wpYtvWXOO5mgdnZGHgrv9cpsNqiKVNVXEzar6mr2QO2yHc7SONQp9Eaym8QsLpmxFNMOuAE9JqrPk5BzHDpdXrXmvviARX5B4qHh2KCGmrVUQaUobvkfpJpZxhbkKwETN5fDidYsfEDX+t/uwsF+pwmXnT+a5/yMCZjBK9r48oJlpFbQpd+qVk1BTOQttNgA+BGDAXxXV085CMfHKoqRWxPMVOpWbEffsDj456SLA+Dn2UBEz3PXOjA/bEN4PrBapdmLLLfQMjutA1gIimkXUYoCmnKJ4+jNQopujWpk+sS9wGLytpHDel8+1pfOsRSymZEmBy4oDPrnsnrwcPn9FuHItyaA== X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1740;31:o+lE6wV/zsWR2zYuSJElIZiBK6teuKkVo4H7PPiLQo/iwOuu5KQU+0SX/Xe6BVAPUoLDyPpozQk6xxi8bIT1j0UO1Fsu2Cd68hCPTOvhgEv4+3clceTzYS2T099fAaWA+tNTXwoNPq26Jpoqk1WeW2X7dfZ7XJHpaLtbvdgB6s/1rHpiWlFsBfPWWmh+uNKyG4LPIqI4n//68J32M4nrlMRS4pTkWMuHc13Pqd8HNZVhFt+bA0necBZon9TgUiv77G1RhSGu5/vRkSMtsTpX/Q==;20:WlVCD+XhL+GjTqKAnV9zMyzprg8VDKjZyNX2b7fv5UFhUq/iFSMOlfXuiYzvbOnLmS6L5br6anLrIx7azpvo6qKtz6UsfZc5+wROblFO75RvS8nRD2ocUTYqzkHq7Nq36mS4SBIKJwKFGkirt8cEn5Z2PhaqM4hXEShRZw4WYfXAgkD8exiJUComCEuvblF+vUKuBcXS3GyDry1VfLHPYkeAuVTK9BegNCswKEGcD94zjqIMzoBP1LYsl7Mishhm X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6041248)(20161123564025)(20161123555025)(20161123562025)(20161123560025)(20161123558021)(6072148);SRVR:HE1PR0801MB1740;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1740; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1740;4:ma1hR/k93lLiIU7u3V7lNi3N8fnWtz6dh95dlgoKaNA5ecJ8Cs74fG2m9Jui9pbMNVcHgrCLOjoVBBaXi2ndko2/wdjlybmd7xs1/pW2GR7E7tuOvXur7gl/Q3r1p1UiCilHcA+t9601K7fM6VEalwVMk4KvIt0fMu0IZw2XAIqmkbnG17CHXVS83GZNa0gdz5Gvw4SQuZW5QmNJr6HuRURIlXk8/OCx/WsQhUwqiiMz1wBIR8o4UQUqRM6syR3xo4AZ8a+6kyuevfxuaW3Aswgfs3ektbIW/Nf95sJxqY5UuX0lwNqbpnSHejSLw2BY6tE6T7M0T03Xny3340fCuvGtt/XVb901wJkloAH4orBCJFd8n7Q4tPfhYwD8fyZjgVxu4Mz6jeZZxko9YNwAipSjYdgs9nuH9tzw+cTfXG2i79spfR0XI1fCEqPQ3A7vCTMATto678wkXKl+BPXxFGhisbGvjF3m+RVGg+QEmSqyywPadZMGFfva4wRDjcGRsogF6RLGbKY3r5VhhQPtY+JkvXbB/immVaRH3beQSDXb1zkIm00uXBbdYP3ii6ypvgZIRu8dyoVqmMqXaLB1cV3gCsMWdMMa+V0AAVkvMCg= X-Forefront-PRVS: 0203C93D51 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(39450400003)(199003)(189002)(7736002)(92566002)(189998001)(110136003)(53936002)(33646002)(4326007)(39060400001)(1076002)(53416004)(38730400001)(68736007)(97736004)(5003940100001)(6486002)(8676002)(305945005)(2906002)(6666003)(105586002)(50466002)(6506006)(6916009)(2950100002)(48376002)(106356001)(69596002)(86362001)(50986999)(47776003)(54906002)(6512007)(36756003)(76176999)(66066001)(2351001)(42186005)(81166006)(3846002)(6116002)(81156014)(25786008)(50226002)(101416001)(5660300001);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:Z2W36H3moBoGcCeUqtU835jzo4GGX9JkvMv16XK?= =?us-ascii?Q?XvFWNM12xlReIqFI9oBBpzEqBmio4l1xPhBnrNcrna32gUip+vnVTXdqvdgE?= =?us-ascii?Q?1VeV7p2T2q7anKpDTPnuh1PAOVQk6OxcS0JPgUaPEiC7Zo+MQJygZMvScnCw?= =?us-ascii?Q?pVZorOidgm10JoYSkNuuNJ8JiMAAicceSIw7BYpB5w4WLGRdT8FgyIolooaS?= =?us-ascii?Q?s48doeBQ81Z3HeO1gqsNo3akb6OWiNIiCfKyIWVnH6umrUK6ReR9BgZr2eAM?= =?us-ascii?Q?IbqQYVf9km8lZv0abWeRjatGa5GaNSvs3FjESqoTVJ1NWitrzR1uTVrqlpq9?= =?us-ascii?Q?ilv/tknQ9S+Un5tfDXgnmYCBMet1IreW2Mer6uUVoR3j/nTT/dw2yA6BM5tQ?= =?us-ascii?Q?m6SZjQuhKXtkYBo3wccNht/l8r59KI/DQNQB4uNMKbRua7QNJRCI6YuDMBFB?= =?us-ascii?Q?ZKzbJZUQ1CuAs/5YE/HVk+xujoUveiNwuX15nr14/Riwgj/QoFUzurHxHZBH?= =?us-ascii?Q?HS8a+wWDRD3rhYAsoox5VruI20gC2pjfYHy3BurucDb/Cw8k3wF1D4D253wL?= =?us-ascii?Q?n32I0XivqHeuBSVMmMqU5pHZPW7fTPiAhMUtF/00Qn9gTpjOlubAYoF1VTIX?= =?us-ascii?Q?DgAbWWmS4afANVOKeFm+CbSbBcO6tBrDbuS95ITLNZ0+XH1mwI5durXKEXy/?= =?us-ascii?Q?+zDiQEhQr+EJmjKY2tiYPZCz/TbtTg/P4UpKgUnB+aj8om2cifjp10bbe93W?= =?us-ascii?Q?+5L961d4xhvHxP/15H4EzHTe4mU71zVLXoKRSbugHF04hpeDVlggrWRJTw7c?= =?us-ascii?Q?/IJPldYmUg5JZMVYf13ZDgvfhcUPTLL/XPfNLAO8zS5AuBZxNDB6bLSJtmc/?= =?us-ascii?Q?+kXk5wisZU2wM6msRFSrAALZa6t1d33jRHs/bX1eZ7hxq9eGPMInufJhDJX2?= =?us-ascii?Q?f9PGVZs0NYOw0ByA+/m4W6DWBcupkjCDBgNeArptKEmBjWy9AKzIl+RJuElb?= =?us-ascii?Q?IdNXvLdXyiVQfj/BeDTPs+SvC3/B3sVFrUuR6Gc/G/RZqMdx5uwP9JQgdtiZ?= =?us-ascii?Q?S26UZHX/CwdFjvUD5ZLBOJ6JnQ7U8z55Ao/XHnnD7cyMkT67JW+ptIOgDVOH?= =?us-ascii?Q?oMN5UCHD6FwvzsqAsXkr0InQP2VgvZ7lWApltc7Z9nO3sc+3C8JFjWHQtELp?= =?us-ascii?Q?xpIRiDIhaOwxKqhXZK5AO/3aI21mXHaVVMfeHRCje5XU1m0bstrDGgZ/Dgw?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1740;6:KKCuhWECPMmBuq7V49o5A0bpLPLbVUILmYi1D8Xaoy75slQOV9rzVHwp/ieF8SIfUF2eu7xj5xzKD0NTS9pbldARmhJ6/xSo4yqauP46VtpYem+tsB44NNatDSQn8YccntX555rkFrFPcl6f/V7qeb86VZdugxl3LQA1a6X92uAVq9KNWFic91BkxHNhC5lKkNXn8M0+OajDnouJ5R1LqFiRLJOvy/Q6F8A2CqD3SWvMkbVJIHyH3GfOUa6q9CMJgyg7Q+XJH/96rRObro8gIWu0JooaoxPZm9jjrQWsd6cBVWxdRYG7ToRMojYWrDlVegYNFncCUdpulVddAtw5yvftX80z/mQjYnuVK0ktoUAfFRnkLQvoEFy+qMpMp7VxnZ5pQLW6EVw4NdIf6N9pXCdZdyeHSVBdiIozJGMNm18=;5:ndh7E+Tiogk1PmhZefLvh1MNpLCHrQ4qc+YsWKQKsNwQIWVhXUzrkmU0WfZ03HzPYtKRaYgzhuuZJY3unP3WVcgmM164xhhset0zzAxXqKvpuzgHPTE3DzJOcrU88spm9aN7DaXrh+zK+E8rxkMkyqROoK8m1WNTKF4FhPgKAxI=;24:LpILTK6FzI9+JOvVGs+JHlQSSahItsAwNSzyPuKbyXDImyzcWZHWiukG5ulNzrXgFx7Fhg9SOsZ21D7B1qOiDyaqe9d15U49WQBzaGINYF8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1740;7:bJXiWrqI09WMFEV0EM2FzvmXmrR2niMJuKljmjPtdil7rzgaeXWg6PITTVBHNyRkg43zPpI6/Q8K7Hrj4x53ahBqDelZN3zGVUb/3xd4cC0NNckHlgvn7j2xPO9g61fnaobkH9HcBRXTh9AawsDh7wBKRd067poN1y9DuhPVzzDo3kaKAelm9tV2hRAog2UaU55QsAV1FKjrva25Db9s2xs+7yA+r6+qvzTiBJs+UIP+rPCKB3btTIIEid72FDNyVrV0plOozdI/NESm1fdV3+fs48EFJPdYaqRu7V73cHkxlWMVPCDGoNFa89azuAeMnfF8sBaumU8jJrYb/p04IttC68Qa4BB9arjFFSzRZXLcgqG7jzqJr+y2bTlwzPytkzEcRfnIk0EXbr20gi5butG7Iv+98eDJ7inP/0R0E15KW9bY2PWDof+Ow9tNJjMMa0U6finUNpTzDnHFD5+6rw==;20:ICYk9cJjQnLVT5rR0ooVVX7gQWG7M3UOCP+VWlvGgQZVd5SuRFjn04u70K2mMW+2sL48zWlOgS4Xoypk9Tbm4QK7uViZNQrAe2IdL13uLnLdj+EgxoK3ciqX9wrvZt33UUYqh5Dci8YOVvcVydyMBOrwLI2uEySZCcqZucRU6o0= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2017 12:04:51.1676 (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 In the following patch they will be used to compute: - mmap{,_legacy}_base for 64-bit mmap() - mmap_compat{,_legacy}_base for 32-bit mmap() This patch makes it possible to calculate mmap bases for any specified task_size, which is needed to correctly choose the base address for mmap in 32-bit syscalls and 64-bit syscalls. Signed-off-by: Dmitry Safonov --- arch/x86/include/asm/elf.h | 4 +++- arch/x86/include/asm/processor.h | 3 ++- arch/x86/mm/mmap.c | 32 ++++++++++++++++++++------------ 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index e7f155c3045e..120b4f3d8a6a 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h @@ -286,6 +286,7 @@ do { \ #ifdef CONFIG_X86_32 +#define STACK_RND_MASK_MODE(native) (0x7ff) #define STACK_RND_MASK (0x7ff) #define ARCH_DLINFO ARCH_DLINFO_IA32 @@ -295,7 +296,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_MODE(native) ((native) ? 0x3fffff : 0x7ff) +#define STACK_RND_MASK STACK_RND_MASK_MODE(!test_thread_flag(TIF_ADDR32)) #define ARCH_DLINFO \ do { \ diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 1be64da0384e..52086e65b422 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -862,7 +862,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 42063e787717..98be520fd270 100644 --- a/arch/x86/mm/mmap.c +++ b/arch/x86/mm/mmap.c @@ -35,12 +35,14 @@ struct va_alignment __read_mostly va_align = { .flags = -1, }; -static unsigned long stack_maxrandom_size(void) +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); + max &= STACK_RND_MASK_MODE(task_size == TASK_SIZE_MAX); + max <<= PAGE_SHIFT; } return max; @@ -51,8 +53,8 @@ static unsigned long stack_maxrandom_size(void) * * 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) +#define MIN_GAP(task_size) (128*1024*1024UL + stack_maxrandom_size(task_size)) +#define MAX_GAP(task_size) (task_size/6*5) static int mmap_is_legacy(void) { @@ -88,16 +90,22 @@ unsigned long arch_mmap_rnd(void) return arch_native_rnd(); } -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); - if (gap < MIN_GAP) - gap = MIN_GAP; - else if (gap > MAX_GAP) - gap = MAX_GAP; + if (gap < MIN_GAP(task_size)) + gap = MIN_GAP(task_size); + else if (gap > MAX_GAP(task_size)) + gap = MAX_GAP(task_size); - 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; } /* @@ -111,13 +119,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.0