From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759556AbcHYP7s (ORCPT ); Thu, 25 Aug 2016 11:59:48 -0400 Received: from mail-db5eur01on0118.outbound.protection.outlook.com ([104.47.2.118]:16864 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1759212AbcHYP7n (ORCPT ); Thu, 25 Aug 2016 11:59:43 -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 3/3] uprobe: add vdso support Date: Thu, 25 Aug 2016 18:21:10 +0300 Message-ID: <20160825152110.25663-4-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: 6b6089c9-fb15-4828-229e-08d3ccfbc4f0 X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;2:5f4rP6Ta9prGlh6Byihufm5V+zjNQxkRBCkVRxMdo60viVEyTlG0c/Fh8XeBLutoPUR2oJSmR2932ww6GWJ4bf8JgbyBC3J3lfN7UlX97cNAH5F+Kpra+i6dQTsd/c7GdcjYNoPLoGiOQWNsMmxETMY2JZX9afQIBjJJUZeIYvdhf9pcOlqBQfSpQ0MIywIs;3:m8dLwc42R/jenLNsSgpYdviQaSkqgwvdDwFQpaEi4b4BlbCl/ZZqG2H8qjU+hiz7hgdygjl0EAhRQcaRya87vzCSa9E15yb+xItm2a5AXoROGFsQEz11t3LonFTvQmLK;25:02SA/mjmUU/B9buplVl5N0AGCR6EJ7b/0RHmAhzYGfweTp5SDRG4WId+y2ugrsnUDs3+2CkOxPJBM4cWXf+v2I/0HkfftQj9lbHn9pCr4piJQDiQoq5ft3F86VzzW/tnfTKcW3L7SDU7o5EVAJpkSNQZ+h4m02+BnFDISAMnyxYoBlSvsjgc/AhNBDmonQn1L8YXHYKsxO0ymto0i7YCBislDL2BcbG0sGdDjFszMWzqrqO1VXYkPyo+ZiD0hP3dcNxp8A4z6fwc92FF1Q2d95+5KVDo2bgccrXAJ4FnlEl8a6taIsfeDrNDOZ5uDiNG3Zik85YsfzfTeVKPvFBh9j7kDGHcaIKhHAlwAXsxMBAYxe2okqO1E1nT83blRiL8kVQbt84kYWmfzuKFjtZGnyFOr1SWbO7qOvCByIMBo7A= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM5PR0801MB1729; X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;31:skQzFidbGBAFcm2/jS7sixMTO8MqDztwuWI3XQg2gbLHOPcta+oztRygwe16d8hKK7EtBClRtTlWt763PkERConBWK19d8StDYZUQjXxgXGQ1Qdjgpgkq4h3HzXHyfs7LpmuO/1vxqMC65EHltHUee0Z8GElAPvdVvU9zk15hSnfP5B4742YGEDulFSWENqv7cgF21lngLxSROHxuq23JzEA/SwkmhteOOjJWwrFzBY=;4:PTRdjPtx4K1o67lSLo/yjaVo3obSEHoj5cywjfUn42qqntZO0H2aLp8q9/kZOD3QrkKZ2nw6VB7bZQPN+dkTC+a4LXg98HbQM88EKMYE+AOMdU6nXqmbQZwzmOXifb5DVsYSlq6cBWuCXk3q3/GdEu9FwMfIEAesDy/jh8ANB9BxeiIZxswHa0ruPRNG0Krgf5ICOACOFi2MDURDIIqSS6v3bkA+GCgeN8le0AQiApUVb+U3Okd1ynJOg4PUlY5/JegOUdZs+UUeE9bIzpv03XrLY/1BfUOW4QdxJGLyKV3dqXQh9HjFgugV1j1Cd8q52mdgufagSOjcCaRQ6djqayqlGwujxbb/tYsA3azCVHHZnDyx1XBQB1IDas9lkBC7ccdHzWxqdYbCf/f4s264KvRVkpEXeaZAxcWZEBfcQTE= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; 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);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:EfVVYwlxKO01wxpkd32KIw8QcW33v/7cJqQiWP8?= =?us-ascii?Q?rfGlG26fz9tCTkMaHoSmWXOvMO7Eys0QVL22Sxb5c0Q1e8Oqq1jywGhpJG8b?= =?us-ascii?Q?82JXk8Lv6052mYHOAcD/ZjMEUpM6pr5hX+MhaLYt7jgXnLExUKRJRhgwPrFb?= =?us-ascii?Q?9wnrZnbJr2Ra2xrDFtJnA3smXwC1jlgkglUl4uWwbL8RCUxkST5Y+k4u+oRs?= =?us-ascii?Q?i3+SkvJovSFsM5BWRozR5uET8Pq3BMq1HEzh3FGBv7+bPJgau9jrW61NyPkm?= =?us-ascii?Q?Ytm4XhI0i5xwEjG+PpOaqMISlfYtxrulXzd1paGdaQqJISDYOZcDKGh5YVrV?= =?us-ascii?Q?R52iaG+cTSxxaXFglqTJQolzBwBWUKyoI3B0WeNjmypg9S9t5qdP2To8GoU0?= =?us-ascii?Q?1g06e41oQUxKqEdgsm/eNa6Q5zA1qZit5GuIr/2JGCZMRr6fmlEhUjkWaMbT?= =?us-ascii?Q?WXtIGwQ9VrGq6pl1JMc1CaHD59oJwuV7TSuc9uqiYkzL7D/+fh0tE/rx9eOX?= =?us-ascii?Q?CTdvw10+3cGLa+1QzUoKj0+uyhcihVmwhT9Zc2MuiabFo0qXiriIaB3uLpVh?= =?us-ascii?Q?E4RF2De0iacgAHlZeHPygYlVqNtLmNUAeD6XruR0mvtsEdGEX2KnHcv1M8H4?= =?us-ascii?Q?9bgO+aZakKulTg1ja456oXq1GIL1B6nrlEd8F0y+JwL9JiRV7hMtaTij+eZt?= =?us-ascii?Q?zShdkCVa/9opmNdwRDtc+8AzcJgYr0zywGNsXtNnGL0jnumjq3qYqL0Z9gzO?= =?us-ascii?Q?qmeRmNM/Z6+ElP3I4WrD8o2kWuOZ/ClHxaTpDiuFd46tgCKrY1FehQBjR3ZB?= =?us-ascii?Q?GFOzVso+7rmuVjzC0FJAN3bpTiH2vKyCZRpGKKvxVly6sMxQTi+jopcz+JUH?= =?us-ascii?Q?vsoLWBBjrdUCBbdOrVIepd+iVtC5h2phU4R7TKOZ+AwKNbM5Qso4+U+zo7SA?= =?us-ascii?Q?tbH+wrenKRvTo4B8cleT/G0Fu/rtRMyA7Vt2eVTRHf7D3/jTj1+pfefBbCeb?= =?us-ascii?Q?SUd6hAPVUn4YfIlHudkt4QoC1JGsEuChyLnDlJpzZi2QAlE8kgKxeV4KKFvg?= =?us-ascii?Q?L6W8h3+8BbsrV2djv60WU78RJCSAf+7/IHOYDiCA4w8pXVwPs50TBgaijHqL?= =?us-ascii?Q?KwZvf1szql+BXCnD9pK+9CTorjZ3zbhxuqdQwufoSZPRFFIGRKUvMz7RnZqw?= =?us-ascii?Q?noSpWEW2LNXnxvKXk5sggkRfZc1W52PcniGh2yoT59sxk38zgQvjqvIz70A?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;6:6jHCdORJazOTHAhsE9qOY2moY5rEOGPbreO990UcdcLOISdE8c+5QdLcKmjEgbjgPXEeqgaF+HWAzCgO1Wy7BzWXBJIddxkErBEbuk0CtykusnXNxNWEVf9Fh2EBMk707xfxkcMkEKRhIaMyr75aNlIi5/cmur86dClLA1j7iqs/j3Hwa5maUKfReBn3zsXPlq9gD6aOxC9VHFvqPK9v+OHrRndVc92qHtYeSevrh8ek/p2+wSvoSYJ/AHp5Guz041Jxh98RuPQcuoqgCRv6rEYeA4AIxkmrSY9I+b3nvobMUReM7ifFYeytP1IqS4iG;5:/nD324CsX2zFpmvwzh5g/vXcnwkvvEC1fvv6lIs9hS7zRFHqElPEJGr0HUaVX3U7T0Nr9Mmo6AY15Cl7p+e/3DkZJNEj4I7okJTLpcwcn56etemSRVXNZA5EftELHVhTE2sVvpWYiww6UKoO2zwapA==;24:2AA59HPG/AfN0ki5IOXIbDjZ173S724zhddBD3GEeZ0cRKyCG67smOO3gI5VF67HzQlL8WiNC0Ye8BOTE1KzVwBKe8abytxIKLEpKGJQDxE=;7:9rxD58DSINuEVZo8fxOYobn3ZRfTl8xYDrFldZ0YNNsdsHYGad9voY0wfD/zOXLdySHunJR2RIm7f9MQHZUUiXhGizwky9CmB04H0hTMS5AZ4gUphbwPCsAP9iBF0WYh6qnLLqUalNBo5mWC1qg7npbVtpuCSVfLL6zTcjS4fNJftbGTT3cvgN2uNCF9eszAmJ9wyRaIqGDHGpPR+zJEeTxh+hV6+Otbc88mx6lRUP7vX7NmPBHu9horFpt8TQdX SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM5PR0801MB1729;20:3v9jt4gc+CWossFlWKuq1//s7HUp6rY5ypvNyjjf51vhmPgPfMf4Up+BMMXhdgiQ7tHdgeUkx7smqzZiU8KK6n0gFg/JnPdufbmqFCIiGSBZttBPoA+SKejG4d1tnyc3Y7BvTmizCs9Lu0qVLSoe+eRMQkQ9//l63uUnOAPn0y8= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Aug 2016 15:23:29.1181 (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 For RFC, this patch is full of hacks: - non-generic vdso_mnt -- it will not built on !x86_64 - used externs in trace_uprobe.c, rather than clean header-includes This patch converts vdsofs from lookup-less, renames vdso file name to just "64". It also adds support to uprobe_events for setting uprobe to vdso image file. One can set vdso uprobe now like this: echo 'p:gettimeofday :vdso:/64:0xc50' >> uprobe_events Signed-off-by: Dmitry Safonov --- arch/x86/entry/vdso/vma.c | 28 ++++++++++++++------------- kernel/trace/trace_uprobe.c | 46 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c index e83830e422ae..9e966b649028 100644 --- a/arch/x86/entry/vdso/vma.c +++ b/arch/x86/entry/vdso/vma.c @@ -39,7 +39,7 @@ void __init init_vdso_image(const struct vdso_image *image) image->alt_len)); } -static struct vfsmount *vdso_mnt; +struct vfsmount *vdso_mnt; struct file *vdso_file_64; struct linux_binprm; @@ -401,38 +401,40 @@ 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; + int ret; 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) + path.dentry = d_alloc_name(vdso_mnt->mnt_root, name); + if (!path.dentry) { + pr_err("Failed to allocate dentry for %s vdso file\n", name); 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) + if (!inode) { + pr_err("Failed to get inode for %s vdso file\n", name); goto put_path; + } inode->i_flags |= S_PRIVATE; - d_instantiate(path.dentry, inode); + d_add(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)) + ret = add_vdso_pages_to_page_cache(vdso_image, inode); + if (ret) { + pr_err("Failed to put %s pages in page cache: %d\n", name, ret); goto put_path; + } res = alloc_file(&path, FMODE_READ, &ramfs_file_operations); if (!IS_ERR(res)) @@ -475,7 +477,7 @@ static int __init init_vdso(void) BUG_ON(init_vdso_fs()); - vdso_file_64 = init_vdso_file(&vdso_image_64, "vdso_image_64"); + vdso_file_64 = init_vdso_file(&vdso_image_64, "64"); BUG_ON(IS_ERR(vdso_file_64)); /* notifier priority > KVM */ diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index a74f2d9ff379..3d4dc6c6ddd9 100644 --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "trace_probe.h" @@ -352,6 +353,9 @@ end: * * - Remove uprobe: -:[GRP/]EVENT */ +extern struct vfsmount *vdso_mnt; +extern int vfs_path_lookup(struct dentry *, struct vfsmount *, + const char *, unsigned int, struct path *); static int create_trace_uprobe(int argc, char **argv) { struct trace_uprobe *tu; @@ -427,15 +431,41 @@ static int create_trace_uprobe(int argc, char **argv) pr_info("Probe point is not specified.\n"); return -EINVAL; } - arg = strchr(argv[1], ':'); - if (!arg) { - ret = -EINVAL; - goto fail_address_parse; - } + if (argv[1][0] == ':') { + arg = strchr(&argv[1][1], ':'); + if (!arg) { + ret = -EINVAL; + goto fail_address_parse; + } + *arg++ = '\0'; + if (strcmp(&argv[1][1], "vdso")) { + ret = -EINVAL; + goto fail_address_parse; + } + filename = arg; + arg = strchr(filename, ':'); + if (!filename) { + ret = -EINVAL; + goto fail_address_parse; + } + *arg++ = '\0'; + if (!vdso_mnt) { + ret = -ENODEV; + goto fail_address_parse; + } + ret = vfs_path_lookup(vdso_mnt->mnt_root, vdso_mnt, + filename, LOOKUP_FOLLOW, &path); + } else { + arg = strchr(argv[1], ':'); + if (!arg) { + ret = -EINVAL; + goto fail_address_parse; + } - *arg++ = '\0'; - filename = argv[1]; - ret = kern_path(filename, LOOKUP_FOLLOW, &path); + *arg++ = '\0'; + filename = argv[1]; + ret = kern_path(filename, LOOKUP_FOLLOW, &path); + } if (ret) goto fail_address_parse; -- 2.9.0