mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Dmitry Safonov <dsafonov@virtuozzo.com>
To: <linux-kernel@vger.kernel.org>, <mingo@redhat.com>
Cc: <luto@amacapital.net>, <tglx@linutronix.de>, <hpa@zytor.com>,
	<x86@kernel.org>, <0x7f454c46@gmail.com>, <oleg@redhat.com>,
	<rostedt@goodmis.org>, <viro@zeniv.linux.org.uk>,
	Dmitry Safonov <dsafonov@virtuozzo.com>
Subject: [RFC 3/3] uprobe: add vdso support
Date: Thu, 25 Aug 2016 18:21:10 +0300	[thread overview]
Message-ID: <20160825152110.25663-4-dsafonov@virtuozzo.com> (raw)
In-Reply-To: <20160825152110.25663-1-dsafonov@virtuozzo.com>

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 <dsafonov@virtuozzo.com>
---
 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 <linux/uprobes.h>
 #include <linux/namei.h>
 #include <linux/string.h>
+#include <linux/mount.h>
 
 #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

  parent reply	other threads:[~2016-08-25 15:59 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-25 15:21 [RFC 0/3] Put vdso in ramfs-like filesystem (vdsofs) Dmitry Safonov
2016-08-25 15:21 ` [RFC 1/3] x86/vdso: create vdso file, use it for mapping Dmitry Safonov
2016-08-25 19:49   ` Dmitry Safonov
2016-08-25 20:05     ` Dmitry Safonov
2016-08-28 20:14   ` Cyrill Gorcunov
2016-08-29  9:18     ` Dmitry Safonov
2016-08-29  9:28   ` Andy Lutomirski
2016-08-29  9:50     ` Dmitry Safonov
2016-08-30 14:58       ` Andy Lutomirski
2016-09-03  0:08     ` Al Viro
2016-08-30 14:33   ` Oleg Nesterov
2016-08-30 14:53     ` Dmitry Safonov
2016-09-03  0:13     ` Al Viro
2016-09-03  0:20   ` Al Viro
2016-09-03  7:32     ` Dmitry Safonov
2016-08-25 15:21 ` [RFC 2/3] uprobe: drop isdigit() check in create_trace_uprobe Dmitry Safonov
2016-08-29 22:58   ` Steven Rostedt
2016-08-29 22:59     ` Steven Rostedt
2016-08-29 23:01       ` Dmitry Safonov
2016-08-30 14:37       ` Oleg Nesterov
2016-08-30 21:15         ` Steven Rostedt
2016-08-31 12:07           ` Oleg Nesterov
2016-08-30 14:57     ` Srikar Dronamraju
2016-08-25 15:21 ` Dmitry Safonov [this message]
2016-08-25 20:49 ` [RFC 0/3] Put vdso in ramfs-like filesystem (vdsofs) H. Peter Anvin
2016-08-25 22:53   ` Dmitry Safonov
2016-08-25 23:00     ` H. Peter Anvin
2016-08-26 11:16       ` Dmitry Safonov
2016-08-26 14:32         ` Andy Lutomirski
2016-08-26 14:42           ` Dmitry Safonov
2016-08-26 14:44             ` Dmitry Safonov
2016-09-21  0:22     ` H. Peter Anvin
2016-09-21  0:32       ` H. Peter Anvin
2016-09-21  0:54         ` Andy Lutomirski
2016-09-21  1:07           ` H. Peter Anvin
2016-09-21  1:17             ` H. Peter Anvin
2016-09-21  6:39               ` Andy Lutomirski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160825152110.25663-4-dsafonov@virtuozzo.com \
    --to=dsafonov@virtuozzo.com \
    --cc=0x7f454c46@gmail.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=mingo@redhat.com \
    --cc=oleg@redhat.com \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=viro@zeniv.linux.org.uk \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome