From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751776AbdA0VSh (ORCPT ); Fri, 27 Jan 2017 16:18:37 -0500 Received: from mail-db5eur01on0120.outbound.protection.outlook.com ([104.47.2.120]:23264 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751771AbdA0VSc (ORCPT ); Fri, 27 Jan 2017 16:18:32 -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: [PATCHv3 2/5] x86/mm: introduce mmap{,_legacy}_base Date: Sat, 28 Jan 2017 00:00:26 +0300 Message-ID: <20170127210029.31566-3-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170127210029.31566-1-dsafonov@virtuozzo.com> References: <20170127210029.31566-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: VI1PR07CA0097.eurprd07.prod.outlook.com (10.165.229.151) To DB6PR0801MB1735.eurprd08.prod.outlook.com (10.169.226.150) X-MS-Office365-Filtering-Correlation-Id: 09f2f6aa-1a15-4e37-1ccd-08d446f78ffc X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:DB6PR0801MB1735; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1735;3:IBXhxhdo7ATMx+g4a2XuCKGzH4td/W93W8tYmiWIJmQs2c6+1DzbFgNOV/z/FGV8JhFwtP/+cmmbEOwsnR9nSByBdls1UkOLx/0PJrFd2Q/B9+JkBmf0z0zQ5ml9sBPrIfFuIB3vYWt1IZb1Ycew3D2/f1JjiuOchLzHl5D/ef3kqYxAu7zvSe1CkWXjOsN8cuJ/c1/pRBSNvvAK1rlrPJlMwOY0ZqHVdZLRSTNVUZi3tLn/MfIE0hAtNEctTL0NGeLYwPPJTa9g5AwMNSp6Pw==;25:rUYI+cl0YJxrSMGYrVXvcaeB7J/+GmUMwoX3EW4m7yrIEb0TkyRKPklN3ST1nr7Th8iicRw/ybSr1LZOy/PLvmQIQfpHOmmVoS1oQKLcCnEdPuJHIlcsmZBxA/ZoU9t5+LYzJePjUox7E99EKHckIp8lT5ykbsO8gLdKet1UpXB8azxtmdNGhQ67eon+CpWsZTxXEufWFWm3B2VzPpv/BEYR1i4+RkoNR8B+yL0wz+yzUai65U83BvTTR2MfTrwVptNDJEWJuxn2XVenuYpRV1s9e3/yu3mPEjNPjJ7/PC6uDmQC12vJSountTmrKgLxDuQSvcaUfyfByw5+BxbN9vdYECtfX+b/FHQz6AEuj2n5/yUkIg2mPD2vLQnnrXWenA5gAmPVQTjRD9D4erqGpM2WRGW6hFY21Xfa3BLZtsycjtL8ePxk0qPCYet2QO/MyOkdirVUhw+rNJRBbl1HGw== X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1735;31:d2FVevPqvtg/ez/lGSqWKat74uLBKibnbrbrwa213fXQHCybob2y9Fp1SWY6RieR4oNXsNxhw9sX1ef7WfIQvmjxdg0Keea3BWCLEeR0ZetmtMbwoZbUdZhjm8o0UAp+QaA3cmuJpVimsMAzqFUfDq2rz2bcqLI4wFWgG49kHNGxeEaytWJZftDg91DZZArCe82vTOWPEOqTJQe0G2n3sgNu8V+uwdWfV9NgdgPXRJ6u+X01HQ2j6UQM6iQ4Cht0;20:4F+Xn9WhktCMeaoejDxzB2Q4ANIXO2lwff5+VN2EbSEWjF62wxhUTOSCvbAjKHZSACI0BCDd3VD2UApo81SoC4WPbdpNIlRz8CUjug3qk1MBWOnO+hnGbC30jeO3vGPjzDlsNcXTfjD8VNXkk6Beo/clbw7NQ19D8j26YWwMbFZF1cKf49Wh0P8LEIp41uvcS2PYp23ho7CxQn/MGmKzMd/9NdBpo6sanPhRQW0D10Ik3BaR2Fx40JNY7xPkW6/V 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)(20161123562025)(20161123555025)(20161123560025)(20161123564025)(6072148);SRVR:DB6PR0801MB1735;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1735; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1735;4:JiU2WPAqYN8S7kEsrEjoii4ly4T7WyG5KS9pBJr+FZck8z/oYnbM5vEjMknUg5rXuzfo3upVioUsjQLS4k5/NFX8giPej/621nQc9O46Ile6eSHurLx3rL82Twez8hmOGoy2Q2dZp5pGmMo/hcr2QXINWIBaSYTiA29dgsJOcx2OU/YnCl+Spo3AbMbVnVS7pY0SEg85+wgmL+zi/uZlyChbmroQtoIBdvjOi0ykD5yh1aAMD/uMJuMS43ytplf6rqlj3RElpBIars/myEKbESlz+fon5V/EQzwVj2n27oVOZmaOF6oCd50Ka0CmGSsv4z9iCWtK0QjZUIDtjHkuZ0Zd14tTu2wwKFZ6kqDfrrw+ovo2Z++WtzlqdaVbX8DhsEpkY8O3u7bMSBYmEAcGrbuCq9zXRvrsDrInaYs3BY1LlEnheQ9kLq+zx9MKKodPDqb92P8sjwFvE0QxSrdy1D18QQUuBn6QAolk8Y+9oAMVNgVfTZ3lrUouCVqy75VqpbuH0+QIHrV2eBVCnUNrWL263W4cs6mVMUpywT0aOBwSf8Y7IYT3UmXNwy6IDwjZLOGLFv0ZOqASgYYMF9KDEA== X-Forefront-PRVS: 0200DDA8BE X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(39410400002)(39450400003)(39830400002)(189002)(199003)(81156014)(8676002)(81166006)(50226002)(5660300001)(69596002)(3846002)(5003940100001)(68736007)(6116002)(38730400001)(25786008)(39060400001)(53936002)(6506006)(6512007)(6486002)(54906002)(2950100002)(6666003)(6916009)(110136003)(50466002)(48376002)(36756003)(189998001)(76176999)(50986999)(97736004)(42186005)(86362001)(101416001)(53416004)(92566002)(1076002)(4326007)(47776003)(2906002)(305945005)(7736002)(66066001)(105586002)(33646002)(106356001)(2351001);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0801MB1735;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0801MB1735;23:oIzzb6o78Yu20daXopaoTj7IgepZm3Az5ke5pBt?= =?us-ascii?Q?msgpiWj0OHICkCchyG5dQAVTemXstgtl9uHCq26TTPtWSc1ZY1MF1r1xiWVb?= =?us-ascii?Q?AJO2e9BiWjxfj3q/BfFdJEAR7ndZ1rjnhDuFQiXk4GYdvN/KbQmy/sQ+w4As?= =?us-ascii?Q?Xr+uLIFk/sVbHLiNd2K6WQCYvns2RMzP97f1XNIqJ1AsBq1EclzC83AMrhjq?= =?us-ascii?Q?UfdtOt6kloPlBJHuEzn3x5EzK+bMeAjtL9+0YJ6pzcusarIOumgYfB5VMmb0?= =?us-ascii?Q?3CkjcyxiYSmKBJTv23yLFV9R7yCOwmXZZtuHriQlMC517Lct1bCc9nEGmCJY?= =?us-ascii?Q?OzTyy14Ahw/yy3fj8mcOScdUPJdWYoO/PYKLEKVLb9XcShkn6LYG1UsQXds0?= =?us-ascii?Q?dc3Rdbz0ECAad/aloR2xyTqBBC7qSbK7JoPsnkTJ2TMAeR6/gHjDGQGB3+B7?= =?us-ascii?Q?Aaw5goshK9cUfxr6XdWWiDba7s3eUSEQgIMI1LcbpVKLWH82VQ9hDZKiiBwg?= =?us-ascii?Q?u3/rpUR9PgZCjjCMaB3+qb+W7Uy+D0OmGHwiGlMFrdTMIDTQddP51ZXBkDRA?= =?us-ascii?Q?atQKotJwVVVmbEEzG/gpLWjTZvrIpML5u/x+6T94Dzj1SffJEWufgV51wbys?= =?us-ascii?Q?ipYE/lm5oi5PkMUkN92qlMfylVhBKvtDlRT0bUYHhgWnijFJA9q4JDatTsR+?= =?us-ascii?Q?07151HTn59ReMn6NfVg5tEfiHSexoBUNRCFjOFkdzP9A4DNan6eqvLjl4dKz?= =?us-ascii?Q?kxkNnAJzl/XODTS8hqMmm6A/AHx/5GzsHRT+6oBZBUI+czx7csvw9LooV6sH?= =?us-ascii?Q?I+9w4+KmWpkR7sjmVltoi3Ii/Q7Orn6AySYiEehs1kJx1F4h8tuKVvsAzgap?= =?us-ascii?Q?eQ7IXEfNGjwNZ8p4ciEVF2hSkMF01SyK9rciZrToHqJGAxBsKMQPJ+OR3ipC?= =?us-ascii?Q?iabInv3DA+s5UraFDLX/euzVQg3kPbm62XUj63QDbWc/qv8zI3daLUWdymAI?= =?us-ascii?Q?iTOPM0QdCY45RI+IbKBWEz1M9PS8+UJWPgDqlULd9c8SzNTHpHdVS+apSU0P?= =?us-ascii?Q?f6jiq6oE3+NivHcS2F64YHpmZyt2XmQ0BaQ3NvTg8wRoUG+o70P02dEXaaD+?= =?us-ascii?Q?GpQH1zDg+X4jDotUFw+RaNZHRUKtej/TknXvqje1Uw2mOHLPHxDtUK2xMD4Z?= =?us-ascii?Q?aBJ946/hUrii7btrI+EoE5l8tv73M9/TFWSLA3CI2F544vpl5VnpKffAWWHW?= =?us-ascii?Q?1ATIZBylr3nmd3FyKp/b1stF7ky8h7up1yA0u6bV6?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1735;6:8MtwikFdR/09kQm/knPIqlK4VaJUwLk2iofIM2Ic0WOxyrkYL5SJt0vg3/YQTWbi8zKgAi3YaM/i5yZ83bj1Sxv+cjFC6crKtW+q49Qq52+/uWLhLbZw4QagzWBnS6Txj79v7LbAIc8DuRw+lJwzTA14N1nHKxNemF7rowFHed2K4RQ85mtk+aYhCGySLTHUQhtn46oc0rKHUtq8vSTQVzL8VcYASl35Gq1MdafUxDBcScKoioDy3ZgO72DC7WT/ZHvctNsLqZyeLJsZHBptiTLJAicqXYXYGmLew4XGqddYaq2S86GAbprwmuI3pk+8AmBPYI6bqXjj6kRI7pJ8w6GxEFmgAUxBArU1jFrKWaQ5mzuxs98UP9ncKiojmfXnW1epOKzUy/eGGS/Jmi7TNHlhLd2WvdzR7DeJ3Rvniww=;5:QG8DB/vpmiwT0uDLdjPBg4We7zVtxHCQ61bw9Nt6bTfBsSU9r0nKa7iZZosLWkocfKg+YxByFJUvyGnZDwxyuOh6CgKVKRPIYG2psCbBeZjxJoisEGa0ZsvSzDZcyleYI83H0J8W5bYoLD5AblHwzA==;24:xLE5mQsW/bZz7RDfYU13tk4Rh7BXkD8G/qTBhpY7Ps2fcnG9c+BIuz6F6Oki47CfpmFPEyJrrM0f+hYAICpiNAA2yYPC8pVDfVEO/1ak9WE= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1735;7:7YgNbDfV5leJwpbv06snp3fh8LIOupekQ2MGIW1Zc1uWsdjJJyMGaYts4S2qUPwwqulgE9rGbHyWKVZkr3qiczGvgY3wI2C1hCpQk/QKm95DoD+xxIdhSVo8icpgQX8A963U33PdG3v+BD8hFI1i14mDUzK0LpYm/r9td0LgEufrMontBx8wlxVnKIU354gRnCdwd9R513sQHU9E7HIAG6vj4lFiDiiJfXYsGE/gnkGoR0Dc9SkoEqOXJEJYq2/ysBHRJqkEnolgJ94KyzMZf6dAEkSBImOa/BXJhCnqTY0m/S+9NyEC4iVNSUy5PWtfof7n8L9rNHvW7+cx89/5ZaOa7aAukUCKYZNqwBnV9+QP6zkXIAS2IS4+nvmD8BUvkIRpqZXSs5tVdoO2x7jhf/msJ5o0LRmcqH0g840T/I3JKBihg3hmNZT/+h6P6jp/+5g/V0nXpBMGc0OQFr67SQ==;20:0CxPa7Hif7Qv0/QRqqAfeEKTMnW4zyIdJiASuUPaicvahOw9vR4gn4Qh1jhyKlEng2Zvpf7Asw79Jw2b9kx+mu/rcSGBimbuukNEbUZ/CfW+s404T49+mxplYeTZyznAcuFJ5zb3mEGFn7AMT6II0LMASWItXJYkt8WWZR6jeGk= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jan 2017 21:00:44.1484 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1735 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