From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751407AbdAPMg4 (ORCPT ); Mon, 16 Jan 2017 07:36:56 -0500 Received: from mail-he1eur01on0092.outbound.protection.outlook.com ([104.47.0.92]:45234 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751183AbdAPMgw (ORCPT ); Mon, 16 Jan 2017 07:36:52 -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: [PATCHv2 3/5] x86/mm: fix native mmap() in compat bins and vice-versa Date: Mon, 16 Jan 2017 15:33:08 +0300 Message-ID: <20170116123310.22697-4-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170116123310.22697-1-dsafonov@virtuozzo.com> References: <20170116123310.22697-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: VI1PR09CA0071.eurprd09.prod.outlook.com (10.174.49.143) To AM5PR0801MB1731.eurprd08.prod.outlook.com (10.169.247.9) X-MS-Office365-Filtering-Correlation-Id: 0f8c6ca5-ddb9-4d83-f8b3-08d43e0c524a X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:AM5PR0801MB1731; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1731;3:iHr/RqK7hUgnMsI7MW1n/ByVrJw4SIfm5gx4fvsiq/9m30OIeYFe8gO0Vrsrd/G60lLIsYix9fVOfLV+lFPfySQJLmfHIJZ+cXmTkVVsJCgCL6QPqblz2YtOVynbRn+mZR0OGWZt+rkEkRw1tOB0ITXyb7nyLhcwzH7GA5/KVAZqg9zFT/vANonCqeP7oHV79jIrEklz1ovMzSIvFv/KoSI5DkSxIjZnrjGZkRKECX/t6A+mnOuTVXdTUcaigETz19VOf92w+U7T8Tt41iCimA==;25:XLDK6RDHZnZmBAOSqyb4BLITo3/ByP6MrZn8zETMR3FY6yuph4d3ag5HNCw6fkbYHuoBzOBTHwYBiF94raWMookjuikL+ZQsIAbJpEUd/NYmNZw9MAsiah31Xu3afO+shpehzFD/UQykSu+eIrKhpgwCnBHhUxPxAra/ZV0g1xKWgtqcOCFz84aZlw+QU4Ueev5TcYJPzFWUuIHXKXNkn3BmtxWaKf6Wo2R9rD+HKGiG2fQYYCWPffQpuD5X+SexIGMKS12UFThift46VB9jkQteYYdMEHqoiuCVKwX28iOhpAtG9LPf/7+hbiXrOsTw2vV+J5tKph7p5kNgbyvt+pZGns58iDvMww7GlvRElOqDWG6uApCmf8v4SVlQXvcg1ns4oQrtw9gdBSl4OmqtgOdl94J7DTANwvgeo+WL3+R/SLFPhv8qmKknj7QQ3NBja4TyPKmns8U8PVh6MrN3Sw== X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1731;31:E+ZOsZl81p9mLHbQMuMw8HhGOEskyhFNTrQFfIRljsTv9r6O4sP3yNGqWdBuS8RwYQ848OvGCdhHSii73PoISBqx+klXJSS3nyE/xFnGQFb5AGExoU76ssQVKIX44S+P7q+PACUJrcwfhm7vI6trKDqQpEwS09gef09KiK2Ns1h4X460/DV2/crBB+Z/CjKDTLmmOEzwl1JDlYCRvhZ5zZMvsjplOKCV3lecdkJdCMjXYjWNSKEYrKfd7icfAjBM6zYnO1SeyPM3JIhjK75D6g==;20:RNeaWCouo7gtlYgF3rKdZhf6j0pWGuvhgAHTO6c3SDV5GpQ//m0Pu+kdlNeMy4g7mgjAOC/CIIA9O8hh4igRvIHlvn7BQUb2+rxiJcCeeRwLRlDSYDw9LWzALDsaF2jTHe6nr8G7vykVWsXG24uDkdiU9Pjs4wD9yCkhD2us4SRr0jUTWDuK8VlIpz/kD2y6BPm44moJUzT2jF2bZHEM+5o5WP6qbrGGTThHTQwrOR0w07LzjwL91dusH3xCMTGw X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(278428928389397); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6041248)(20161123560025)(20161123558021)(20161123555025)(20161123562025)(20161123564025)(6072148);SRVR:AM5PR0801MB1731;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0801MB1731; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1731;4:ofdW0yc0CgtJaCbZ37q0ybOkRa18YghzD9ZwhMJwLmIMfozXlhIHF49E6vcb7edxWA036eV4HEj8Z4K6z0BXpxgbR/F86xQW7uEKtc1QdtjIcLI4+TWnRNiIw0yy1B4buU7AXL5aJvazNAs73tevWeK/HSBgVoal97/tBeqzi4q8duVTVZfsYI6OF5zUYGgMzeoMW+gsDHyiHVzeFRKjE1gc2K64snTTKg/BvVKi4oW3g+Vrb0+Xr219Eq9WX3HnaWSHpCc6PskAO/QNTC/RzVnmnqicnfLwPcEeXQtZ6qomG6G8XRcTKjsT2YHH0FvcJhUMKGv8tf3aklrBcFjAtti74tFqf2mjDhEx+dIxCufZlDmtrTBC47GLJ+67bQ9ZMc6HIeF40sax6HQ9teVFp+ruPAo6corNdMT9zkyxLzoBqrATOQG3RNOhK35DUgFj2PyVkwotgfgy5yCeJ+Lm6CQgkAq/+xQl8IW8y7SBuR1/acuN600xaOGUktrG/oqnSZQCKc8PVH1HHpZ1tAOQW1U0gSnMp75WNmBFn31xiDBmORVBP/Y2uibt7AlR8s/vzrn8ytRGBllLv/+L/rdpTV/i5rLOWMhslhwUm2MY7OAtqM49jX0KviBG5xJZRQesjbWxzVABbh+cNPVfOZcy5Q== X-Forefront-PRVS: 01894AD3B8 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(39830400002)(39450400003)(39410400002)(189002)(199003)(50986999)(76176999)(47776003)(50226002)(66066001)(48376002)(5660300001)(50466002)(92566002)(5003940100001)(189998001)(101416001)(68736007)(97736004)(6506006)(105586002)(6666003)(27001)(2906002)(106356001)(6486002)(8676002)(6916009)(53416004)(2950100002)(4326007)(6512007)(54906002)(7736002)(42186005)(33646002)(69596002)(25786008)(36756003)(86362001)(6116002)(3846002)(2351001)(305945005)(38730400001)(81156014)(110136003)(1076002)(39060400001)(81166006);DIR:OUT;SFP:1102;SCL:1;SRVR:AM5PR0801MB1731;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM5PR0801MB1731;23:DIDXj5tPAWWSCyjm1lMQBuxn3QoQTDx9K4RP3cq?= =?us-ascii?Q?BKh/PVRP/ON1bEZggnSfVro1/tCb6MTTtECwwW/sSsuhvY+prud1+cvx0faP?= =?us-ascii?Q?zv9ydO6H4OtqcaadbjVM2spUf1QCOCJ0y7dorTMIS9dMeB6BNrwi6ZANGLGg?= =?us-ascii?Q?GDl/y33cCw9I+so7nphflPu+QPqO9Z8grsjcyfbDWKSWqBBTAKTFwp1h0ETq?= =?us-ascii?Q?jyDYP9qm7uwP7Zbm1EkV2cr9xx4g4ItnUhxu0lNh/DHLwBzRcn0ul8++hexj?= =?us-ascii?Q?P90w9eGmnsCUY1H8Ix54Fhdp3rGnB/s5t4uDQ9dplafWq2eWZxlpW+CYioL1?= =?us-ascii?Q?XiCyWIRnAKtRplfngPDisTKyt7bivjP7fl5P70cdFs2MpcGa3OhZPax63e3Z?= =?us-ascii?Q?fKIhXAgI/DTl9DxY7LAbv6DP1DlEwIXyuxrBEXbUZqe249/FiFQzFvNbXKRz?= =?us-ascii?Q?CXgSEUeOfF1TETyx+JL76Msjal123uWXrr8/b/QD3yfY+qegU6rYMSDJORZo?= =?us-ascii?Q?toub+xI5OJ/QUsPoGozYvVm1SO5ZS+v7KAXdW3Rh5kmW079j3KVyYsYtOBYD?= =?us-ascii?Q?2Tu5h9fXQSx6MUMVuyncOUL2qnZFWh8ytqDFLBhLwGsHFNjZnM84aRoQ9HOh?= =?us-ascii?Q?XLGQjM+tPp2gVfvnvzvkXypVNujEALD8NghUhdJKYRh91AUeR2D1no0aOZ8G?= =?us-ascii?Q?VzpgV46rpcpKFqNchfpDlnH73QhsEWKI1QRXooikwOXVQMxVbxplpbB7G+3O?= =?us-ascii?Q?98iZd3rNcuf0K1i9hXtVN98cd5tayK/4eM+ifxrWymaURxkHZOkKThwrskIH?= =?us-ascii?Q?GulNot/pSghBwnk/HqVgB6FCr8+dCn+rvhbQBx7DwAFKw3gLxSy6rySWgCoY?= =?us-ascii?Q?yAS6NUWP2RiqEpBbWwFOiNelFdRPdKhRUqqNKznRe6GYvzPY1M2+/3fprk1X?= =?us-ascii?Q?3zSybIr12ooyeojjpH95kW1EA/ph8OVlFgYtTwPdL1mqs5Sg8MHc3d48xkny?= =?us-ascii?Q?xMe3JsdENbTf/DkXDFV0igLwNyuaM9shC4ZpYJ9UY27sguM50wwOS+OaS2JW?= =?us-ascii?Q?K18qYX+yQkcdwBJSgaL9xwe27MaNPXbJU8C2ih91O59RgJz19O9xh8TjhZFO?= =?us-ascii?Q?XdK8vRJVHQip4/vk0fYLwTptSYWtAc+SkK34bpeuZBvM2Rikft2a+l/SaX4v?= =?us-ascii?Q?rjHaHcN5qzxdjR0u0mVUfzGAFUUkSWN3gTg2nD/S2sREzagiW+TAxQXOwV3S?= =?us-ascii?Q?9R8pd44isDQyAybn9pSiigcd1BEX3TkBNH5cY5Cv/?= X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1731;6:SXiWavTjrNJ2lJ3d0m9Ftb0JsdJqieiIwp0inF4pQVhRNste+tF20KceRyK2crnCL1D6zCEw2LDu2D0BwQrOLv5BUq+BssVI/bRZpLMy5qP/r8yHoOcGiAw6nqxw71WGIBlEzK+BAuuLcJ5UjIGZXJiKZB7xOdqtvR/E0ZPd/dAHFsgcgIVD+4LJg/4MS3vyowVSl9JAVNH37xzQay9+rd/yRGloV2RY9oSFBMDZQpiU3uTxN2g+WbYX0B9LMwNT6OEtAhKy9RGkdc+Tv6MaFjdgm1ceg7Itt6U67I6tXlZBEMcbOwaFvd9AK5cdeMxvphXqYdNZk0Nzj1kdY+axlyjLbk2yxuCtUdmI+fIT0SrUaX4psk0oIijMlLUJQ0bOy8zTRp1I/4E+AmGegUtCPF8yzrcUl/7fMXHrkdzWvG4=;5:Xogs0us0Vt00cxzTSUnUhuNu3bTpM7AHADIAfLSxLmRPIcxXtdXi4cR9N2+e45PsjQ7ESdQlWl37UfjDcbJcQlZRQ9hXcU216nz75tmZO7zd7WKUCTF8zzjf0yewUljbegpxIRWy4/oZ44w5wJx6dQ==;24:vxsADkSu2vXRwRbCYvxjpJjSvvGMpWb9a437y3MBydjFdgEKZ9c0EnEbyh46uHc0cZgodLYyT3XSxGC42iLkm7sBTELqAtrjUkwlJrbAUrQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1731;7:zUi+fn+7wJKCkY8wKyjEq+xg2G2AoKEoxAVyrLW7VRa6aHDy4Q5DzUb22Ux67Xat6EKKyiXqYTzf8Yehj+2tc4O8pHexz+26J6Qfy1LD2SYBDYx+ED6D5CxSXc09z4jk4B9VRD4NeehyrCFOcqzQcfVW0EPfkl7buTPX55mzOwo2YVbqNo+JHEh8jVp7eaabmDK/sm7W7Y+f2xKBMTyY/ev6YEpf1zDJPWjfD70bTpcCYg4/kZ54Dq4H+cH0O6LVAPxPGYiTrRDxa0x/BBA5gmP6ts/8oXo+1JegYD4e7AsIufaIe8O1UCdwdst0Keb8Q9W6jkH7wtRzbyrLPzU5NpCPGtOeC9AE53HH3haOJ2CUcbSgW74XSAGN4VD+nGEV2zQXVZJKpy3EA0UuaMxOKPPoenK4rIcp315ERtCqjTJfjhyGz+Dbepxrynk4yUqKJMf31ttp9NOG0nbI0QLUpg==;20:zFBocVPa3pOOnQaxqZUa3Ql5yWeBQEhF377G2kEvTujPP02xAvGnDzSRmKCW93zrV915rGZYcPJ05o35+U/HtC556o/09dwNQ2kRyI30vpEYtk8M1tkB+6IppXCwbCzAYkQ+HzpSDKQFv9JGIdxRXxwNdY5RUK7CQU1IQdQnpsQ= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jan 2017 12:36:39.7749 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0801MB1731 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fix 32-bit compat_sys_mmap() mapping VMA over 4Gb in 64-bit binaries and 64-bit sys_mmap() mapping VMA only under 4Gb in 32-bit binaries. Changed arch_get_unmapped_area{,_topdown}() to recompute mmap_base for those cases and use according high/low limits for vm_unmapped_area() The recomputing of mmap_base may make compat sys_mmap() in 64-bit binaries a little slower than native, which uses already known from exec time mmap_base - but, as it returned buggy address, that case seemed unused previously, so no performance degradation for already used ABI. Can be optimized in future by introducing mmap_compat_{,legacy}_base in mm_struct. I discovered that bug on ZDTM tests for compat 32-bit C/R. Working compat sys_mmap() in 64-bit binaries is really needed for that purpose, as 32-bit applications are restored from 64-bit CRIU binary. Signed-off-by: Dmitry Safonov --- arch/x86/kernel/sys_x86_64.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index a55ed63b9f91..1bf90cd1400c 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c @@ -113,10 +113,31 @@ static void find_start_end(unsigned long flags, unsigned long *begin, if (current->flags & PF_RANDOMIZE) { *begin = randomize_page(*begin, 0x02000000); } + return; + } + + if (!test_thread_flag(TIF_ADDR32)) { +#ifdef CONFIG_COMPAT + /* 64-bit native binary doing compat 32-bit syscall */ + if (in_compat_syscall()) { + *begin = mmap_legacy_base(arch_compat_rnd(), + IA32_PAGE_OFFSET); + *end = IA32_PAGE_OFFSET; + return; + } +#endif } else { - *begin = current->mm->mmap_legacy_base; - *end = TASK_SIZE; + /* 32-bit binary doing 64-bit syscall */ + if (!in_compat_syscall()) { + *begin = mmap_legacy_base(arch_native_rnd(), + IA32_PAGE_OFFSET); + *end = TASK_SIZE_MAX; + return; + } } + + *begin = current->mm->mmap_legacy_base; + *end = TASK_SIZE; } unsigned long @@ -157,6 +178,23 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return vm_unmapped_area(&info); } +static unsigned long find_top(void) +{ + if (!test_thread_flag(TIF_ADDR32)) { +#ifdef CONFIG_COMPAT + /* 64-bit native binary doing compat 32-bit syscall */ + if (in_compat_syscall()) + return mmap_base(arch_compat_rnd(), IA32_PAGE_OFFSET); +#endif + } else { + /* 32-bit binary doing 64-bit syscall */ + if (!in_compat_syscall()) + return mmap_base(arch_native_rnd(), TASK_SIZE_MAX); + } + + return current->mm->mmap_base; +} + unsigned long arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, const unsigned long len, const unsigned long pgoff, @@ -190,7 +228,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, info.flags = VM_UNMAPPED_AREA_TOPDOWN; info.length = len; info.low_limit = PAGE_SIZE; - info.high_limit = mm->mmap_base; + info.high_limit = find_top(); info.align_mask = 0; info.align_offset = pgoff << PAGE_SHIFT; if (filp) { -- 2.11.0