Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751808AbcDTQi3 (ORCPT ); Wed, 20 Apr 2016 12:38:29 -0400 Received: from mail-am1on0133.outbound.protection.outlook.com ([157.56.112.133]:59295 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751240AbcDTQi1 (ORCPT ); Wed, 20 Apr 2016 12:38:27 -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: [PATCHv7 2/3] x86/vdso: add mremap hook to vm_special_mapping References: <1460987025-30360-2-git-send-email-dsafonov@virtuozzo.com> <1460989402-5468-1-git-send-email-dsafonov@virtuozzo.com> CC: , , , , , , , <0x7f454c46@gmail.com> To: From: Dmitry Safonov Message-ID: <5717ACD7.6080909@virtuozzo.com> Date: Wed, 20 Apr 2016 19:22:47 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.1 MIME-Version: 1.0 In-Reply-To: <1460989402-5468-1-git-send-email-dsafonov@virtuozzo.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AM4PR02CA0002.eurprd02.prod.outlook.com (10.165.239.140) To VI1PR0801MB1310.eurprd08.prod.outlook.com (10.167.197.148) X-MS-Office365-Filtering-Correlation-Id: dca8501b-1697-45b0-8318-08d36938261a X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1310;2:8nGG/AxzTMA5dNihmgWRvoCONjCsEeBYojFMMNtrogv1MTC8I062tJrdOg6p4fQSeEmM5JAhX7Ls/tV2z+ZH5I4yRpnJtbq6Z4nQQY8oGgIFmlxw3ITfUTp4lJrB1IkjtHVd56mQYgCAdN9kiXRQMp0hXRAtE26T07zLQek+yPOkNH9ToCm/tE1dQRTMDjFf;3:hkYG7GMNRFCVMglEXLGCaRqi3q146D8/YLT0mT1xozRt9TSCHgueNpK7oc6KgH1pVLoxoLa2oLypf4XnoAA6HTpozrCxOsd+iiQSXCRAoIdShh/m193XhKI3i0AL/iRU;25:LMa8H0J2CxsVAed5zviKRFKPcf1xigeG6DxMKG/jvWeG8JWMyTJn5U4pF8GOaRrc1jLvgb9bA2egJxdiMnfphDsdSxQyOLsq/lwQ9tibcwxroyjuLcw9gFPzX289PSVrhyU4fT4FOq8LLRM5fIXQWT7ywvrROVp/ymQ2AtAbFzgWYAZ0Eie6ABF0JIsJgN6eMEBIhstN5XoHJzhoeEVRgXb++5ignNARQtLeNQRT7Dv1WEbMy7oL/cA6L1seZX/Jz4j0Z2w38OIrs2PtvdkE9BmeJ6baDWF7KPXnO6iup8mjOA4eSlA3ZUjnDyxz/oy++fY6iCgUhIHyki+C07GlVg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0801MB1310; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(9101521026)(6040130)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6041046)(6043046);SRVR:VI1PR0801MB1310;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0801MB1310; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1310;4:DpPO6lkefnWy+QfhmXN4/+XB6M74Hb9aqOW6VRoB1j3RfSfxvvcKGiKiSbcS9NBRunKwzmxfOREIxnsO4iXcs/dgmEaeNpEv6wcKRi7NZ+ryLDH/FERxWBhNJX4blA5Wvblw0iu3bGpD73ztZ1P/v3eCxELbzadLl0VDLNWKG812mua8ebVi/BA7ILuLvYoKQCfWgpiSTZmzlO1IXnZcM8q++kkRTaqiy6xHJ7gFBO630ObMGucp6thtFMfEHXR/uti5+ma2U25X3eaQBJq2YQ/Pt/pmex0mwNOK2011yghg+gOPLpXrq/LtSEaUvgvrWwxKd5HKUyIEbEzb4a9WoGFkPfgtUnBPu3dKQRJfqivEukDtG6R3qWdjU0ku+6kQwwdegUpcyhfXYlGv9gNirN+n/OWe+IP8GhhBtST1wxYzVZ1uMkBTZUJcC265E8Yi X-Forefront-PRVS: 0918748D70 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6049001)(6009001)(377454003)(24454002)(42186005)(189998001)(586003)(2351001)(6116002)(81166005)(230700001)(3846002)(23746002)(110136002)(80316001)(87266999)(4001350100001)(4326007)(65816999)(83506001)(33656002)(86362001)(50986999)(1096002)(76176999)(54356999)(19580395003)(19580405001)(5008740100001)(65956001)(77096005)(47776003)(5004730100002)(2906002)(50466002)(66066001)(65806001)(2950100001)(92566002)(36756003);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0801MB1310;H:[10.30.26.154];FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;VI1PR0801MB1310;23:080I/xer+Zy8RFF3wxf0LSPMMGmWu2uDNNg?= =?Windows-1252?Q?DEz3722cyR9nEkfgV6VaQvizeKuCAjkmnMWNRX5r8J160FAbf4GgZoZt?= =?Windows-1252?Q?xsEIopLHHG5254R3Fh6cZ0KEmdNPUh5M+aDDBJfqmM4LXhGVHfnylORL?= =?Windows-1252?Q?DSjaWVm2/a8ha1kfGr4E7UXZgO/xRsXLNCp2T0+PrBvc6uGPD1pYt4pc?= =?Windows-1252?Q?sUFTdq3wW8Z4wZVYpQNsndSbJl7eEZRV1DAWs2ZSy/L55HUlhQufWPVV?= =?Windows-1252?Q?jYSaXcjdc9uwuzeEYSak/Ab3mpzfNsufiFlTuvAqqrnejCf4PCXhqMd3?= =?Windows-1252?Q?FzTAlwqhiekCl7uIEbyEhaJxs6DBEg/+7bOvMYVDNTi2vIgEpkrYatAA?= =?Windows-1252?Q?EJMsLw8AV0AHI9gzTl7f4Q/U2eQOfnI8dmn7vSfA2psdUIvEwwAGhwYQ?= =?Windows-1252?Q?1qU5Mzk47Vp37lQ6pOPO1CkSrHB6OPsf+HWBU0DpbwzUrU7CUekFg05M?= =?Windows-1252?Q?mmZhMR9C0grucz5GHcVWwST6NLPQzX+7WN0iT3cTY4Z94fL4yRoInBZt?= =?Windows-1252?Q?ACpQ7azgY0ibm8aVDE8Ud8yMOfQjjq93wsb0MIlPRo/4d4Ac2d/Pu6+V?= =?Windows-1252?Q?tp3gC+thQfEHm5Xm63VIYw32a0P/4acns5Xm8mcfB74IaK+pNEq5IvLB?= =?Windows-1252?Q?LfpRBVRqYh1FWhaWG8JM8lpOqFr5ErWrZ2X5VwHtjvSzQfjtgnsR0AY3?= =?Windows-1252?Q?jeMcowzX/AafOLtUfeUYy0oINZSwTmwCs25BefejFgiMUxlxn3TYZOCu?= =?Windows-1252?Q?hx+drPH/GZi4xZRGohWiK9vY9VdPbVGZQjDd8xN2bpEJKjUxl/DEAdFm?= =?Windows-1252?Q?vsseYVJATZKyf+MFnfN0h1WaJTd8rQ+6GgQX8/+vC9z1X1GZ6LA7oq3a?= =?Windows-1252?Q?8OD8ZzJ5pDVJ5cGx6tRC4TObZ4PUzhnnaxMF4rBbklJ8Cuoofj+kUOit?= =?Windows-1252?Q?cidV5+KrUiv0OEGuJMF6LunNsLHKA8UM1Kon+6StLuraoC4i0tgwtIUS?= =?Windows-1252?Q?0W9sZU+od9Rhi1ZbXVJcO8hfkrRA3u4P7ychW7k1xYvnveIOWNxcHYfT?= =?Windows-1252?Q?MtMc/qzzmyNJpMChp6FSReTFlJ8UxzNb1JLrupmGHiW62?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB1310;5:bkqpNo5KQr95xenkeveBKgItYJFM38VbZ/P5yYXQNbm2QueeUKLFw4l4iLponsqoyyHk8jPGm1YrxhncRT4PsNE9vL5k7XvMkGKavfuEvRE+UQ/eyZ5+8FFLSXhrJZOIaaLjbegWevbBS1afnGbs4ch1vj3HmuFVvsHV1TakGhMKlzmSNsoxMy+3ltcxvyqX;24:0apmlvnQ4Gp6mSD49tGJ3FhOEnwW/nCTQI7g1LctwR8p/atOB3OHMe3ZaUMhe9ezhQuOrulsYwNru9fksLSgauKTxc134C0pilnreOGzzBc=;7:14i4EATjYC4QzEOp9pIF8FjfjNXkPlVipaUu9l1IzbOk07H4h73b0eubvSG4EtXah6JqaOcjYHaopZ34CLbwZ691IYkEIgEl5TSGnil+9LyXoZJFs5MwJhg4QuwMFPv3igJ/PiI6UNdzI8MiAu+3BphTukSqUGTQrYSo3BkJn7gNGJaz4S1IqlqvmOcTB3u0LwK3mXZ7SicQ/Y2ishqOkdmLiTAH1xAF3GybPbvAV4M=;20:Wb4HNs+BViWpkh8TGxKNI2z4rCGuv1Y76iBcjI1tHI/i1vH/Rgj8+//SoIFbXNFcMIHuz1CZE8oieUSyZro80NbTuE+dzX868wy3N1nBwhWECjyK7KN993VBQ6b9YEMujsMMkofkH6nQFzhlmrNzzfzUWl3BYgEn3MMjWkx6CYI= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Apr 2016 16:23:46.0072 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1310 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6130 Lines: 171 On 04/18/2016 05:23 PM, Dmitry Safonov wrote: > Add possibility for userspace 32-bit applications to move > vdso mapping. Previously, when userspace app called > mremap for vdso, in return path it would land on previous > address of vdso page, resulting in segmentation violation. > Now it lands fine and returns to userspace with remapped vdso. > This will also fix context.vdso pointer for 64-bit, which does not > affect the user of vdso after mremap by now, but this may change. > > As suggested by Andy, return EINVAL for mremap that splits vdso image. > > Renamed and moved text_mapping structure declaration inside > map_vdso, as it used only there and now it complement > vvar_mapping variable. > > There is still problem for remapping vdso in glibc applications: > linker relocates addresses for syscalls on vdso page, so > you need to relink with the new addresses. Or the next syscall > through glibc may fail: > Program received signal SIGSEGV, Segmentation fault. > #0 0xf7fd9b80 in __kernel_vsyscall () > #1 0xf7ec8238 in _exit () from /usr/lib32/libc.so.6 > > Signed-off-by: Dmitry Safonov Andy, can I have an ack from you for this version? If it looks fine for you, of course. And for v5 test (3/3 patch)? (I did not resed it, as it hasn't changed) > --- > v7: that's just not my day: add new_vma parameter to vdso_fix_landing > sorry for the noise > v6: moved vdso_image_32 check and fixup code into vdso_fix_landing function > with ifdefs around > v5: as Andy suggested, add a check that new_vma->vm_mm and current->mm are > the same, also check not only in_ia32_syscall() but image == &vdso_image_32 > v4: drop __maybe_unused & use image from mm->context instead vdso_image_32 > v3: as Andy suggested, return EINVAL in case of splitting vdso blob on mremap; > used is_ia32_task instead of ifdefs > v2: added __maybe_unused for pt_regs in vdso_mremap > > arch/x86/entry/vdso/vma.c | 50 ++++++++++++++++++++++++++++++++++++++++++----- > include/linux/mm_types.h | 3 +++ > mm/mmap.c | 10 ++++++++++ > 3 files changed, 58 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c > index 10f704584922..d94291a19b6e 100644 > --- a/arch/x86/entry/vdso/vma.c > +++ b/arch/x86/entry/vdso/vma.c > @@ -12,6 +12,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -98,10 +99,43 @@ static int vdso_fault(const struct vm_special_mapping *sm, > return 0; > } > > -static const struct vm_special_mapping text_mapping = { > - .name = "[vdso]", > - .fault = vdso_fault, > -}; > +#if defined CONFIG_X86_32 || defined CONFIG_COMPAT > +static void vdso_fix_landing(const struct vdso_image *image, > + struct vm_area_struct *new_vma) > +{ > + if (in_ia32_syscall() && image == &vdso_image_32) { > + struct pt_regs *regs = current_pt_regs(); > + unsigned long vdso_land = image->sym_int80_landing_pad; > + unsigned long old_land_addr = vdso_land + > + (unsigned long)current->mm->context.vdso; > + > + /* Fixing userspace landing - look at do_fast_syscall_32 */ > + if (regs->ip == old_land_addr) > + regs->ip = new_vma->vm_start + vdso_land; > + } > +} > +#else > +static void vdso_fix_landing(const struct vdso_image *image, > + struct vm_area_struct *new_vma) {} > +#endif > + > +static int vdso_mremap(const struct vm_special_mapping *sm, > + struct vm_area_struct *new_vma) > +{ > + unsigned long new_size = new_vma->vm_end - new_vma->vm_start; > + const struct vdso_image *image = current->mm->context.vdso_image; > + > + if (image->size != new_size) > + return -EINVAL; > + > + if (current->mm != new_vma->vm_mm) > + return -EFAULT; > + > + vdso_fix_landing(image, new_vma); > + current->mm->context.vdso = (void __user *)new_vma->vm_start; > + > + return 0; > +} > > static int vvar_fault(const struct vm_special_mapping *sm, > struct vm_area_struct *vma, struct vm_fault *vmf) > @@ -162,6 +196,12 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr) > struct vm_area_struct *vma; > unsigned long addr, 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, > @@ -195,7 +235,7 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr) > image->size, > VM_READ|VM_EXEC| > VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, > - &text_mapping); > + &vdso_mapping); > > if (IS_ERR(vma)) { > ret = PTR_ERR(vma); > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h > index c2d75b4fa86c..4d16ab9287af 100644 > --- a/include/linux/mm_types.h > +++ b/include/linux/mm_types.h > @@ -586,6 +586,9 @@ struct vm_special_mapping { > int (*fault)(const struct vm_special_mapping *sm, > struct vm_area_struct *vma, > struct vm_fault *vmf); > + > + int (*mremap)(const struct vm_special_mapping *sm, > + struct vm_area_struct *new_vma); > }; > > enum tlb_flush_reason { > diff --git a/mm/mmap.c b/mm/mmap.c > index bd2e1a533bc1..ba71658dd1a1 100644 > --- a/mm/mmap.c > +++ b/mm/mmap.c > @@ -2930,9 +2930,19 @@ static const char *special_mapping_name(struct vm_area_struct *vma) > return ((struct vm_special_mapping *)vma->vm_private_data)->name; > } > > +static int special_mapping_mremap(struct vm_area_struct *new_vma) > +{ > + struct vm_special_mapping *sm = new_vma->vm_private_data; > + > + if (sm->mremap) > + return sm->mremap(sm, new_vma); > + return 0; > +} > + > static const struct vm_operations_struct special_mapping_vmops = { > .close = special_mapping_close, > .fault = special_mapping_fault, > + .mremap = special_mapping_mremap, > .name = special_mapping_name, > }; > -- Regards, Dmitry Safonov