| From ee9c0b591bf16ca11bb354bc68dae75a903f3a64 Mon Sep 17 00:00:00 2001 |
| From: Scott James Remnant <scott@ubuntu.com> |
| Date: Tue, 27 Oct 2009 10:05:32 +0000 |
| Subject: [PATCH] trace: add trace events for open(), exec() and uselib() |
| |
| 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 <scott@ubuntu.com> |
| --- |
| 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 <linux/fsnotify.h> |
| #include <linux/fs_struct.h> |
| |
| +#include <trace/events/fs.h> |
| + |
| #include <asm/uaccess.h> |
| #include <asm/mmu_context.h> |
| #include <asm/tlb.h> |
| @@ -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 <linux/falloc.h> |
| #include <linux/fs_struct.h> |
| |
| +#define CREATE_TRACE_POINTS |
| +#include <trace/events/fs.h> |
| + |
| 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 <linux/fs.h> |
| +#include <linux/tracepoint.h> |
| + |
| +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 <trace/define_trace.h> |
| -- |
| 1.6.3.3 |
| |