Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751057AbdCNMHr (ORCPT ); Tue, 14 Mar 2017 08:07:47 -0400 Received: from mail-eopbgr50100.outbound.protection.outlook.com ([40.107.5.100]:51883 "EHLO EUR03-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750876AbdCNMHp (ORCPT ); Tue, 14 Mar 2017 08:07:45 -0400 Authentication-Results: virtuozzo.com; dkim=none (message not signed) header.d=none;virtuozzo.com; dmarc=none action=none header.from=virtuozzo.com; Subject: Re: [PATCH] x86/hugetlb: Use 32/64 mmap bases according to syscall To: , Thomas Gleixner References: <20170314114126.9280-1-dsafonov@virtuozzo.com> CC: <0x7f454c46@gmail.com>, kernel test robot , Cyrill Gorcunov , Borislav Petkov , "Kirill A. Shutemov" , "H. Peter Anvin" , , Andy Lutomirski , Ingo Molnar , From: Dmitry Safonov Message-ID: <138c6a67-12ca-612f-0d5d-17dcfefb9b48@virtuozzo.com> Date: Tue, 14 Mar 2017 15:03:59 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.1 MIME-Version: 1.0 In-Reply-To: <20170314114126.9280-1-dsafonov@virtuozzo.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: DB6PR1001CA0047.EURPRD10.PROD.OUTLOOK.COM (10.168.69.161) To VI1PR0801MB1741.eurprd08.prod.outlook.com (10.168.67.19) X-MS-Office365-Filtering-Correlation-Id: 5ccc87d0-d6da-4ead-0d86-08d46ad2b793 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:VI1PR0801MB1741; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1741;3:Ty4SoZdJcR8I1AyDUg+ddK7vkCbElnJHdVStTd6prG9tTI0v0w7Uc7gfMLzp7CQZFpId0vLKG64Ms/BMnA3i4ccg+xT8sb9FOvOS8dzWiEFU16KYxwuPA2pWIKmtrRZU8FVLcumIUd04QTRDxZfv1vUSq2rptpI5qM1gjdrHLf92M1zavUHiGf0T+MIfaaBGdrMp0G4XkvRvdxm3Q83BXXF7Oz3MEAbIcZlsox3Kdv+zqwOfRRvUaldwYW4RFvv5n6oB60F3teAc6PyrOqY0wg==;25:TJT6x2Iy3jAW9ZlAom4HpWyIKDBzuo9AGFvwwRNFxfsMC/N+8Gpb3QQF3t++kMXarhNkIEGoFGA1aIQBjaG81aFjcJnPY9rV3sV+z3IAWzfP6cGSe/6zR8nVbci5jYUjLIHS+tXpA1nhakmxqUn4Xs2i+zwugfmfv/IJ/8+ebE+acAA+lnPAcDa2ifez0iONAHMIdyGupAY66IEknGxiVIJKCDWIM2XknTp+UO0V71YJuSU5JcK0OxH1o8q+ROKZXrL/6zfjiVdZE5UWh2E3+Cw1DLobVRze4z7TjlO2g+Vct3tBU1yqU1O/P75d5kjbgOj6G79saklr3eBVcL9cWDEPzMkd3CQwUhZwod2r5f6FEd/7UuQ2JIscq8SusM8RDgHYJExm8nMel5q3aL07BRTQH4i+pLpXYCrEP5fu1CDg1PlXwJGkpaHtqzWS6g4k52v//tfP6ZymfZl8oqZhLg== X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1741;31:n+kigGPm+CAsPTs/fDexrKqNdPW3rt6hI0JrrAooLMFIQpZrPCFIHV9irpET8L5kHp0tItoxRCrZ8MFCY+jiNhyZg3ZLKPeKvLmh6kWpfN6P8P8ue+Nk5He+GguoS2BUcf8MtOKOMUd7ZeB+ArM+SPfESkyq0pCeBo9mkkzyfWdpgGlzFDgz+7OZRIem9s/QhNsJXFBb7ctWXeMUhsL6ROMQYpF8GAM14ZBLaKaCro9L0V+/zm2S7e5BQaF7PZfq;20:eNoCR7sj3+2M99TJFVzNkpP4GmP9p0H/YNEsmgrLvegUIrXp32xuVfWSbfFI3ID3HXfVd0F0SeiyJPA38MO949wnL2Z/Qir5U8QzPJLKp4f8UiW3v/J0T3YQalk351ceYBMvEz2X9vz+MewqUCYgi5uTg9yDbjzOicvAMDEWyx261nf45MQQt+1I5oiAZJcZhVrNZEuuEZ7GVmEAqZQZyeXDRiv1hO+UaU+sfRanYofweU12WfmiKEYgU0+7ULmZbF8UL8v+xdQepb02K8hJPphXFOGn5fHj/rBKSmU4JAFbwOSi8NfhTG3tBWFVdu+WrBzpumKSK65AhjiMW+i4B8R/x0Y4g5aCD1YJh2lOW2apHgRhj24lFBUla+HQTzU9/MfiEqCd6eD/9kO4k3sfJSlNei4XnLy5cwqhCru1Fow= 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)(3002001)(10201501046)(6041248)(20161123555025)(20161123562025)(20161123564025)(20161123558025)(20161123560025)(6072148);SRVR:VI1PR0801MB1741;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0801MB1741; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1741;4:wqk2ql4piqq6Mzv21tjoxxbL8EXXmGoc60mf547hi4KEwGcMihTTq94sJGm+vfjybjWQgBVSwZIgZF1R89kg8gUIs+KIbq+ZyrAmAW09IEe+i/cOSOQY9lAyiZwbjiXSvalWJ3GgpTqBMHpRZBcODA+yvUiBwvJdzxfEpO6xsX+z7I2YlybMpYKsoQgGsBNg+Wu5Wh5LkudZfbrfPR9yCf1t9UzCTYhcyNTo7KEMfdYwdTHu4JuaVMen7s1DvInmZfr0OCO08JEyHBBdmkRDphZJfYEuhO/5oDsC/p3RU2jNF72//sJQ23aQFCixEhKTiWJYcvllIncmm8Cf5eUl/+Nt6aQusDn4+zu5CrPYHHRKSkkPm4YGPqw5an0VJmhhOP1/gJkXIT1X4OR5RPgb5b+4+GLzI/WwITDr+agWnwCifK5vBfVEztIDEQ43KJPS1XQ9ixeiPJUqAEN7Fzm4tiH88E7SQOeYux9LlqCb2hjTkg+InWDxeAWHpaaJCEpTYp11jC6/o++qmMaKJY3LWunjEKBeezQwhGJdu6U9FVsKWgV/bpLHelIXk73/iXkI5ITsB8Cug3zMgrpfsuIMkdxTcWjt1T3iVpXwgt/3ka1msAgU1FhfSiKGbYNRo4HS2k09nX91SlboUWE/lFKkkw== X-Forefront-PRVS: 02462830BE X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6049001)(39830400002)(39410400002)(39450400003)(377454003)(24454002)(230700001)(2906002)(65826007)(5660300001)(2950100002)(25786008)(6666003)(229853002)(31696002)(66066001)(65956001)(53936002)(53546007)(6116002)(6246003)(7736002)(305945005)(54906002)(38730400002)(3846002)(33646002)(47776003)(23746002)(189998001)(86362001)(36756003)(31686004)(42186005)(77096006)(6486002)(50986999)(76176999)(4326008)(8676002)(81166006)(4001350100001)(54356999)(90366009);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0801MB1741;H:[172.16.25.13];FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;VI1PR0801MB1741;23:NGDokSPEte7cIlGpYStRwr2zRHrvdg1MXpZ?= =?Windows-1252?Q?OQJhngZ2zr2/5ywLvgFyZelqX3gQy/VNdobiTnaygycwV3oL0gmepETb?= =?Windows-1252?Q?DTdit7UuUWVVtJc7HaiBW1qFhQoIShFpj+54PSgC77h1qsULcGJpyqdW?= =?Windows-1252?Q?vULggiV5y2wIgxB066/iuMHyb1QUExx7uWI9pDr6TckqDlcxFXIWwpZj?= =?Windows-1252?Q?8e+Yme2iraPpc9LgippeaIFedJ6TklKV38l7WZLMCxJszQbOArXZPkPw?= =?Windows-1252?Q?8OwMQsXWLJtw6+g5z/Y+Lm8UC6hpkR7D+GbvQkV93xExAdnBsgttOjRF?= =?Windows-1252?Q?3YZPin9YdXdVLPUiy+xc/GXxiAUirqVs28AtXOn0op/Re2AaTkqpmn0p?= =?Windows-1252?Q?R3sjmejwUq3ZuSx1OAPrP8DB/jHEnW2oY3z7fQnq75BFv/Cmui2xjS5u?= =?Windows-1252?Q?AMvoHukrQ8q5uuN6LTZ4KfzklLQlwFEHPedLauEmT2qwsyBGUFNqUS7M?= =?Windows-1252?Q?gwNsfWfDeSXL7QJz5maljj4BAb9tTFwGi0QxxI6lPbP+ybcCucmluMrG?= =?Windows-1252?Q?EJivvlvsVuy2Hy0PkV4LtcLuZmcAeraBFdvOX/mHIMBIF1etYTxWC+7E?= =?Windows-1252?Q?etWYevRAEBeoeFd00Z5zLtfC4CH91fx2QnTbwmMmIIB2g2Tely3LRjOA?= =?Windows-1252?Q?YOOVsavBkKetgemRLXlbtuiWitK6VlpCZnDugB72LSVI0Rbach6irVS+?= =?Windows-1252?Q?atCtloBBIfX3XPPTNkz4R2f/e+ww4fpEBPuBXtNVuyXNpiqRK/WFz3AA?= =?Windows-1252?Q?2sethEJMdKuJRfKbHiEIn7ubNHz6PqGB+9V2CYSwRGFatQnIrfQebJdH?= =?Windows-1252?Q?4KtGvASB+NC+/MJ9qQle2ltbi/xHECKSKo5sl9ZHe4x+krzFcJdKMd70?= =?Windows-1252?Q?lIoHHNn3j+nq3lj5uxGQQlxAOEBnrXvEXTvq9iByDSZHMgcTJJr8vExX?= =?Windows-1252?Q?kK409wWoxQMbuOIdZEpt6OOHXlmqlMABhZqNpRmHAcDwLMvY0m2ZZvcG?= =?Windows-1252?Q?a3CeoYhZmXjcPdfD7JVedFapBRdf12ORsMCy5KJ/L279h1ZKhtKKs5a/?= =?Windows-1252?Q?8riMV9JR6/tmQSyQezs/E0Tkdcm3CmV71exE/7KUfu4u6ghtCp8j7c55?= =?Windows-1252?Q?tGDHynwd7qvqi7mA7skKasCCLMo62Jz9YYajlFUhLO9X5sfmjgkJD?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1741;6:TMCqaYvHkM/V5Hse3QMTRcbmCgKnRvtc71JbqvKcjoOfiXjyXybja4c5DQcv3HOXLaqnSuGILZiFNZXUq22Gk1QMu86YIg5JNmSmJAbzNF42Cjmssy1yhh/D8A3fEVi8ccBFw4l6EC0pvIhidTZJaeHRaLPJusJE4pkGIbStx0z06cVj+wWPmLgkOJVe8N5p5QNxIcehyoPr0XlcKq2pqq0irv7ofhm8h3YT0EjmWW08WbJVjpvtCAFg5zHePxhXDogKtCAJVb3y30funTFx/LFrh8gou6SlOg11fwEtSL9XTlR7A7gxfnuvgbY0h1vyq0QTqvOS/9JMTPo31bXzCqQqdPEPcrJbEQlTmbkorXqTSloyEwnFEXD43LhVXSzHkYLejI2KomBcp8NYRTrOhQ==;5:Wd9D23/TdYV0wugsEpFU5EgQ0FvuTcW1d8q8+takdSCa9EWv/AGz83QnEAMlAKkNfn4z2szAxfwe9A4KUk9cyDwpOwAvvvwC6Li5vNWa6erHNDlDCp2FMSC+PEKilX/7nxe6C37UpEKofDLjkm31HQ==;24:YJ3JMZcOMNU9K8TihsMv+cFlEw8zFZvEuo/Ql90jnIAyxrms95U3MExSbm9LLnrfTYEYsd3gg+K12XkHlQe63llUlJv4lkhTs+Q5hOA3ysI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1741;7:NKm46/I5ugQSUnifPHTRw8T0BBMnORgPIW5NhlxW5R2+3N1J8IPDrTLQhdii9lFuATVrwWJyYMR+eX9kFTTUqehs3x8fehDbNmcKJnNvC7dhcWpMgfmimT5W1TyUnny3Z2vTUXlgT78wbUnoKuDoWBdWuiAPb0W//o3TEVF7xEF8CO+RBX8wE6lbW1ejGNQAdAUtAYnrNXT6frB9vGC9iYxGCy4Tcr6LALIC18NMDMplTMpYR/rXPBPaZShZ6jKD4rxRTwfMdPLfBmWuHDSzkQBzyLhU6sVgmH3shvkmISA+E9Aew5dLbsHnmRaLqIAq4bOoy1vNIx8m5LDz7PKjRA==;20:60QDPulkKMQdFb/Ovn8PC5SUFgtFM8QnvTM+TQzEWBuxqCiEnGEEf92Q99dHcOMtAJgqwJ2iBJn/UvBIQrXE5R5pelaFu4Np8fc3CLVXvgbIac/Vg+jIw8LjwnfPY8+LzsOyyQZnVXjpvhJyZRFYyYoxinI6R2pCABVByI1DIu0= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Mar 2017 12:07:40.6614 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1741 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5137 Lines: 150 On 03/14/2017 02:41 PM, Dmitry Safonov wrote: > 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. Can confirm: I've tested this on clean fedora-25 with libhugetlbfs tests, it's fixed. Sorry for the breaking. > > 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) > -- Dmitry