From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759682AbcHYQAj (ORCPT ); Thu, 25 Aug 2016 12:00:39 -0400 Received: from mail-db5eur01on0139.outbound.protection.outlook.com ([104.47.2.139]:22852 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754593AbcHYQAh (ORCPT ); Thu, 25 Aug 2016 12:00:37 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=dsafonov@virtuozzo.com; From: Dmitry Safonov To: , CC: , , , , <0x7f454c46@gmail.com>, , , , Dmitry Safonov Subject: [RFC 1/3] x86/vdso: create vdso file, use it for mapping Date: Thu, 25 Aug 2016 18:21:08 +0300 Message-ID: <20160825152110.25663-2-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20160825152110.25663-1-dsafonov@virtuozzo.com> References: <20160825152110.25663-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: VI1PR06CA0038.eurprd06.prod.outlook.com (10.162.116.176) To AM5PR0801MB1729.eurprd08.prod.outlook.com (10.169.247.7) X-MS-Office365-Filtering-Correlation-Id: baa11eff-dbea-489b-c767-08d3ccfbc336 X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;2:F+o6rVY1LDBnmsrOt89Bcbbtye0LougfAPaqNoWioALRQ5x7A3gkWHAOswrQlivnKCbi9fjJeoa3sCuNlVFYcafwsgFWd8w+3xkd7P7jEpbZQwA9f8jo9qk1NlncNzang1snb0gd7tLUeF3DV+uejS+gh5Q3KXl5oC/bYE5Av0oD8brxumA5A9+yzSqJcd70;3:bMwk17D7IEFbVnDLG3tqaPOu5tUdbST4NsDWuirZDGklhMHGMHY++pr5tQ/HvjuWdKzZmR8J9wsGj0pMws7JbeyAP9UxBeAC7BYTE41zXiRqgK5H5B9/vt7fB6NiPSq9;25:6TfZ9P1RXQXZ3dABZbkPzuHyYkEhI8XBTOWmDon0AirL+Lqd9TiBtbweVftBmWYzWFcSuYd5sRUoPnNdTBWoJr8sGXMgb9AEv6QouarZnUcxz3MEfIUv6n4xZRMdYRHo0INHqwUzXDUcbVqB6ty4y6SRmU0OlgrMnNLRXGQAQm1GCDZRUD+Lra9kaa9GMFOyBHXCoW0g41Sr8jSXsUxMfufbXLqTnLnwP6Jy0YN/ScWzVa7mrwKJH2aEnWC4jKWnIsluGmMKYEfnr4yvfdc/4wP22AGsyTsq+GfUEpFNh0yLgkMyFjm/kdifyob/x4I0rRL3EVwHn5ore/K2QedTwG3DtJ2L1yKYYmBqttn4KWiJtfKWy7BM1TTCmM7SSEM0ZvLIQlmdMuglxvPe92NAVft0mLFJLxEBRPPOjdqocPA= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0801MB1729; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;31:xClzAgltRi/DxqoObtaJOmJQRrjsuT8K9vfn000GIvFdcFp5b56ZJr0wHsCAj/rU+L9iLQVVoz6hcZzPWHi9rgHzCvGkQK6P6hX7BTfNR0WtDXfYLL3rvpxwtI5C7/EeRMInhnUR+VyZR6bVuPHnsJ1lv8BjoCiQfKIAmHmlfUm8LLi5clyIP+iWYFvxM4uHBlRrdVrLwN/TSo5X+8zshyQb+Sokuo4vHzM+paX/lYA=;4:hu0dz+nwssAmhWjQrvuI5zlWiulwRx8CEhRGbemuA6LW/lijkW813YDZ+jfqKJLsSk8nWyzM3gkFGUQqjVwfatvRmlqDM9P3GMDJTkpq8Bh9h6gYUMiY6M7q23/7+92sksvktIy5yOx9MsJorGXOMynRwvBOtdJWS/4QfZqbzhlvMddOPTLht0+9JffAbmlTU48io+muP926m5Q49Idm7EdFrc+u4jJqC5DTc5gWApMJ8VNQSTlfj0woOKNFH0jmWxhFQkO2vCw2Ej/PhoVQz4ZAIhOSoMZLzj7kGTkJono0I2jtUrS9A/9/SXHggIHBD1YwIQPOd7BiKYBRporMlEZ4K7qrGLDvYdTulRPB6x7k8kAeaCmBNu4opUb+7O+Z0RzJ2JefosDushvXjvgKOdJfGj2qQoGEGFcavT2cvafixA/37IlmW49CYHqOlY4zm+vQm1uWI47T7UqjK+m7Nw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(788757137089); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6043046)(6042046);SRVR:AM5PR0801MB1729;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0801MB1729; X-Forefront-PRVS: 0045236D47 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(189002)(199003)(7846002)(81166006)(4326007)(189998001)(105586002)(50466002)(48376002)(33646002)(36756003)(19580405001)(8676002)(6116002)(97736004)(81156014)(2950100001)(2906002)(7416002)(1076002)(77096005)(50226002)(3846002)(19580395003)(5660300001)(305945005)(68736007)(101416001)(76176999)(50986999)(86362001)(4001430100002)(7736002)(586003)(42186005)(53416004)(69596002)(66066001)(5001770100001)(47776003)(107886002)(229853001)(92566002)(5003940100001)(106356001)(21314002);DIR:OUT;SFP:1102;SCL:1;SRVR:AM5PR0801MB1729;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM5PR0801MB1729;23:Bzj9do+9yihJt1ob7zVBw3NNxeCX4B38aHtgSdC?= =?us-ascii?Q?F7vo/KiLKqiPRJAsV3pGRsQazR5MKCdPzemParsJ9FARDF5Fk5FYf22Bb0zX?= =?us-ascii?Q?ZyH5jp+Hzaa9OkM3rhmIy2o2Tu/sxC8f5s9ryghtws7V5SDy0kvIiIUx1j/Z?= =?us-ascii?Q?uZq5UVi4qqO6hTBJuqEI+JD37WzRJN2FWMESxf0z6oXByRRI2SHhgHzXYncW?= =?us-ascii?Q?UosNZrCKO1b7frgFPOJSEoDQqaHHXM8ov7b70fqYCMtpXrgV8nInUATovZMG?= =?us-ascii?Q?kUGTe15EDezTGiqFh5PTOQN9vxnddQ1oRTrF1FX5y+WS52lrsKa9AqycX9Tq?= =?us-ascii?Q?maA00a015LO/wAOo9NuqpXtpmOrzsjYcDshG1p9EtBISkCV6qaLcO6AR8X06?= =?us-ascii?Q?hAhpFb4csEfkKMF+qMcKWfQVzFRSrP6JbR6dr+zNOb9FvihZY70T2ZVL+G51?= =?us-ascii?Q?H9juBNNlXy+DZgpFHD2ehAjL62//FI/TsHqVIOZrU4ByxFyl+aHxc209CN+G?= =?us-ascii?Q?skJtrcEtZo9JSFq1Juj32rHhzWRTMzs645/RKhowZ3X3J9rKubEIP9Odjg4w?= =?us-ascii?Q?NiIT4l8nstyWoXvrUxLj668H4LDtJBVhxCpqNsMasQ2vmLkNscyZqaUtfq4d?= =?us-ascii?Q?jBSCZWG8LV6R6GRAPxkcaJkHBvVFpW3seH1nBTUN/aLd9z8PjfC5/of9E4Tf?= =?us-ascii?Q?rdJhw154qtiuU9sHOm2wcmFAjd2AOKpPsldYzL4ht3V8DzlDR26UMlcnf/Pi?= =?us-ascii?Q?30iUOzNb+U1ZGEDlGaKYjsaQrWLO+NN9aT/xr4w1OcxXycXE11crpSc3xLTx?= =?us-ascii?Q?+8+L50kZHLiuZ/6G//5IFx9D+471E+PxWNO0Eg8C9KdspCVjUdy6LW0UhFpO?= =?us-ascii?Q?1MiRliMAEYiGiFLBT3fBoD6fk5pIbnD+r9apC3IJBAoNChKTFER5jEv6lOel?= =?us-ascii?Q?ybNE2ceyeH13wLypp4EJWvMC41RgR56nDaPD93B+nioFM68Qhp3K+a3y0SFv?= =?us-ascii?Q?QKgl+MajYr1vFgn12qc4p1BKeLhkqnuwzHR4M1O52GOUw1Y/bHA5DefdlzyR?= =?us-ascii?Q?Iv5XZSxwYH4VWnd40uZyDm8lK/OKJKxYwCSsl7giYcb2wbZye0MBnVdVK2b5?= =?us-ascii?Q?cwxXBEnZmJ5yh2my/eiybWBNvdWyt8VysQ3MrZ8ZqRrINYIFN/+RINdMDE0w?= =?us-ascii?Q?y7FgqmxOB9IdNjW9oJCBhDCX7dB/+GX9bgxHvE/0NlgOeoyJvpT+/I92XL5K?= =?us-ascii?Q?ayTnzOUB273EjlmkYqtg=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;6:3YT3FB9EaoHJQjI1YwJJheZGhx82SwZ1g53CxD45//TUDmhq+0i1R+4X7sdl8SHiSv1KPOj4IJm1XVXrZfjY1mZScoEMDTxsVDBLVTl+GK+8o/onxGchBXLv2kA86k8i4EOZ2ugHBg2on0ax0gvIekFAXdSGZH//WNsh7QgSCFpHD4UCRNczv1hHQ6ZvEyUnOIFPjvoA7zStgfGvhNKud9ccsFLbxv8oAXLOXgPfvTcgXLXsuK6SkC3pxbE2wRGhEnwU3JxYLIaIFDjfw9xbSH5bX13eVotASYcJ2zaJ9OyzgO/zMVry7uxCYzQllPBX;5:7vr2w//lZrvncgumTeddfQqNPPNYfyl3B+TthymJIMD9lgH884hZ+IqzoJjPHzXZzlnsqZgq0MDnOg+solZ4dcNG6KFG3v25K8C7F2AutxrKUQ3v64i9nw09VQajaUS14ZSVQirVZsuwKJe0y6srhA==;24:PE12alD1NSxNwFbvKIFNgLc7NoQGzoyTy/1gSef9vu0nSLM7RxCsSBDzpUpAjihYPMBjAXOMutWY/ib/PHYKwdB6+LmbdrRQHCsOMjyR1xs=;7:2w7oSL2YFXY0k7lcqCeGjwfAnd0RVJ+w2U+A8pQwTnWPmDEA6Pt77hRs4mggcMj7QZSsoRgPN7STvE/z7M3YUHK/ODWoiYwVVegVOd7yJw6A1a46fV28t8CAsYUsPF+v8tHxX3fRYbd9izLVzMZgwZdV7LD6sGOWtuwbViU3UD7ol2YkKBo2PDrRk4OwN0hbRfQsogFi5a9ZrEJxwgm9n4ruO8AhdEmTnd8fH10WF3XXyp6tURHIfXdzI+QaFUrx SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;20:HVvEWPB+LMkQWKGCfO7FmEr/sH4PIFhFHniy6YpRMSO9AxumMURGXGBP3yDVWmok/RAEmpIRb+/Y48pn6LLgZo5QFitntjU6sdlELA3hsRyu+ZCYf10GsfmrHFEbJM0GPt/5wQA4D1gnAwu0+lpn4MHeAKUSY/PM7NW0SRFqons= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Aug 2016 15:23:26.2026 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0801MB1729 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I added here a new in-kernel fs with ramfs-like options. Created vdso file in this fs (yet for testing, only 64-bit vdso). Mapped this file to process's mm on setup_additional_pages. Just for testing purpose it's done only for specific UID. Signed-off-by: Dmitry Safonov --- arch/x86/entry/vdso/vma.c | 146 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 140 insertions(+), 6 deletions(-) diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c index f840766659a8..e83830e422ae 100644 --- a/arch/x86/entry/vdso/vma.c +++ b/arch/x86/entry/vdso/vma.c @@ -13,6 +13,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include @@ -35,6 +39,9 @@ void __init init_vdso_image(const struct vdso_image *image) image->alt_len)); } +static struct vfsmount *vdso_mnt; +struct file *vdso_file_64; + struct linux_binprm; /* @@ -217,12 +224,31 @@ static int map_vdso(const struct vdso_image *image, bool calculate_addr) /* * MAYWRITE to allow gdb to COW and set breakpoints */ - vma = _install_special_mapping(mm, - text_start, - image->size, - VM_READ|VM_EXEC| - VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, - &vdso_mapping); + if (__kuid_val(task_uid(current)) == 1001) { + unsigned long n_addr = mmap_region(vdso_file_64, text_start, + image->size, VM_READ|VM_EXEC| + VM_DONTEXPAND|VM_SOFTDIRTY| + VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, 0); + if (text_start != n_addr) { + pr_err("Failed to mmap vdso file at %lx, mmap_region returned %lx\n", + text_start, n_addr); + goto old_way; + } + vma = find_vma(mm, text_start); + if (IS_ERR(vma) || vma->vm_start != text_start) { + pr_err("Failed to find vdso mapped vma at %lx\n", + text_start); + goto old_way; + } + } else { +old_way: + vma = _install_special_mapping(mm, + text_start, + image->size, + VM_READ|VM_EXEC| + VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, + &vdso_mapping); + } if (IS_ERR(vma)) { ret = PTR_ERR(vma); @@ -336,6 +362,109 @@ static int vgetcpu_online(unsigned int cpu) return smp_call_function_single(cpu, vgetcpu_cpu_init, NULL, 1); } +static __init int add_vdso_pages_to_page_cache( + const struct vdso_image *vdso_image, struct inode *inode) +{ + unsigned long i; + int ret; + + for (i = 0; i < (vdso_image->size / PAGE_SIZE); i++) { + struct page *page = virt_to_page(vdso_image->data + + (i << PAGE_SHIFT)); + int ret; + + __SetPageLocked(page); + ret = add_to_page_cache_locked(page, inode->i_mapping, + i, __GFP_REPEAT); + __SetPageUptodate(page); + __ClearPageLocked(page); + if (unlikely(ret)) + goto put_pages; + } + return 0; + +put_pages: + while (i > 0) + put_page(virt_to_page(vdso_image->data + (i << PAGE_SHIFT))); + return ret; +} + +static char *vdso_vma_name(struct dentry *dentry, char *buffer, int buflen) +{ + return "[vdso]"; +} +static const struct dentry_operations vdso_dops = { + .d_dname = vdso_vma_name, +}; + +static __init struct file *init_vdso_file(const struct vdso_image *vdso_image, + const char *name) +{ + struct super_block *sb; + struct qstr name_str; + struct inode *inode; + struct path path; + struct file *res; + + if (IS_ERR(vdso_mnt)) + return ERR_CAST(vdso_mnt); + sb = vdso_mnt->mnt_sb; + + name_str.hash = 0; + name_str.len = strlen(name); + name_str.name = name; + + res = ERR_PTR(-ENOMEM); + path.mnt = mntget(vdso_mnt); + path.dentry = d_alloc_pseudo(sb, &name_str); + if (!path.dentry) + goto put_path; + d_set_d_op(path.dentry, &vdso_dops); + + res = ERR_PTR(-ENOSPC); + inode = ramfs_get_inode(sb, NULL, S_IFREG | S_IRUGO | S_IXUGO, 0); + if (!inode) + goto put_path; + + inode->i_flags |= S_PRIVATE; + d_instantiate(path.dentry, inode); + inode->i_size = vdso_image->size; + + res = ERR_PTR(add_vdso_pages_to_page_cache(vdso_image, inode)); + if (IS_ERR(res)) + goto put_path; + + res = alloc_file(&path, FMODE_READ, &ramfs_file_operations); + if (!IS_ERR(res)) + return res; + +put_path: + path_put(&path); + return res; +} + + +static struct file_system_type vdso_fs_type = { + .name = "vdsofs", + .mount = ramfs_mount, + .kill_sb = kill_litter_super, +}; + +static int __init init_vdso_fs(void) +{ + int ret; + + ret = register_filesystem(&vdso_fs_type); + if (ret) + return ret; + + vdso_mnt = kern_mount(&vdso_fs_type); + if (IS_ERR(vdso_mnt)) + return PTR_ERR(vdso_mnt); + return 0; +} + +/* XXX: replace BUG_ON with return to old-way vdso handling */ static int __init init_vdso(void) { init_vdso_image(&vdso_image_64); @@ -344,6 +473,11 @@ static int __init init_vdso(void) init_vdso_image(&vdso_image_x32); #endif + BUG_ON(init_vdso_fs()); + + vdso_file_64 = init_vdso_file(&vdso_image_64, "vdso_image_64"); + BUG_ON(IS_ERR(vdso_file_64)); + /* notifier priority > KVM */ return cpuhp_setup_state(CPUHP_AP_X86_VDSO_VMA_ONLINE, "AP_X86_VDSO_VMA_ONLINE", vgetcpu_online, NULL); -- 2.9.0