Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750940AbdCNLpd (ORCPT ); Tue, 14 Mar 2017 07:45:33 -0400 Received: from mail-he1eur01on0118.outbound.protection.outlook.com ([104.47.0.118]:12544 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750744AbdCNLpb (ORCPT ); Tue, 14 Mar 2017 07:45:31 -0400 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=virtuozzo.com; From: Dmitry Safonov To: CC: <0x7f454c46@gmail.com>, Dmitry Safonov , kernel test robot , Cyrill Gorcunov , Borislav Petkov , "Kirill A. Shutemov" , "H. Peter Anvin" , , Andy Lutomirski , Thomas Gleixner , Ingo Molnar , Subject: [PATCH] x86/hugetlb: Use 32/64 mmap bases according to syscall Date: Tue, 14 Mar 2017 14:41:26 +0300 Message-ID: <20170314114126.9280-1-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: DB6PR1001CA0041.EURPRD10.PROD.OUTLOOK.COM (10.168.69.155) To VI1PR0801MB1742.eurprd08.prod.outlook.com (10.168.67.20) X-MS-Office365-Filtering-Correlation-Id: a7119d7d-9aa8-4336-fb98-08d46acf9c7b X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:VI1PR0801MB1742; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;3:Drnp6hWYMc6cIyWW+zFkHDJldJ4zD2JhDDVXuSQ/3wu92eLDeTzg7kxddWN9LbJOsaJSUP54IFwySUqbnz/5q8aqGvqTCrJiKbCRSoHuwyt0kt2AHXUwHtPYz2ZnFvf+a9S07ctbfzYNM/xszOqZjzz9BQMs9qrbYoe/bhJEBE9Q7iHWE2bYoagW8fqmjFuddCtIyTBEa4hLNZWLgiBqhG467bcWPbbdiP4Qf3zFG851tCm4hI2CTCp4DKob5fClQgcgoFPVBOoETccNpB3taA==;25:4c3SrqkHUmFYCgkgYz4JdRA1trf9vCq7ocbPEfNfT8OiGR3omWGaNWFtif280FmjfU373bSHzhB8RxP5wd+60+mBF17k5j04RgUZ0pfehiOjbRYHv5A4H9AN9jEdv7AFVsHj4TJi2u0HBXWTQWEMj1wmmh4X/HDtQCzi3VJgLZTkDwSgj8Cxxo4a+n0ycTIboQe62+DPbRZZPPFYc5ydc8OWfRv0q4ofc+SG3SRXaV+GCMtI4AXSPJtjDXAJldJj42618mNT6384EL19PGauZhg+EcwxKRR5OJv11vP1Qo4OpMJu5hsgZE/Hl+c+Dz7kcMsYn9hvCSpK/ukqJo4+WZv828PkG7JKb9N4uyw9QHzsYj1igJOrykDZHST2Hb7mXaGeR2oCOIktQDfCWweMvQE2ihNpL9+qtWU2R6ZTR4ZBBvC67Zae32CbyhLTskVH9UsVef596SMr6JEbcnM4RQ== X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;31:2DMc2fvvFIEQd7C1xanPkUR0EvH4Z/5L9aJmezdD/P0D9dLqEuk2X42zU2tAfwXIW8n7uGprO70Y6O7w3O/Yx24HZNhy1wUDP7GuIlEDvar/waShDqvmQRM5o/pKsHM6Bcszeg/OOkd55kpiprP4wGdk2M2X5CNfY6X2Hv9qqZYTKzc1fFhrPIQovSbdycEHMKGvbKRR9wblD3PxxETy78un4pAbc7ub5s4eG8Kp46M=;20:wa1+hfKotuT5+MvTauaGfBFoW/CUFT8pzT7TxIXwg0Ap224JdduoqG0S1mdLVXUrng/ueOLZ9a7q4fSb+aDXo1mhl9gDHMofoT4VHR6NJXBaMcysGngRUe58WE/dxMsL4M2JyezpW+n+kywx9EKMEHOYbLa5Tw/89gz1w9yE8qNxZBBQr6hihG0If4rkFsXT5kCIgGZl4FHuRRtFnu5Mc4LwLpfANxDzz/r6D0IUhHL/DUXF9phPcImhLE6BThVTAd4pAUXlgPmJnMNyOpXOVE0b12FbaU5zkGghIikDb2+L5O6/LfxOSHsuN+UpJaNZbASZydiE9nZskA+CnBDs7SIYSbEspuDsVxK4OrUOwgCbpYsPm22H0ttfTMgErkxw9ok6zUvMDNsvGvwGd5ZHekDhLrquc5lPMjZkXYlAve8= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6041248)(20161123560025)(20161123558025)(20161123562025)(20161123564025)(20161123555025)(6072148);SRVR:VI1PR0801MB1742;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0801MB1742; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;4:muqwwBWbq9xSjLxzgUOF6ElXspBzM6ErScd4xyRpV07bTTj0OxB0bnwKlZECXccNGUcetQotMPuIqmNyAmpjaM+gwAg3qpxMZyAJcPobKCMGv4O8yEyYKOo5MPH30Q1hcMFEq/JotvtOIMjSJ05ypHTa2IqgCnF+0p2wNcSnK/vG/KirzB8rnuglLZNr0HPvvLRLs7ckKdJylKxLUrLdd1nbOmOMK1yfiQ1DVZiRptvV4ZGtYPbTI6oxdCvYCw3ew9sBH5SyJ+PswzJDWUrKxp01H8qiRLARi9A4jg3vCi8JLfroTrWyjHhmjhMnHUZZ5IET6h3LIBUzBv8FpCSsxKIDWDUrmM6v08EX0Cjc2tmuk4aKn+m0QmtphbntPAgmjRs4MSBRZi7mEPukEIOFaRSsGRbssaUkmZxtA0/miYYK7wZzyeiwdVHA/jqzOzCmQZnV5C85GWkAnmg1lXFo1nE8T+aidZhqknsHokna+V8VOFs3Y09EwBjcSR9FeUU03Lfh3OejTossLTtrnUboWXl4Eo4eVGtwCGCG6EssL0YUTIMkUe98jLRUpAtIQi6hoj/s+bNGbxwTk7H87ALxuVTzUYJcfiXsWjZg5O7BKL5spZrcwSmPkFTuAjW9VZNW7Vc0DTYuoAu0mL3miYtwbQ== X-Forefront-PRVS: 02462830BE X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(39830400002)(39410400002)(39450400003)(53416004)(42186005)(6506006)(38730400002)(50986999)(110136004)(33646002)(48376002)(5660300001)(6916009)(189998001)(36756003)(25786008)(6486002)(81166006)(8676002)(7736002)(305945005)(66066001)(53936002)(47776003)(1076002)(2351001)(3846002)(2906002)(50226002)(6116002)(86362001)(4326008)(54906002)(6512007);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0801MB1742;H:dsafonov.sw.ru;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;23:DqGVdinysJpw4XRv/56UYTHKsiUnk+NyuRBoEzMzfdZ9C9HYMfhMvWi0c9yCM/+VganobC4TkSMhx1tlKCZ7M03SkNo6OBCE7MEBIfNUB+MKYLEmS3b/4Pz6q0Ku0/6lD/uaVEYLV4woRQHKrIYERJ+0Y4K1CLwG0U7dzyZVFxsLpcp1Raoc7tCYQXs73bZsPqBGyshilLtWKK7+3n09RiucusXsiX+0bn7Jtt0M4yK+dLoR1XM+fMB1LFZgZm9Ro3870UKHTHsTekuEqp1iDwMEFg13TfvUDt87Hn5Iri5hVOsAeFgcLJYPRioGrI+RA+i7/UTdGD46QTJCbUq+47/8xrLL7VP+c1sVUB2rML1hPBsBVYExEvCItmp82i6xHzg9PsvWfu7J030KuK3takMb9Lz5aS0c7I12AprclnFISc4DhhAqEMUCqxR4dhkfsA0D/9Aq/tT9V+RUpXjfebxxfY4Hn/+tOcMGjUuqbnc6IMChycqetwvB+AtvuGgF+fEu+CykNauI5ti4ILvgfWkQBIZDzsY2SFRgM3x8bU+fqsXJjj68YdQkYwMoJrXOweTjBrjw/Cwr8TJErDIX6PfgyHcp1c/SY8whQZ5e9Rn+pxVU6Rv9BogR4Nn2zJHjNNh9dK2Zp454Vjf7xX/QS5iGrtyb5s8HXpFu/XbEPnEHtj8PoxcrRYSV2jz72sX0GIrl588+9LeYpecyE8/IfsZ5+FwMZr5QtaDjfYkpb40e3Axe0u8ei0BulPA9LS288xo9FJFrbxlPsEa7AYjjaqzJpzuIZANP49Xq9MBD1xXwLBMNEi1uihESBaM4j6h/PHbxsBjkk9etLMTRcenBWozXpUnjvyIqcn/2SMVCm7b2+AcxMtURBuI8A0FlxCZIL8zcf40tqJ/xWLODCIwJgg== X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;6:XU4XLUfhey7wxDwJFOqI1ng7x/hvkQfF71NH+D77wYPQPpG4y8T17EXIvrYxGKKYJ/hE1BNNGUjKCHP6vzJZ4Qd6tsk+N23AhkysUnIsZy1VQMJ9Pxw2SGvp7v9Uo6M10xdUGzEdti9XLvSysZ6aVks27jnrB/l6hfZRSfZCPA/z/O4j8p6XJZtFfZdIZEdnx3gFYYJI8ZyfXbBZ3ZJbE4gwiYtl3KZz1TFEJartKUlML4CvtqdW9mUgWgMBOJUIJlwA5UNwzH5XkUm8PgdAVihpFm+ngfLM/vckMB7HxERQyMyiVkF8OPyyKHSYKWtcZhS7LCrPBG3bIfJml3jbCIVKbyQibIgxH33tHuKygqCYMLQMEusYCq2Ojp2rP4uyOLvD+ek+VnaNUG8TOyNEdg==;5:jIKDCJuBuozrbPrJfPdcF24GLTerKYB2+w717O3bD7Jrx7ufkqUGoyrEmKiPYi6E9Y+8xTT1IDIsxtIuyzbFsfIX0QISLs051t8mU30BAd8vun72m3zoUYyojtHoDgcxF2JHdwBJwIpAbgYkivqzFw==;24:z5HU4jCWzC8bmATnQIBrNQdJObaAGxsYnPT326EndKw6xtQ8kjK3ZHZlu+HaECXEpxsprwIvgtvvwcrJRjFFB4lE3FXE37MJsuXcs//d5qo= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1742;7:BON6LjjspCj4yyRiTfp/xzRWrhxcap50UVyyF9kCRO6w2IhEycdwG0GT75DbzXWWksv1mxiuEVQHrHXDoIBptQbYQZ2QccppxmdSGPGpIenCDHDrZxFYNcpN0V9w8l9EasK4I+SB+GXWyjzWfq218mHZc/uWY9O6W1Egj53vKnYy3J0GpMcsQOyToEr3BFuobQGgUHlKkmiEd1ubcMRBmv2EW8bAlVr7/set7eKrnJH8/b4AwV1d2nUtCQPOqruElymjVN+3/NO9We4w+guMqAZ09FiLxDVjSFMJ61JFWnW7gKY+w1bSFi8o8+EFjMXXAPgbWuALrHASIdowCUNAWA==;20:/aP94CvILkQzLgU+8v6EYKFVQmAtpU0n0OZY5Wia4nsYxVcAp6d/+5EXMkfWFfnSAJOghB+VtVs9PjSqwZS07HtWIA07q7axjesrMJ/XcgS+H1qrWiQnCyWWQykJMDOAU8r2RZ3GygPAhVX+ZV7WmNXiXBGLnhIYv9SJbmhGvC8= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Mar 2017 11:45:26.7255 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1742 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4703 Lines: 141 Commit: 1b028f784e8c ("x86/mm: Introduce mmap_compat_base() for 32-bit mmap()") introduced two mmap() bases for 32-bit syscalls and for 64-bit syscalls. After that commit mm->mmap_base has address to base allocations for 64-bit syscalls, while mm->mmap_compat_base - for 32-bit syscalls. mmap() code was changed accordingly, but hugetlb code was not changed, which introduced bogus behavior: 32-bit application which mmaps file on hugetlbfs uses mm->mmap_base and thou tries to allocate space with 64-bit mmap() base. Changed x86 hugetlbfs code to use two bases according to calling syscall, which also will fix any problems with 32-bit syscalls in 64-bit ELF and vice-versa. Fixes: commit 1b028f784e8c ("x86/mm: Introduce mmap_compat_base() for 32-bit mmap()"). Reported-by: kernel test robot Cc: 0x7f454c46@gmail.com Cc: Cyrill Gorcunov Cc: Borislav Petkov Cc: "Kirill A. Shutemov" Cc: H. Peter Anvin Cc: linux-mm@kvack.org Cc: Andy Lutomirski Cc: Thomas Gleixner Cc: Ingo Molnar Cc: x86@kernel.org Signed-off-by: Dmitry Safonov --- Note: I've tested it on a simple hand-written test, will reply when got libhugetlbfs tests running in my environment. arch/x86/include/asm/elf.h | 1 + arch/x86/kernel/sys_x86_64.c | 12 ------------ arch/x86/mm/hugetlbpage.c | 9 ++++++--- arch/x86/mm/mmap.c | 13 +++++++++++++ 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index ac5be5ba8527..d4d3ed456cb7 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h @@ -305,6 +305,7 @@ static inline int mmap_is_ia32(void) extern unsigned long tasksize_32bit(void); extern unsigned long tasksize_64bit(void); +extern unsigned long get_mmap_base(int is_legacy); #ifdef CONFIG_X86_32 diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index 63e89dfc808a..207b8f2582c7 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c @@ -100,18 +100,6 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, return error; } -static unsigned long get_mmap_base(int is_legacy) -{ - struct mm_struct *mm = current->mm; - -#ifdef CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES - if (in_compat_syscall()) - return is_legacy ? mm->mmap_compat_legacy_base - : mm->mmap_compat_base; -#endif - return is_legacy ? mm->mmap_legacy_base : mm->mmap_base; -} - static void find_start_end(unsigned long flags, unsigned long *begin, unsigned long *end) { diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c index c5066a260803..a50f4600a281 100644 --- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c @@ -16,6 +16,8 @@ #include #include #include +#include +#include #if 0 /* This is just for testing */ struct page * @@ -82,8 +84,9 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, info.flags = 0; info.length = len; - info.low_limit = current->mm->mmap_legacy_base; - info.high_limit = TASK_SIZE; + info.low_limit = get_mmap_base(1); + info.high_limit = in_compat_syscall() ? + tasksize_32bit() : tasksize_64bit(); info.align_mask = PAGE_MASK & ~huge_page_mask(h); info.align_offset = 0; return vm_unmapped_area(&info); @@ -100,7 +103,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, info.flags = VM_UNMAPPED_AREA_TOPDOWN; info.length = len; info.low_limit = PAGE_SIZE; - info.high_limit = current->mm->mmap_base; + info.high_limit = get_mmap_base(0); info.align_mask = PAGE_MASK & ~huge_page_mask(h); info.align_offset = 0; addr = vm_unmapped_area(&info); diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c index 529ab79800af..0fbb5a71b826 100644 --- a/arch/x86/mm/mmap.c +++ b/arch/x86/mm/mmap.c @@ -31,6 +31,7 @@ #include #include #include +#include struct va_alignment __read_mostly va_align = { .flags = -1, @@ -153,6 +154,18 @@ void arch_pick_mmap_layout(struct mm_struct *mm) #endif } +unsigned long get_mmap_base(int is_legacy) +{ + struct mm_struct *mm = current->mm; + +#ifdef CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES + if (in_compat_syscall()) + return is_legacy ? mm->mmap_compat_legacy_base + : mm->mmap_compat_base; +#endif + return is_legacy ? mm->mmap_legacy_base : mm->mmap_base; +} + const char *arch_vma_name(struct vm_area_struct *vma) { if (vma->vm_flags & VM_MPX) -- 2.11.1