From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752724AbcH0FBg (ORCPT ); Sat, 27 Aug 2016 01:01:36 -0400 Received: from mail-db5eur01on0099.outbound.protection.outlook.com ([104.47.2.99]:52256 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750825AbcH0FBe (ORCPT ); Sat, 27 Aug 2016 01:01:34 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=dsafonov@virtuozzo.com; From: Dmitry Safonov To: CC: <0x7f454c46@gmail.com>, , , , , , , , , , Dmitry Safonov Subject: [PATCHv3 3/6] x86/arch_prctl/vdso: add ARCH_MAP_VDSO_* Date: Fri, 26 Aug 2016 20:13:14 +0300 Message-ID: <20160826171317.3944-4-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20160826171317.3944-1-dsafonov@virtuozzo.com> References: <20160826171317.3944-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: VI1PR07CA0045.eurprd07.prod.outlook.com (10.164.94.141) To VI1PR0801MB1741.eurprd08.prod.outlook.com (10.168.67.19) X-MS-Office365-Filtering-Correlation-Id: 4a3ea7b0-5597-4ed7-8747-08d3cdd4a2a7 X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1741;2:xCJHtnGAhZkydfMVHFpk8UltytMJO8Gv80DYGqwg81Zd/7KLmGmXxxBXLabWQVw07oo/WFyJQaqg33kZum6QFdNqYWKjVD2SqcZPm53u3stWbjbNi0sFpuTQtOeE9+1WFXmI878rLCAnTPBsTjApQszvZAjFf00TGBuMwqdZsYzOHy1dx3ni99kuZCGQd7Pn;3:DiniCB6695C9EF5LbavCPKFLv6un6dg5rEPTWhdE4GwVt7WndZ4sYp06j01X3QIx02MPN3PSY+wLeF/+/OR7b/zd6ousB+IdCTXkZ95e3emQdaam5gJuYbHUdW+Thc+3 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0801MB1741; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1741;25:jhUg7KCGKVCMi09vgjtStrEEf6lU7g3hwdnWBnEvPTPztzNa6kpAx4vl5C25lSsK/zRKsuZ7k+HTneiyXqB+dzGFasUAiBQGuwW5Wbw7ov+UauRPYqm/U8W3IIMW7KL7yxlaNslPiyRb/YzC1aoESwM9Gr9utD13NLz2+0pSuhDuXSOEHVwwbUy302zZnJuORr3UeNrmbdSY3+9HUA49X6zrUgeK53uZa2ad9vt365a1brv4E1Dfnl6fjYCjFGTdTd6Hjbcb1klyZajg+hWKciNDLuaS2k82RiA8T+VPXTHFaNpvcKv9UTco3jPYuWt1bksQ+W94Bmy/zPfbnkvbreOa2QDXm6qqpy9qbX4Pmt2VGm/I+z53WVnN1rDw9/TylTIRIAOVS/7pXiLQvwMRpA6tgMt/IBud2K8NyxPUZGnL6MZN12aTGN94zpK8Jje3lRzvJ9bpzUgnQ9r3MCsS7kjYcOsv4dm+BEloDdVt+usaxQxCafIeVBeZAlxtGxuMJg7MBQwBmdsfYI3i/KZ0yxxzx3KzrTxbif+ILlDKA8/TmdQpRbXmefLO6K+A6qGxSS3XPBPor3G2LVcAJ8Oro7GmkDE2CqJ9xi7qD8FBKN6x9U0MABsSck15S4nK/FmkQlfV7qlUEu3ZJUbmyUqYJL/+NFTN1wHxRFk0QjquRjxotDnoTZAkKXJgDgZ4VOpRWj9my4r8gBB9LfXjfWvafA==;31:2bZCUAplA8xSTkiCtJ8IGhHsGuxlJMtwbKgAeCBuCs1kJVVTuYZZwQncVhbAFpXyc7XvWuBJH+zneHLXSbYd5+4UxwzE7GZ6tRS3GgKaNIwP5dk0hb08wW5O+T2zlsqyKbQ5eDlbQ+bFizbK3wg/md0soV3vI1PWwT062YHn5p81qVIfebXMxJEM/5ynIMt/QxNAK2wwoBE/o1XxSrXfwb0kon3sXSK0OWu552DA8Xw= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6043046)(6042046);SRVR:VI1PR0801MB1741;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0801MB1741; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1741;4:tPAe1UwgwRNDu8s238Tr7NQBf4pbVn9o9Qrppil94fM/6Xh67SLHZaWx2fNBh4mDQgbBgSomi98WBQCjxpcM8633VkQRtuFQHw3ImGJeyv3SLGe+b86lRQqDL5h5EsqhJtBDVSbAStlnT8W+9d4Jdjwo1LyicgZzBWVKcapQ6TZr681iBv9SXW3/1o0xVNfMGqHSADlTp1H4m5+rHkP10fiL3SulfZSq4DSbpB1pgXy/np1tMtXtsiG44h9VOzBu4iPlQ7n4/vjHaWwiY7scfgrKYxlFZL1QyCzqnBEXeSLy3GJagXu4YvxGzesT8gMhzbDatrfWC0s8rgiA+eFhqbfHmTfjFNS9k3mbNXfuq/pnww6CvNkshwOMKFIkgpu5CSUWnln6Jh/rY+WhF+ac5oOcX40o4BO7bccupgSMsXQ= X-Forefront-PRVS: 00462943DE X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(189002)(199003)(8676002)(68736007)(7736002)(7846002)(81166006)(81156014)(305945005)(76176999)(50226002)(97736004)(101416001)(1076002)(107886002)(110136002)(189998001)(36756003)(42186005)(5660300001)(50986999)(50466002)(48376002)(33646002)(6116002)(3846002)(105586002)(586003)(4001430100002)(47776003)(77096005)(106356001)(2950100001)(229853001)(2351001)(66066001)(2906002)(4326007)(5003940100001)(53416004)(69596002)(86362001)(92566002)(19580395003)(19580405001);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0801MB1741;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;VI1PR0801MB1741;23:Ux3gWJIn+SdZIvF6L1PMhjUk1CgeAvaf0+6RGF/?= =?us-ascii?Q?PjOirQROcjyjf2qyyOQS0ok5soqbAUAozQs4d0bKmXzHVgms+SofxDT3AxHD?= =?us-ascii?Q?oLiBjY6dgQQw1Ic+qsBHB4P0Oit/E1nnzl8axj3rB6GeNg1s9w7PqEUGFkM4?= =?us-ascii?Q?gwRgHTu8qaBeDX5xk7SJvB2qMIFWRFcYuuQomSiSfVtdCewQh9f0TfGXcwV7?= =?us-ascii?Q?fchqajadbSEw3Ov4X9+K/4Mkch0h4cPmo2tfSM1QHXiEb0N8+jdTMGZxVwtJ?= =?us-ascii?Q?4BTnDRz+C+rO8eqL7S1srL1PgNhKvpN9iyIk1yruO/vlOk3UqK7a+zFXnkIk?= =?us-ascii?Q?MErXEXt1Q4MM9ebQUpyzP+mU/9gcAMJ80wAXQAyAURIIy6VzCC440REIuLgf?= =?us-ascii?Q?NJ9a1z+sGHYqMx+dAR4i+Sbu0oZ3vYxKRjuk9TNfQys58OWoBKGi194OAsK+?= =?us-ascii?Q?W8gmWOuflwDhZ8B3+Dg4yhMzqWeljipr6vQ5csmwHE9bTuup+IlZScbH9LoM?= =?us-ascii?Q?O+i/WEMFx3NsuAEZJRniXjJtcJ4gkvDtiqiUBHvvwdxXC50WrRHrEEJPM5PN?= =?us-ascii?Q?Zvxvdepdwja1OueyU2HJsJCpRHUIjklt/25vkgZ3sDlhV67E08oWTLPWfG9o?= =?us-ascii?Q?sF6sTCuwIJQCotCnkXMYAZAHfyA/REOAbrBMnjTISbklPzWTpiBLGcgXKXL7?= =?us-ascii?Q?QJWDtkpcj/Qmubfhru/FMGEsQbfzInvdAYIEMHU2VS7FZIAfyatS9t7WrMAm?= =?us-ascii?Q?eTMYmml/1PTFcUp+hcKsRqGIVPhVVHVTwrGOj7uY05XChXMAFr544PdzWMMG?= =?us-ascii?Q?wHsTxGUCJwEQhmRcOYCYRpMb5nqA6VsfEp4z74FWObWa64SNZPD81N8BZjHt?= =?us-ascii?Q?PgEWgqpUH6LyubWTaHpGeA0gVb98IK05ntZ1H36vIqKw5DuWuN/JJ8/wbxUV?= =?us-ascii?Q?X2pNrBd5Jbu3HcsSu4TgvX+vN8qZB4VN2Jm6gdhdeZVBx6OKwDcQt3v5LhU4?= =?us-ascii?Q?wXDsN4/gWKFUMaWO3+Cait7S0PdlOLqA/zyalSQVk0QRUJpza76jf1I3Nnox?= =?us-ascii?Q?oAZJus8kXFLDI/SJE1S3+iov64bdkZCCjtAeu2Yz8tcMBfdWF7KHFWul6oVs?= =?us-ascii?Q?QU+b3FBLhSW2evC186h+5wGP65qGrx6FjEr5jhl+q00mGO6LYk3uiIKViJ29?= =?us-ascii?Q?iZ4ah6V7GrefBhTQaZHy83satvSxxweFdDppc?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1741;6:1bcjeVdubDpHkX6iIKG+Vq9kCVGUJAxOTAMSu0nuafUT1oOZhjlM1q3r9EjKVWu7yjt3WJRpZY4EXw3gAHzeVMXOBag7eB32EHrrIL9j2K4ZpNSw21d0zeEPdBHCLw/3yrrIeS9z7SvnBO9driIw5/0JSAEuqPHQ01+DvrjoqB1bPetPsNnazU1Nh/RX6rm5YDbmzM7LvateoZnp7pQYhpcNpv8DDvyo7KF/vGsbyuL5g06KMdGl8eyFbljrKHpDK4v2rp9ldsP5LsObeSKbymhCzjRaEnBgJP1uFDG0/mYD69gE/g2JRMAe/fumPKVG;5:QYig/uB9TpDylfwO9B16k0eUfYsKLMAwDdAn/H9UWksXb3VyOj9EXyxWFuv6GXTuzLoXsZLHqxtYX+uBwfzP77VV8foz6/MxVJ0Oh1800WfK4XdhCVRkIB4tGh1pdYu8Z8W0kS09U8tPBWRqELLlGA==;24:enQAOVZ3K5nn/1EPg0EesfbxgIDAL5iujTwvjy43OfBSEAOT8tajt+Rm47cVVjYqo02huTTfmVJJ58025Q2sl1cqzxPEppoMB2SlPuiHlkg=;7:uecWFAg5pX+mYf/M3FkfwWjiGrdDcgJ3Bjtgw+rvkJbaqi2Q3zRLe2rRTmbys5fvHmhpeW2bcD5O17TzUCyE2dzvpOxcvJIZJM+xWKOhcFgvUt4wz9bS//akK1Q5zPq4FAKMoU/bTLfizXgvgj/tleRaoIK3n/iSc+JVAyF6+DajmH9s5pU3lNJdNt/WJ8vInjqmu2tlcnU2GSlpMDOaiBP0mACkvEoMErkPOebtSKMGYIf3ZV8kghWejVY+Arlm SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1741;20:btCPIJRf+sgjWTFMFe45eqGXeMqcEQhHP/51N+2t65oYyY8N/FZSRyY1s1KYVAwix3ivRiLimUsktzfvnT5qh3DLs3aJQrXBWyxDFtZ2XDzvgJFMsvl0oA51PmTMijXWmZ3Q2WE94+iHeR1ua6KAYd2KM6a0ybZmH+0u5UjSTbs= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Aug 2016 17:15:52.5452 (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 Add API to change vdso blob type with arch_prctl. As this is usefull only by needs of CRIU, expose this interface under CONFIG_CHECKPOINT_RESTORE. Cc: Andy Lutomirski Cc: Oleg Nesterov Cc: Thomas Gleixner Cc: "H. Peter Anvin" Cc: Ingo Molnar Cc: linux-mm@kvack.org Cc: x86@kernel.org Cc: Cyrill Gorcunov Cc: Pavel Emelyanov Signed-off-by: Dmitry Safonov --- arch/x86/entry/vdso/vma.c | 45 ++++++++++++++++++++++++++++++--------- arch/x86/include/asm/vdso.h | 2 ++ arch/x86/include/uapi/asm/prctl.h | 6 ++++++ arch/x86/kernel/process_64.c | 25 ++++++++++++++++++++++ 4 files changed, 68 insertions(+), 10 deletions(-) diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c index 5bcb25a9e573..dad2b2d8ff03 100644 --- a/arch/x86/entry/vdso/vma.c +++ b/arch/x86/entry/vdso/vma.c @@ -176,6 +176,16 @@ static int vvar_fault(const struct vm_special_mapping *sm, return VM_FAULT_SIGBUS; } +static const struct vm_special_mapping vdso_mapping = { + .name = "[vdso]", + .fault = vdso_fault, + .mremap = vdso_mremap, +}; +static const struct vm_special_mapping vvar_mapping = { + .name = "[vvar]", + .fault = vvar_fault, +}; + /* * Add vdso and vvar mappings to current process. * @image - blob to map @@ -188,16 +198,6 @@ static int map_vdso(const struct vdso_image *image, unsigned long addr) unsigned long text_start; int ret = 0; - static const struct vm_special_mapping vdso_mapping = { - .name = "[vdso]", - .fault = vdso_fault, - .mremap = vdso_mremap, - }; - static const struct vm_special_mapping vvar_mapping = { - .name = "[vvar]", - .fault = vvar_fault, - }; - if (down_write_killable(&mm->mmap_sem)) return -EINTR; @@ -256,6 +256,31 @@ static int map_vdso_randomized(const struct vdso_image *image) return map_vdso(image, addr); } +int map_vdso_once(const struct vdso_image *image, unsigned long addr) +{ + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; + + down_write(&mm->mmap_sem); + /* + * Check if we have already mapped vdso blob - fail to prevent + * abusing from userspace install_speciall_mapping, which may + * not do accounting and rlimit right. + * We could search vma near context.vdso, but it's a slowpath, + * so let's explicitely check all VMAs to be completely sure. + */ + for (vma = mm->mmap; vma; vma = vma->vm_next) { + if (vma->vm_private_data == &vdso_mapping || + vma->vm_private_data == &vvar_mapping) { + up_write(&mm->mmap_sem); + return -EEXIST; + } + } + up_write(&mm->mmap_sem); + + return map_vdso(image, addr); +} + #if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION) static int load_vdso32(void) { diff --git a/arch/x86/include/asm/vdso.h b/arch/x86/include/asm/vdso.h index 43dc55be524e..2444189cbe28 100644 --- a/arch/x86/include/asm/vdso.h +++ b/arch/x86/include/asm/vdso.h @@ -41,6 +41,8 @@ extern const struct vdso_image vdso_image_32; extern void __init init_vdso_image(const struct vdso_image *image); +extern int map_vdso_once(const struct vdso_image *image, unsigned long addr); + #endif /* __ASSEMBLER__ */ #endif /* _ASM_X86_VDSO_H */ diff --git a/arch/x86/include/uapi/asm/prctl.h b/arch/x86/include/uapi/asm/prctl.h index 3ac5032fae09..ae135de547f5 100644 --- a/arch/x86/include/uapi/asm/prctl.h +++ b/arch/x86/include/uapi/asm/prctl.h @@ -6,4 +6,10 @@ #define ARCH_GET_FS 0x1003 #define ARCH_GET_GS 0x1004 +#ifdef CONFIG_CHECKPOINT_RESTORE +# define ARCH_MAP_VDSO_X32 0x2001 +# define ARCH_MAP_VDSO_32 0x2002 +# define ARCH_MAP_VDSO_64 0x2003 +#endif + #endif /* _ASM_X86_PRCTL_H */ diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 63236d8f84bf..555d21f2f492 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -49,6 +49,7 @@ #include #include #include +#include asmlinkage extern void ret_from_fork(void); @@ -524,6 +525,17 @@ void set_personality_ia32(bool x32) } EXPORT_SYMBOL_GPL(set_personality_ia32); +static long prctl_map_vdso(const struct vdso_image *image, unsigned long addr) +{ + int ret; + + ret = map_vdso_once(image, addr); + if (ret) + return ret; + + return (long)image->size; +} + long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) { int ret = 0; @@ -577,6 +589,19 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) break; } +#ifdef CONFIG_CHECKPOINT_RESTORE +#ifdef CONFIG_X86_X32 + case ARCH_MAP_VDSO_X32: + return prctl_map_vdso(&vdso_image_x32, addr); +#endif +#if defined CONFIG_X86_32 || defined CONFIG_COMPAT + case ARCH_MAP_VDSO_32: + return prctl_map_vdso(&vdso_image_32, addr); +#endif + case ARCH_MAP_VDSO_64: + return prctl_map_vdso(&vdso_image_64, addr); +#endif + default: ret = -EINVAL; break; -- 2.9.0