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