From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935023AbcHaOCq (ORCPT ); Wed, 31 Aug 2016 10:02:46 -0400 Received: from mail-he1eur01on0137.outbound.protection.outlook.com ([104.47.0.137]:54192 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S934044AbcHaOB5 (ORCPT ); Wed, 31 Aug 2016 10:01:57 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=dsafonov@virtuozzo.com; From: Dmitry Safonov To: CC: <0x7f454c46@gmail.com>, , , , , , , , , , Dmitry Safonov Subject: [PATCHv4 3/6] x86/arch_prctl/vdso: add ARCH_MAP_VDSO_* Date: Wed, 31 Aug 2016 16:59:33 +0300 Message-ID: <20160831135936.2281-4-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20160831135936.2281-1-dsafonov@virtuozzo.com> References: <20160831135936.2281-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AMSPR04CA0049.eurprd04.prod.outlook.com (10.242.87.167) To HE1PR0801MB1737.eurprd08.prod.outlook.com (10.168.149.149) X-MS-Office365-Filtering-Correlation-Id: 555ffa1f-288a-4ea8-ec73-08d3d1a75caf X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;2:cxodtndPjYvLXSduQTbP8ggIyvBMgrlYqVz217+pibqj4PmuI0zEsTqF8NRObMviYHMSin+j9IVr3Lb1eCRpVwzwIWMtJBlcxnud92zX7I/WztGTGGD3+8DaVKoNHOkrhEHjOoRot3txofYjFSUGspc9A29t8wIz4XZYAtHXkLx4yMg3XUFo1Kfwem0G1fs4;3:ffgshHJ1rIbmWrZUmXBa68T7EBdYMv6YdSFgMvzrC7yGG5IzZgqRBneiWnJCNqdtEKaC/tyEgSLP0ShBkOBaBuQ6/hH6vq1OJsR6h3qjQqqpoNdTTPkeyxchlrzdIVP+;25:cxlDFhhfJlhBn5pCLAYy0/sG/K6+Ue1WIYzKUkiaGKpw7VY1jtY/Q+EvF6YLeGpVQyj8YdSfCXiJMQU2JE+6o3QTHROv/qHbz3LyhRP7waUfW/qj51/zwKqpdzTGIUhcv5M6yfINa4Crth/+7EO7+4cVX4+dipwe1fsZ5cUQQoA7GzOWt5C4WE+D7ibfqrBKpoFolGJr2xTel0fV+7cW30ycSlJ1J7Z2SH+Bz85JTxS1o57APR6fAQSKLLVv/a3wVho/PyTR8a1Ilzs6lhvyPPoRwz0OhEVFP0sO/z43SbsOSZQv1NJOf2z93vqQ5Y1IKW7w4ZVsKPyAhSrG1xWpQxKjjjE1PsegF7fCZpNmKudQgUfNlKcBfL7C1pEcNqNdFcntLZU9TG09Hm+de/GcWPSDBKpgtrRnc89V4SwXkOQ= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1737; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;31:+dRGN+SAED7sVw1BDSiYPfC0oa9nemu6H1l1n9lZZUcGUGqvsJNqXV3IWOJnofHz9ntrU9Aeyc4r28YjA/PimLlb+moMvoTYRCJ0pAkFNyIaFKdBoQ9OpODexP9tUZHC/f756pqB9JqwYVbROOxGO3wocrRX9cnWbCfHscGwwNC+FA4ETgGoLWKVdYqfrDEUBlPgNEd5LpFegaxuHhlpMZVYfzcCag9Hd3XlcSqxwhA=;4:ovNC4gliEWIdINXmToM6dYyKSaNBEXVuv/HDHBsFM64J7WHy6eurU5IhR88mfdycpxkqSo+QWYthOMtgBUGUTQfz1uI52P8mrfVPk7MllBiiWLN5v7Ml+bgc5+QY+elpkD22wBVo5iSXs6YrXI+OJ6kyGMeirO/5a5MNQzq6Hpma1jgXod5PbbRwnxMPRaZR660kE1Y+NYPRgy1Zwuh6hDdebPwT9hQAS/k1TY+DQ3/UY0pnZdDWu3foKRDqMfgeGEygg7tE7zZZnaffGJ5NkIR5P0Ln8UQMYRDSJuBUfN3GHvdejczMptTJqNH5MiXFb8dNThHGSpSZqWXBRgQ2CMC0IyHJ0uFM0wO2Dt+XongYlZkVnBzWErCOwR5el5cFm3x3IjfV7Jm6Qsst1yWzhEEz2jq+SyfQV7y1cMrSVGk= 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:HE1PR0801MB1737;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1737; X-Forefront-PRVS: 00514A2FE6 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(189002)(199003)(5003940100001)(92566002)(3846002)(1076002)(6116002)(36756003)(101416001)(105586002)(106356001)(2950100001)(586003)(97736004)(50226002)(50986999)(68736007)(76176999)(2906002)(4326007)(42186005)(19580395003)(4001430100002)(66066001)(53416004)(47776003)(7736002)(69596002)(7846002)(81166006)(81156014)(305945005)(86362001)(8676002)(107886002)(2351001)(110136002)(189998001)(19580405001)(50466002)(229853001)(33646002)(5660300001)(48376002)(77096005);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB1737;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;HE1PR0801MB1737;23:Pk+NTHf32IdB0G/ceQh760yDYsR1lH3vk3w31vR?= =?us-ascii?Q?ogX6DQOAEELY6TRXbl192rybg7ayq/IXpEXkhUSL/GxxySDosFCcyP9rZxWr?= =?us-ascii?Q?a659l/3mhVQbDO8W4XHZDWsMTWVkh/dO+b6w4UhHdpSK8CQhS8+BoKlBtWWZ?= =?us-ascii?Q?GEPdQPD3mazgcEUadmbidAxO7P1zzH5GsMTBRVVkR+2em9dsBDNfJ1x9qNry?= =?us-ascii?Q?YDp2ohIGACZybAsVRNLP9SID+34dFphQKiQ6g4XjcnAVWc1qwlROyDM2ivNj?= =?us-ascii?Q?mN6GRhwAtyjIeFhoQdZksD1FfdbcFZ9Ta1YZQIeY2PoI1p9qzZkx+nSRy/ch?= =?us-ascii?Q?I1db1d+ob42PPG6taQ6qdkZD0uerAAWKdsyLrzTJTNdzwUCnJM+bkBUyNI3m?= =?us-ascii?Q?HmKamIVvSVb4fTwU0FvadSd3N9qA8jNKYGLDcM5twH1mMrDEgeah3RUwRpvD?= =?us-ascii?Q?peHe/xR/cSqpkcRtGJAd96pNacw8W5Hhgocv9rpU80ceU9szjnKIHMCRiL8U?= =?us-ascii?Q?z0wzgjKdYi0gmL5TTk3LBTTnvVNX8BNbwkqzW8vkDXfbwdHrI5dfe98jIfC7?= =?us-ascii?Q?2B0y2eQ1gCIt92tYupkCK63HSFZJG/9/jh2jupi0KUfwAqYvnrW/sScbf11Z?= =?us-ascii?Q?D1gku3z0MC5TG2qgFTPfsDQ+SYxlh9OQYykfXxt/LlydI+XpC2knZkU5WKXl?= =?us-ascii?Q?WbERnF6NO1I/c6fD8xj4epzZhGyHbe7wsRwypv3K//nIHF/43BG3wRBRZiuB?= =?us-ascii?Q?wru6uvCC31VNNfSQc7LBPsJfKJp7K+UFLNn3Yq9XyP3PU0nSLonMsmPZWFkR?= =?us-ascii?Q?u3tUk4+qKUBHRes/Rjtnn0LO6lQxcaniRyk9nVTcGsmTridcE7dcZDFAwiFB?= =?us-ascii?Q?FZlorNs/Xk8iV0pX/UbEuKoPAnYH+tzNso/Y6AVWdBkVPmEZPDz59rKDj80b?= =?us-ascii?Q?/9Cg1K6PuRIKSoY7kHOOxuDeagSA8I6ksUf7KhBw6Ci3v6v+7qsWnXhIV5Qx?= =?us-ascii?Q?bOmLJUBxLNRv4muU70mw2/famCc3TQ0rtoUrWK2bb6Zl0CyYjt7YgxcSPJ5j?= =?us-ascii?Q?2KliefxGSA2JTUFo/F2Ozpz9EuVYos22rEXz6cMFc+tRxf7dF6pvBXFG7iYB?= =?us-ascii?Q?Hr/85QiEtcPiglrCY/qqSJSP7wunUH6CgW8mtVHCXTIpNizLT9/XKr9haPhB?= =?us-ascii?Q?L4ov4jWoPzqjdPZA6te1pNqUZpejVNaJE9Yxy?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;6:UnHGA3FhJk1vXXm8y9I/qwF1XGHDbrvKlajWC3XGQtMYcyRqEgqK7URPJBoGV2DVM31IP10YrOulgFoJSDJnsadRfCKQ7tMwxhNbpLSSP0Z0rMWr9RH0mxA3oDbWAyOErTz3boke3l8EPE5+UhQ2G80K8ontj7tBtFZbVDEk8kmQH32OsLtRwDCCj0EJdqzVrVVCrSXleFpi5v/hPpehOLuL4GpjhxGA5SZRQrmyfm8y6fGJYDXL6e+Vn1fiuDAzAMfCYa8qWR3mcfGUqvr12d4UlM35ZAuAnhpmmQEfhT76NZTwh/BIB1ThBs/QACA8;5:xa4Z1Ni9+wX0/pqbq6tkpMXchcaFkl/FOJWTcLjJTekrzUdOcJS7bnLMdFZNuYmcw+sPBU/Sutv3NTS3T4xxuzO2TpiU+ttwztszFl2JP8+WfGjSoCODXjDNbrr5NRVgB5QhvO9Vh8u/tiCHt4p4wQ==;24:nicCxCeZfDnCfOe8h2WrC7BKm/1irLUqpywocgpVzYJpP+dHdHZeUm1WkgrhDfkrIs8JTD/N2bXkHIo87sKRMKJCzbcrEUrws03jcvZKcbE=;7:qI7KZADjR4Mq3OmkPW4IiOZ47VbwEwX62jXo0SVnItrGbTPBUoyPcoEM0OXipZb93e91xfUlsAQbPMOPMkbrcdlr8PZaguYZiK35AHSBMuWsNDklRjF2HwJ0Y+QJhE4z7R5bRMNcXe/Ono5bv/YRqeCN159H4TFDC19nEhinPG9PP5u6k1L/J9KiKbTxkzoDNDqUO7k2ncRoI7N3ZXt1KGp7jcb0VMe1p5/nXYY/0LGA7igWZwAB6auIAumtr/Wy SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;20:qHO8PR32VI5RXBAUEjIPr5TSw9T/4AC/f19lIgiXi1rQ3b+Pp1GyOFoHNerpMX1UUdvz7XAb+ihng5TItkNRdqkSkseSsUjPiQTUY7m+lzOyDt7UovscbmO1SCSiThLuX7GJfxId9ZTf7To6jWckMYuC8C+kdpQ0AL+8eDRlgzE= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2016 14:01:52.3650 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1737 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..f240a465920b 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_IA32_EMULATION + 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