packages: kernel-desktop/kernel-desktop-trace-open.patch (NEW) - init
shadzik
shadzik at pld-linux.org
Fri Jul 10 19:08:22 CEST 2009
Author: shadzik Date: Fri Jul 10 17:08:22 2009 GMT
Module: packages Tag: HEAD
---- Log message:
- init
---- Files affected:
packages/kernel-desktop:
kernel-desktop-trace-open.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: packages/kernel-desktop/kernel-desktop-trace-open.patch
diff -u /dev/null packages/kernel-desktop/kernel-desktop-trace-open.patch:1.1
--- /dev/null Fri Jul 10 19:08:22 2009
+++ packages/kernel-desktop/kernel-desktop-trace-open.patch Fri Jul 10 19:08:17 2009
@@ -0,0 +1,249 @@
+commit e9c4f51ad2b76ddbf90863c44085574197247ba3
+Author: Auke Kok <auke-jan.h.kok at intel.com>
+Date: Tue Jan 27 11:26:00 2009 -0800
+
+ trace: tracer for sys_open() - sreadahead
+
+ This tracer monitors regular file open() syscalls. This is a fast
+ and low-overhead alternative to strace, and does not allow or
+ require to be attached to every process.
+
+ Signed-off-by: Auke Kok <auke-jan.h.kok at intel.com>
+
+diff --git a/fs/open.c b/fs/open.c
+index a3a78ce..bd9eb9d 100644
+--- a/fs/open.c
++++ b/fs/open.c
+@@ -30,6 +30,10 @@
+ #include <linux/audit.h>
+ #include <linux/falloc.h>
+
++#include <trace/fs.h>
++
++DEFINE_TRACE(do_sys_open);
++
+ int vfs_statfs(struct dentry *dentry, struct kstatfs *buf)
+ {
+ int retval = -ENODEV;
+@@ -1039,6 +1043,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(f, flags, mode, fd);
+ }
+ }
+ putname(tmp);
+diff --git a/include/trace/fs.h b/include/trace/fs.h
+new file mode 100644
+index 0000000..870eec2
+--- /dev/null
++++ b/include/trace/fs.h
+@@ -0,0 +1,11 @@
++#ifndef _TRACE_FS_H
++#define _TRACE_FS_H
++
++#include <linux/fs.h>
++#include <linux/tracepoint.h>
++
++DECLARE_TRACE(do_sys_open,
++ TPPROTO(struct file *filp, int flags, int mode, long fd),
++ TPARGS(filp, flags, mode, fd));
++
++#endif
+diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
+index e2a4ff6..d2a1ec1 100644
+--- a/kernel/trace/Kconfig
++++ b/kernel/trace/Kconfig
+@@ -149,6 +149,15 @@ config CONTEXT_SWITCH_TRACER
+ This tracer gets called from the context switch and records
+ all switching of tasks.
+
++config OPEN_TRACER
++ bool "Trace open() calls"
++ depends on DEBUG_KERNEL
++ select TRACING
++ select MARKERS
++ help
++ This tracer records open() syscalls. These calls are made when
++ files are accessed on disk.
++
+ config BOOT_TRACER
+ bool "Trace boot initcalls"
+ depends on DEBUG_KERNEL
+diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile
+index 349d5a9..7f2a366 100644
+--- a/kernel/trace/Makefile
++++ b/kernel/trace/Makefile
+@@ -20,6 +20,7 @@ obj-$(CONFIG_RING_BUFFER) += ring_buffer.o
+
+ obj-$(CONFIG_TRACING) += trace.o
+ obj-$(CONFIG_CONTEXT_SWITCH_TRACER) += trace_sched_switch.o
++obj-$(CONFIG_OPEN_TRACER) += trace_open.o
+ obj-$(CONFIG_SYSPROF_TRACER) += trace_sysprof.o
+ obj-$(CONFIG_FUNCTION_TRACER) += trace_functions.o
+ obj-$(CONFIG_IRQSOFF_TRACER) += trace_irqsoff.o
+--- a/kernel/trace/trace.h.orig 2009-06-10 05:05:27.000000000 +0200
++++ b/kernel/trace/trace.h 2009-07-10 19:00:05.801929743 +0200
+@@ -36,6 +36,7 @@
+ TRACE_KMEM_ALLOC,
+ TRACE_KMEM_FREE,
+ TRACE_POWER,
++ TRACE_OPEN,
+ TRACE_BLK,
+
+ __TRACE_LAST_TYPE,
+diff --git a/kernel/trace/trace_open.c b/kernel/trace/trace_open.c
+new file mode 100644
+index 0000000..7153dfc
+--- /dev/null
++++ b/kernel/trace/trace_open.c
+@@ -0,0 +1,149 @@
++/*
++ * trace open calls
++ * Copyright (C) 2009 Intel Corporation
++ *
++ * Based extensively on trace_sched_switch.c
++ * Copyright (C) 2007 Steven Rostedt <srostedt at redhat.com>
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/fs.h>
++#include <linux/debugfs.h>
++#include <linux/kallsyms.h>
++#include <linux/uaccess.h>
++#include <linux/ftrace.h>
++#include <trace/fs.h>
++
++#include "trace.h"
++
++
++static struct trace_array *ctx_trace;
++static int __read_mostly open_trace_enabled;
++static atomic_t open_ref;
++
++static void probe_do_sys_open(struct file *filp, int flags, int mode, long fd)
++{
++ char *buf;
++ char *fname;
++
++ if (!atomic_read(&open_ref))
++ return;
++
++ if (!open_trace_enabled)
++ return;
++
++ buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
++ if (!buf)
++ return;
++
++ fname = d_path(&filp->f_path, buf, PAGE_SIZE);
++ if (IS_ERR(fname))
++ goto out;
++
++ ftrace_printk("%s: open(\"%s\", %d, %d) = %ld\n",
++ current->comm, fname, flags, mode, fd);
++
++out:
++ kfree(buf);
++}
++
++static void open_trace_reset(struct trace_array *tr)
++{
++ tr->time_start = ftrace_now(tr->cpu);
++ tracing_reset_online_cpus(tr);
++}
++
++static int open_trace_register(void)
++{
++ int ret;
++
++ ret = register_trace_do_sys_open(probe_do_sys_open);
++ if (ret) {
++ pr_info("open trace: Could not activate tracepoint"
++ " probe to do_open\n");
++ }
++
++ return ret;
++}
++
++static void open_trace_unregister(void)
++{
++ unregister_trace_do_sys_open(probe_do_sys_open);
++}
++
++static void open_trace_start(void)
++{
++ long ref;
++
++ ref = atomic_inc_return(&open_ref);
++ if (ref == 1)
++ open_trace_register();
++}
++
++static void open_trace_stop(void)
++{
++ long ref;
++
++ ref = atomic_dec_and_test(&open_ref);
++ if (ref)
++ open_trace_unregister();
++}
++
++void open_trace_start_cmdline_record(void)
++{
++ open_trace_start();
++}
++
++void open_trace_stop_cmdline_record(void)
++{
++ open_trace_stop();
++}
++
++static void open_start_trace(struct trace_array *tr)
++{
++ open_trace_reset(tr);
++ open_trace_start_cmdline_record();
++ open_trace_enabled = 1;
++}
++
++static void open_stop_trace(struct trace_array *tr)
++{
++ open_trace_enabled = 0;
++ open_trace_stop_cmdline_record();
++}
++
++static int open_trace_init(struct trace_array *tr)
++{
++ ctx_trace = tr;
++
++ open_start_trace(tr);
++ return 0;
++}
++
++static void reset_open_trace(struct trace_array *tr)
++{
++ open_stop_trace(tr);
++}
++
++static struct tracer open_trace __read_mostly =
++{
++ .name = "open",
++ .init = open_trace_init,
++ .reset = reset_open_trace,
++};
++
++__init static int init_open_trace(void)
++{
++ int ret = 0;
++
++ if (atomic_read(&open_ref))
++ ret = open_trace_register();
++ if (ret) {
++ pr_info("error registering open trace\n");
++ return ret;
++ }
++ return register_tracer(&open_trace);
++}
++device_initcall(init_open_trace);
++
================================================================
More information about the pld-cvs-commit
mailing list