From patchwork Tue Oct 27 10:05:32 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott James Remnant X-Patchwork-Id: 37017 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from chlorine.canonical.com (chlorine.canonical.com [91.189.94.204]) by ozlabs.org (Postfix) with ESMTP id 8D51AB7BBF for ; Wed, 28 Oct 2009 04:52:26 +1100 (EST) Received: from localhost ([127.0.0.1] helo=chlorine.canonical.com) by chlorine.canonical.com with esmtp (Exim 4.60) (envelope-from ) id 1N2qDV-00058F-I8; Tue, 27 Oct 2009 17:52:21 +0000 Received: from zelda.netsplit.com ([87.194.19.211]) by chlorine.canonical.com with esmtp (Exim 4.60) (envelope-from ) id 1N2qDE-0004zw-JW for kernel-team@lists.ubuntu.com; Tue, 27 Oct 2009 17:52:05 +0000 Received: from scott by zelda.netsplit.com with local (Exim 4.69) (envelope-from ) id 1N2qD9-0007zT-6S for kernel-team@lists.ubuntu.com; Tue, 27 Oct 2009 17:51:59 +0000 From: Scott James Remnant Date: Tue, 27 Oct 2009 10:05:32 +0000 Subject: [PATCH 2/2] UBUNTU: SAUCE: trace: add trace events for open(), exec() and uselib() To: kernel-team@lists.ubuntu.com In-Reply-To: <1256665780.2186.43.camel@wing-commander> References: <1256665780.2186.43.camel@wing-commander> Message-Id: X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.8 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: kernel-team-bounces@lists.ubuntu.com Errors-To: kernel-team-bounces@lists.ubuntu.com This patch uses TRACE_EVENT to add tracepoints for the open(), exec() and uselib() syscalls so that ureadahead can cheaply trace the boot sequence to determine what to read to speed up the next. It's not upstream because it will need to be rebased onto the syscall trace events whenever that gets merged, and is a stop-gap. Signed-off-by: Scott James Remnant Acked-by: Stefan Bader Acked-by: Andy Whitcroft --- fs/exec.c | 8 +++++ fs/open.c | 4 ++ include/trace/events/fs.h | 71 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 0 deletions(-) create mode 100644 include/trace/events/fs.h diff --git a/fs/exec.c b/fs/exec.c index 172ceb6..c936999 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -56,6 +56,8 @@ #include #include +#include + #include #include #include @@ -130,6 +132,10 @@ SYSCALL_DEFINE1(uselib, const char __user *, library) fsnotify_open(file->f_path.dentry); + tmp = getname(library); + trace_uselib(tmp); + putname(library); + error = -ENOEXEC; if(file->f_op) { struct linux_binfmt * fmt; @@ -665,6 +671,8 @@ struct file *open_exec(const char *name) fsnotify_open(file->f_path.dentry); + trace_open_exec(name); + err = deny_write_access(file); if (err) goto exit; diff --git a/fs/open.c b/fs/open.c index 04b9aad..41c87f3 100644 --- a/fs/open.c +++ b/fs/open.c @@ -31,6 +31,9 @@ #include #include +#define CREATE_TRACE_POINTS +#include + int vfs_statfs(struct dentry *dentry, struct kstatfs *buf) { int retval = -ENODEV; @@ -1041,6 +1044,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, int mode) } else { fsnotify_open(f->f_path.dentry); fd_install(fd, f); + trace_do_sys_open(tmp, flags, mode); } } putname(tmp); diff --git a/include/trace/events/fs.h b/include/trace/events/fs.h new file mode 100644 index 0000000..e967c55 --- /dev/null +++ b/include/trace/events/fs.h @@ -0,0 +1,71 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM fs + +#if !defined(_TRACE_FS_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_FS_H + +#include +#include + +TRACE_EVENT(do_sys_open, + + TP_PROTO(char *filename, int flags, int mode), + + TP_ARGS(filename, flags, mode), + + TP_STRUCT__entry( + __string( filename, filename ) + __field( int, flags ) + __field( int, mode ) + ), + + TP_fast_assign( + __assign_str(filename, filename); + __entry->flags = flags; + __entry->mode = mode; + ), + + TP_printk("\"%s\" %x %o", + __get_str(filename), __entry->flags, __entry->mode) +); + +TRACE_EVENT(uselib, + + TP_PROTO(char *filename), + + TP_ARGS(filename), + + TP_STRUCT__entry( + __string( filename, filename ) + ), + + TP_fast_assign( + __assign_str(filename, filename); + ), + + TP_printk("\"%s\"", + __get_str(filename)) +); + +TRACE_EVENT(open_exec, + + TP_PROTO(char *filename), + + TP_ARGS(filename), + + TP_STRUCT__entry( + __string( filename, filename ) + ), + + TP_fast_assign( + __assign_str(filename, filename); + ), + + TP_printk("\"%s\"", + __get_str(filename)) +); + +#endif /* _TRACE_FS_H */ + +/* This part must be outside protection */ +#include