* [PATCH 0/3] ftrace: updates for tip
@ 2008-12-03 20:36 Steven Rostedt
2008-12-03 20:36 ` [PATCH 1/3] ftrace: graph of a single function Steven Rostedt
` (4 more replies)
0 siblings, 5 replies; 26+ messages in thread
From: Steven Rostedt @ 2008-12-03 20:36 UTC (permalink / raw)
To: linux-kernel
Cc: Ingo Molnar, Andrew Morton, Frederic Weisbecker, Peter Zijlstra,
Arjan van de Ven, Dave Hansen, containers, Eric Biederman,
Sukadev Bhattiprolu, Serge E. Hallyn
Ingo,
This series has three patches.
The first patch adds a new feature that I've been wanting to have for some
time and Arjan even requested. That is to pick a function and only
trace that function and its children. Dynamic ftrace and function
graph needs to be enabled for this.
To do the above, I added a "trace" flags field in the task structure.
The second patch uses this for the ftrace pid code. It searches for
the task based on the pid and sets the trace flag, then in the
ftrace function caller it only needs to check this flag.
This means we can now trace more than one pid without any more overhead.
It also means that we should be able to use the name space code that
the container guys want us to. But since I'm not very up on the
namespace code, I'm still using just the normal 'pid'. I've Cc'd the
container folks so perhaps they could write up a patch for me ;-)
Note: When writing to the set_ftrace_pid two things happen.
- The task with the matching pid gets the trace flag set.
- Any other task has its trace flag cleared.
#2 needs to be addressed when converting to pid name spaces.
Just because it is not enough to simply find the matching task.
It may be good enough to just clear all tasks and then find the
one that matches.
The last patch makes the function graph tracer honor the set_ftrace_pid.
The following patches are in:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
branch: tip/devel
Steven Rostedt (3):
ftrace: graph of a single function
ftrace: use task struct trace flag to filter on pid
ftrace: trace single pid for function graph tracer
----
include/linux/ftrace.h | 46 +++++++++
include/linux/sched.h | 4 +
kernel/trace/ftrace.c | 257 +++++++++++++++++++++++++++++++++++++++++++++++-
kernel/trace/trace.c | 11 ++
kernel/trace/trace.h | 40 +++++++-
5 files changed, 353 insertions(+), 5 deletions(-)
--
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 1/3] ftrace: graph of a single function
2008-12-03 20:36 [PATCH 0/3] ftrace: updates for tip Steven Rostedt
@ 2008-12-03 20:36 ` Steven Rostedt
2008-12-03 21:07 ` Andrew Morton
` (2 more replies)
2008-12-03 20:36 ` [PATCH 2/3] ftrace: use task struct trace flag to filter on pid Steven Rostedt
` (3 subsequent siblings)
4 siblings, 3 replies; 26+ messages in thread
From: Steven Rostedt @ 2008-12-03 20:36 UTC (permalink / raw)
To: linux-kernel
Cc: Ingo Molnar, Andrew Morton, Frederic Weisbecker, Peter Zijlstra,
Arjan van de Ven, Dave Hansen, containers, Eric Biederman,
Sukadev Bhattiprolu, Serge E. Hallyn, Steven Rostedt
[-- Attachment #1: 0001-ftrace-graph-of-a-single-function.patch --]
[-- Type: text/plain, Size: 11869 bytes --]
From: Steven Rostedt <srostedt@redhat.com>
Impact: New feature
This patch adds the file:
/debugfs/tracing/set_graph_function
which can be used along with the function graph tracer.
When this file is empty, the function graph tracer will act as
normal. When the file has a function in it, the function graph
tracer will only trace that function.
For example:
# echo blk_unplug > /debugfs/tracing/set_graph_function
# cat /debugfs/tracing/trace
[...]
------------------------------------------
| 2) make-19003 => kjournald-2219
------------------------------------------
2) | blk_unplug() {
2) | dm_unplug_all() {
2) | dm_get_table() {
2) 1.381 us | _read_lock();
2) 0.911 us | dm_table_get();
2) 1. 76 us | _read_unlock();
2) + 12.912 us | }
2) | dm_table_unplug_all() {
2) | blk_unplug() {
2) 0.778 us | generic_unplug_device();
2) 2.409 us | }
2) 5.992 us | }
2) 0.813 us | dm_table_put();
2) + 29. 90 us | }
2) + 34.532 us | }
You can add up to 32 functions into this file. Currently we limit it
to 32, but this may change with later improvements.
To add another function, use the append '>>':
# echo sys_read >> /debugfs/tracing/set_graph_function
# cat /debugfs/tracing/set_graph_function
blk_unplug
sys_read
Using the '>' will clear out the function and write new.
# echo sys_write > /debug/tracing/set_graph_function
# cat /debug/tracing/set_graph_function
sys_write
Note, if you have function graph running while doing this, the small
time between clearing it and updating it will cause the graph to
record all functions. This should not be an issue because after
it sets the filter, only those functions will be recorded from then on.
If you need to only record a particular function then set this
file first before starting the function graph tracer. In the future
this side effect may be corrected.
The set_graph_function file is similar to the set_ftrace_filter but
it does not take wild cards nor does it allow for more than one
function to be set with a single write. There is no technical reason why
this is the case, I just do not have the time yet to implement that.
Note, dynamic ftrace must be enabled for this to appear because it
uses the dynamic ftrace records to match the name to the mcount
call sites.
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
---
include/linux/ftrace.h | 46 ++++++++++
include/linux/sched.h | 4 +
kernel/trace/ftrace.c | 227 ++++++++++++++++++++++++++++++++++++++++++++++++
kernel/trace/trace.c | 8 ++
kernel/trace/trace.h | 30 ++++++-
5 files changed, 314 insertions(+), 1 deletions(-)
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
index 469ceb3..b295d31 100644
--- a/include/linux/ftrace.h
+++ b/include/linux/ftrace.h
@@ -7,6 +7,7 @@
#include <linux/init.h>
#include <linux/types.h>
#include <linux/kallsyms.h>
+#include <linux/bitops.h>
#ifdef CONFIG_FUNCTION_TRACER
@@ -391,4 +392,49 @@ static inline void ftrace_graph_init_task(struct task_struct *t) { }
static inline void ftrace_graph_exit_task(struct task_struct *t) { }
#endif
+#ifdef CONFIG_TRACING
+#include <linux/sched.h>
+
+/* flags for current->trace */
+enum {
+ TSK_TRACE_FL_TRACE_BIT = 0,
+ TSK_TRACE_FL_GRAPH_BIT = 1,
+};
+enum {
+ TSK_TRACE_FL_TRACE = 1 << TSK_TRACE_FL_TRACE_BIT,
+ TSK_TRACE_FL_GRAPH = 1 << TSK_TRACE_FL_GRAPH_BIT,
+};
+
+static inline void set_tsk_trace_trace(struct task_struct *tsk)
+{
+ set_bit(TSK_TRACE_FL_TRACE_BIT, &tsk->trace);
+}
+
+static inline void clear_tsk_trace_trace(struct task_struct *tsk)
+{
+ clear_bit(TSK_TRACE_FL_TRACE_BIT, &tsk->trace);
+}
+
+static inline int test_tsk_trace_trace(struct task_struct *tsk)
+{
+ return tsk->trace & TSK_TRACE_FL_TRACE;
+}
+
+static inline void set_tsk_trace_graph(struct task_struct *tsk)
+{
+ set_bit(TSK_TRACE_FL_GRAPH_BIT, &tsk->trace);
+}
+
+static inline void clear_tsk_trace_graph(struct task_struct *tsk)
+{
+ clear_bit(TSK_TRACE_FL_GRAPH_BIT, &tsk->trace);
+}
+
+static inline int test_tsk_trace_graph(struct task_struct *tsk)
+{
+ return tsk->trace & TSK_TRACE_FL_GRAPH;
+}
+
+#endif /* CONFIG_TRACING */
+
#endif /* _LINUX_FTRACE_H */
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 20af8cb..4a33fea 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1390,6 +1390,10 @@ struct task_struct {
*/
atomic_t trace_overrun;
#endif
+#ifdef CONFIG_TRACING
+ /* state flags for use by tracers */
+ unsigned long trace;
+#endif
};
/*
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 65b9e86..b17a303 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1320,6 +1320,224 @@ static struct file_operations ftrace_notrace_fops = {
.release = ftrace_notrace_release,
};
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+
+static DEFINE_MUTEX(graph_lock);
+
+int ftrace_graph_count;
+unsigned long ftrace_graph_funcs[FTRACE_GRAPH_MAX_FUNCS] __read_mostly;
+
+static void *
+g_next(struct seq_file *m, void *v, loff_t *pos)
+{
+ unsigned long *array = m->private;
+ int index = *pos;
+
+ (*pos)++;
+
+ if (index >= ftrace_graph_count)
+ return NULL;
+
+ return &array[index];
+}
+
+static void *g_start(struct seq_file *m, loff_t *pos)
+{
+ void *p = NULL;
+
+ mutex_lock(&graph_lock);
+
+ p = g_next(m, p, pos);
+
+ return p;
+}
+
+static void g_stop(struct seq_file *m, void *p)
+{
+ mutex_unlock(&graph_lock);
+}
+
+static int g_show(struct seq_file *m, void *v)
+{
+ unsigned long *ptr = v;
+ char str[KSYM_SYMBOL_LEN];
+
+ if (!ptr)
+ return 0;
+
+ kallsyms_lookup(*ptr, NULL, NULL, NULL, str);
+
+ seq_printf(m, "%s\n", str);
+
+ return 0;
+}
+
+static struct seq_operations ftrace_graph_seq_ops = {
+ .start = g_start,
+ .next = g_next,
+ .stop = g_stop,
+ .show = g_show,
+};
+
+static int
+ftrace_graph_open(struct inode *inode, struct file *file)
+{
+ int ret = 0;
+
+ if (unlikely(ftrace_disabled))
+ return -ENODEV;
+
+ mutex_lock(&graph_lock);
+ if ((file->f_mode & FMODE_WRITE) &&
+ !(file->f_flags & O_APPEND)) {
+ ftrace_graph_count = 0;
+ memset(ftrace_graph_funcs, 0, sizeof(ftrace_graph_funcs));
+ }
+
+ if (file->f_mode & FMODE_READ) {
+ ret = seq_open(file, &ftrace_graph_seq_ops);
+ if (!ret) {
+ struct seq_file *m = file->private_data;
+ m->private = ftrace_graph_funcs;
+ }
+ } else
+ file->private_data = ftrace_graph_funcs;
+ mutex_unlock(&graph_lock);
+
+ return ret;
+}
+
+static ssize_t
+ftrace_graph_read(struct file *file, char __user *ubuf,
+ size_t cnt, loff_t *ppos)
+{
+ if (file->f_mode & FMODE_READ)
+ return seq_read(file, ubuf, cnt, ppos);
+ else
+ return -EPERM;
+}
+
+static int
+ftrace_set_func(unsigned long *array, int idx, char *buffer)
+{
+ char str[KSYM_SYMBOL_LEN];
+ struct dyn_ftrace *rec;
+ struct ftrace_page *pg;
+ int found = 0;
+ int i;
+
+ if (ftrace_disabled)
+ return -ENODEV;
+
+ /* should not be called from interrupt context */
+ spin_lock(&ftrace_lock);
+
+ for (pg = ftrace_pages_start; pg; pg = pg->next) {
+ for (i = 0; i < pg->index; i++) {
+ rec = &pg->records[i];
+
+ if (rec->flags & (FTRACE_FL_FAILED | FTRACE_FL_FREE))
+ continue;
+
+ kallsyms_lookup(rec->ip, NULL, NULL, NULL, str);
+ if (strcmp(str, buffer) == 0) {
+ found = 1;
+ array[idx] = rec->ip;
+ break;
+ }
+ }
+ }
+ spin_unlock(&ftrace_lock);
+
+ return found ? 0 : -EINVAL;
+}
+
+static ssize_t
+ftrace_graph_write(struct file *file, const char __user *ubuf,
+ size_t cnt, loff_t *ppos)
+{
+ unsigned char buffer[FTRACE_BUFF_MAX+1];
+ unsigned long *array;
+ size_t read = 0;
+ ssize_t ret;
+ int index = 0;
+ char ch;
+
+ if (!cnt || cnt < 0)
+ return 0;
+
+ mutex_lock(&graph_lock);
+
+ if (ftrace_graph_count >= FTRACE_GRAPH_MAX_FUNCS) {
+ ret = -EBUSY;
+ goto out;
+ }
+
+ if (file->f_mode & FMODE_READ) {
+ struct seq_file *m = file->private_data;
+ array = m->private;
+ } else
+ array = file->private_data;
+
+ ret = get_user(ch, ubuf++);
+ if (ret)
+ goto out;
+ read++;
+ cnt--;
+
+ /* skip white space */
+ while (cnt && isspace(ch)) {
+ ret = get_user(ch, ubuf++);
+ if (ret)
+ goto out;
+ read++;
+ cnt--;
+ }
+
+ if (isspace(ch)) {
+ *ppos += read;
+ ret = read;
+ goto out;
+ }
+
+ while (cnt && !isspace(ch)) {
+ if (index < FTRACE_BUFF_MAX)
+ buffer[index++] = ch;
+ else {
+ ret = -EINVAL;
+ goto out;
+ }
+ ret = get_user(ch, ubuf++);
+ if (ret)
+ goto out;
+ read++;
+ cnt--;
+ }
+ buffer[index] = 0;
+
+ /* we allow only one at a time */
+ ret = ftrace_set_func(array, ftrace_graph_count, buffer);
+ if (ret)
+ goto out;
+
+ ftrace_graph_count++;
+
+ file->f_pos += read;
+
+ ret = read;
+ out:
+ mutex_unlock(&graph_lock);
+
+ return ret;
+}
+
+static const struct file_operations ftrace_graph_fops = {
+ .open = ftrace_graph_open,
+ .read = ftrace_graph_read,
+ .write = ftrace_graph_write,
+};
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
+
static __init int ftrace_init_dyn_debugfs(struct dentry *d_tracer)
{
struct dentry *entry;
@@ -1347,6 +1565,15 @@ static __init int ftrace_init_dyn_debugfs(struct dentry *d_tracer)
pr_warning("Could not create debugfs "
"'set_ftrace_notrace' entry\n");
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+ entry = debugfs_create_file("set_graph_function", 0444, d_tracer,
+ NULL,
+ &ftrace_graph_fops);
+ if (!entry)
+ pr_warning("Could not create debugfs "
+ "'set_graph_function' entry\n");
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
+
return 0;
}
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 8b6409a..710b39a 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -1209,6 +1209,9 @@ int trace_graph_entry(struct ftrace_graph_ent *trace)
int cpu;
int pc;
+ if (!ftrace_graph_addr(trace->func))
+ return 0;
+
local_irq_save(flags);
cpu = raw_smp_processor_id();
data = tr->data[cpu];
@@ -1217,6 +1220,9 @@ int trace_graph_entry(struct ftrace_graph_ent *trace)
pc = preempt_count();
__trace_graph_entry(tr, data, trace, flags, pc);
}
+ /* Only do the atomic if it is not already set */
+ if (!test_tsk_trace_graph(current))
+ set_tsk_trace_graph(current);
atomic_dec(&data->disabled);
local_irq_restore(flags);
@@ -1240,6 +1246,8 @@ void trace_graph_return(struct ftrace_graph_ret *trace)
pc = preempt_count();
__trace_graph_return(tr, data, trace, flags, pc);
}
+ if (!trace->depth)
+ clear_tsk_trace_graph(current);
atomic_dec(&data->disabled);
local_irq_restore(flags);
}
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 0565ae9..41f026b 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -505,13 +505,41 @@ extern unsigned long trace_flags;
/* Standard output formatting function used for function return traces */
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
extern enum print_line_t print_graph_function(struct trace_iterator *iter);
+
+#ifdef CONFIG_DYNAMIC_FTRACE
+/* TODO: make this variable */
+#define FTRACE_GRAPH_MAX_FUNCS 32
+extern int ftrace_graph_count;
+extern unsigned long ftrace_graph_funcs[FTRACE_GRAPH_MAX_FUNCS];
+
+static inline int ftrace_graph_addr(unsigned long addr)
+{
+ int i;
+
+ if (!ftrace_graph_count || test_tsk_trace_graph(current))
+ return 1;
+
+ for (i = 0; i < ftrace_graph_count; i++) {
+ if (addr == ftrace_graph_funcs[i])
+ return 1;
+ }
+
+ return 0;
+}
#else
+static inline int ftrace_trace_addr(unsigned long addr)
+{
+ return 1
+}
+#endif /* CONFIG_DYNAMIC_FTRACE */
+
+#else /* CONFIG_FUNCTION_GRAPH_TRACER */
static inline enum print_line_t
print_graph_function(struct trace_iterator *iter)
{
return TRACE_TYPE_UNHANDLED;
}
-#endif
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
/*
* trace_iterator_flags is an enumeration that defines bit
--
1.5.6.5
--
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 2/3] ftrace: use task struct trace flag to filter on pid
2008-12-03 20:36 [PATCH 0/3] ftrace: updates for tip Steven Rostedt
2008-12-03 20:36 ` [PATCH 1/3] ftrace: graph of a single function Steven Rostedt
@ 2008-12-03 20:36 ` Steven Rostedt
2008-12-03 22:34 ` Eric W. Biederman
2008-12-03 20:36 ` [PATCH 3/3] ftrace: trace single pid for function graph tracer Steven Rostedt
` (2 subsequent siblings)
4 siblings, 1 reply; 26+ messages in thread
From: Steven Rostedt @ 2008-12-03 20:36 UTC (permalink / raw)
To: linux-kernel
Cc: Ingo Molnar, Andrew Morton, Frederic Weisbecker, Peter Zijlstra,
Arjan van de Ven, Dave Hansen, containers, Eric Biederman,
Sukadev Bhattiprolu, Serge E. Hallyn, Steven Rostedt
[-- Attachment #1: 0002-ftrace-use-task-struct-trace-flag-to-filter-on-pid.patch --]
[-- Type: text/plain, Size: 1905 bytes --]
From: Steven Rostedt <srostedt@redhat.com>
Impact: clean up
Use the new task struct trace flags to determine if a process should be
traced or not.
Note: this moves the searching of the pid to the slow path of setting
the pid field. This needs to be converted to the pid name space.
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
---
kernel/trace/ftrace.c | 28 +++++++++++++++++++++++++---
1 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index b17a303..c5049f5 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -47,7 +47,7 @@
int ftrace_enabled __read_mostly;
static int last_ftrace_enabled;
-/* ftrace_pid_trace >= 0 will only trace threads with this pid */
+/* set when tracing only a pid */
static int ftrace_pid_trace = -1;
/* Quick disabling of function tracer. */
@@ -90,7 +90,7 @@ static void ftrace_list_func(unsigned long ip, unsigned long parent_ip)
static void ftrace_pid_func(unsigned long ip, unsigned long parent_ip)
{
- if (current->pid != ftrace_pid_trace)
+ if (!test_tsk_trace_trace(current))
return;
ftrace_pid_function(ip, parent_ip);
@@ -1714,11 +1714,33 @@ ftrace_pid_write(struct file *filp, const char __user *ubuf,
ftrace_pid_trace = -1;
} else {
+ struct task_struct *p;
+ int found = 0;
if (ftrace_pid_trace == val)
goto out;
- ftrace_pid_trace = val;
+ /*
+ * Find the task that matches this pid.
+ * TODO: use pid namespaces instead.
+ */
+ rcu_read_lock();
+ for_each_process(p) {
+ if (p->pid == val) {
+ found = 1;
+ set_tsk_trace_trace(p);
+ } else if (test_tsk_trace_trace(p))
+ clear_tsk_trace_trace(p);
+ }
+ rcu_read_unlock();
+
+ if (found)
+ ftrace_pid_trace = val;
+ else {
+ if (ftrace_pid_trace < 0)
+ goto out;
+ ftrace_pid_trace = -1;
+ }
}
/* update the function call */
--
1.5.6.5
--
^ permalink raw reply related [flat|nested] 26+ messages in thread
* [PATCH 3/3] ftrace: trace single pid for function graph tracer
2008-12-03 20:36 [PATCH 0/3] ftrace: updates for tip Steven Rostedt
2008-12-03 20:36 ` [PATCH 1/3] ftrace: graph of a single function Steven Rostedt
2008-12-03 20:36 ` [PATCH 2/3] ftrace: use task struct trace flag to filter on pid Steven Rostedt
@ 2008-12-03 20:36 ` Steven Rostedt
2008-12-03 20:49 ` Andrew Morton
2008-12-04 8:19 ` [PATCH 0/3] ftrace: updates for tip Ingo Molnar
2008-12-04 8:35 ` Ingo Molnar
4 siblings, 1 reply; 26+ messages in thread
From: Steven Rostedt @ 2008-12-03 20:36 UTC (permalink / raw)
To: linux-kernel
Cc: Ingo Molnar, Andrew Morton, Frederic Weisbecker, Peter Zijlstra,
Arjan van de Ven, Dave Hansen, containers, Eric Biederman,
Sukadev Bhattiprolu, Serge E. Hallyn, Steven Rostedt
[-- Attachment #1: 0003-ftrace-trace-single-pid-for-function-graph-tracer.patch --]
[-- Type: text/plain, Size: 1953 bytes --]
From: Steven Rostedt <srostedt@redhat.com>
Impact: New feature
This patch makes the changes to set_ftrace_pid apply to the function
graph tracer.
# echo $$ > /debugfs/tracing/set_ftrace_pid
# echo function_graph > /debugfs/tracing/current_tracer
Will cause only the current task to be traced. Note, the trace flags are
also inherited by child processes, so the children of the shell
will also be traced.
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
---
kernel/trace/ftrace.c | 2 +-
kernel/trace/trace.c | 3 +++
kernel/trace/trace.h | 10 ++++++++++
3 files changed, 14 insertions(+), 1 deletions(-)
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index c5049f5..57592a9 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -48,7 +48,7 @@ int ftrace_enabled __read_mostly;
static int last_ftrace_enabled;
/* set when tracing only a pid */
-static int ftrace_pid_trace = -1;
+int ftrace_pid_trace = -1;
/* Quick disabling of function tracer. */
int function_trace_stop;
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 710b39a..1bd9574 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -1209,6 +1209,9 @@ int trace_graph_entry(struct ftrace_graph_ent *trace)
int cpu;
int pc;
+ if (!ftrace_trace_task(current))
+ return 0;
+
if (!ftrace_graph_addr(trace->func))
return 0;
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 41f026b..95fff37 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -541,6 +541,16 @@ print_graph_function(struct trace_iterator *iter)
}
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
+extern int ftrace_pid_trace;
+
+static inline int ftrace_trace_task(struct task_struct *task)
+{
+ if (ftrace_pid_trace < 0)
+ return 1;
+
+ return test_tsk_trace_trace(task);
+}
+
/*
* trace_iterator_flags is an enumeration that defines bit
* positions into trace_flags that controls the output.
--
1.5.6.5
--
^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: [PATCH 3/3] ftrace: trace single pid for function graph tracer
2008-12-03 20:36 ` [PATCH 3/3] ftrace: trace single pid for function graph tracer Steven Rostedt
@ 2008-12-03 20:49 ` Andrew Morton
2008-12-03 20:52 ` Steven Rostedt
0 siblings, 1 reply; 26+ messages in thread
From: Andrew Morton @ 2008-12-03 20:49 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel, mingo, fweisbec, peterz, arjan, dave, containers,
ebiederm, sukadev, serue, srostedt
On Wed, 03 Dec 2008 15:36:59 -0500
Steven Rostedt <rostedt@goodmis.org> wrote:
> This patch makes the changes to set_ftrace_pid apply to the function
> graph tracer.
That sentence needs help.
> # echo $$ > /debugfs/tracing/set_ftrace_pid
> # echo function_graph > /debugfs/tracing/current_tracer
>
> Will cause only the current task to be traced. Note, the trace flags are
> also inherited by child processes, so the children of the shell
> will also be traced.
Where did we end up on the pids-arent-unique issue? Gave up?
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/3] ftrace: trace single pid for function graph tracer
2008-12-03 20:49 ` Andrew Morton
@ 2008-12-03 20:52 ` Steven Rostedt
2008-12-03 23:36 ` Eric W. Biederman
0 siblings, 1 reply; 26+ messages in thread
From: Steven Rostedt @ 2008-12-03 20:52 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-kernel, mingo, fweisbec, peterz, arjan, dave, containers,
ebiederm, sukadev, serue, srostedt
On Wed, 3 Dec 2008, Andrew Morton wrote:
> On Wed, 03 Dec 2008 15:36:59 -0500
> Steven Rostedt <rostedt@goodmis.org> wrote:
>
> > This patch makes the changes to set_ftrace_pid apply to the function
> > graph tracer.
>
> That sentence needs help.
Medic!
>
> > # echo $$ > /debugfs/tracing/set_ftrace_pid
> > # echo function_graph > /debugfs/tracing/current_tracer
> >
> > Will cause only the current task to be traced. Note, the trace flags are
> > also inherited by child processes, so the children of the shell
> > will also be traced.
>
> Where did we end up on the pids-arent-unique issue? Gave up?
Nah, patch 2 opens the door for a solution. I'm just pawning the work off
to the container folks ;-)
-- Steve
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/3] ftrace: graph of a single function
2008-12-03 20:36 ` [PATCH 1/3] ftrace: graph of a single function Steven Rostedt
@ 2008-12-03 21:07 ` Andrew Morton
2008-12-03 21:10 ` Steven Rostedt
2008-12-03 21:08 ` Andrew Morton
2008-12-04 6:24 ` [PATCH 1/1] ftrace: avoid duplicated function when writing set_graph_function Liming Wang
2 siblings, 1 reply; 26+ messages in thread
From: Andrew Morton @ 2008-12-03 21:07 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel, mingo, fweisbec, peterz, arjan, dave, containers,
ebiederm, sukadev, serue, srostedt
On Wed, 03 Dec 2008 15:36:57 -0500
Steven Rostedt <rostedt@goodmis.org> wrote:
> +static int g_show(struct seq_file *m, void *v)
> +{
> + unsigned long *ptr = v;
> + char str[KSYM_SYMBOL_LEN];
> +
> + if (!ptr)
> + return 0;
> +
> + kallsyms_lookup(*ptr, NULL, NULL, NULL, str);
> +
> + seq_printf(m, "%s\n", str);
Can we use %pF here?
> + return 0;
> +}
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/3] ftrace: graph of a single function
2008-12-03 20:36 ` [PATCH 1/3] ftrace: graph of a single function Steven Rostedt
2008-12-03 21:07 ` Andrew Morton
@ 2008-12-03 21:08 ` Andrew Morton
2008-12-03 21:11 ` Steven Rostedt
2008-12-04 6:24 ` [PATCH 1/1] ftrace: avoid duplicated function when writing set_graph_function Liming Wang
2 siblings, 1 reply; 26+ messages in thread
From: Andrew Morton @ 2008-12-03 21:08 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel, mingo, fweisbec, peterz, arjan, dave, containers,
ebiederm, sukadev, serue, srostedt
On Wed, 03 Dec 2008 15:36:57 -0500
Steven Rostedt <rostedt@goodmis.org> wrote:
> +static struct seq_operations ftrace_graph_seq_ops = {
> + .start = g_start,
> + .next = g_next,
> + .stop = g_stop,
> + .show = g_show,
> +};
This could be static I think.
It's probably not worth even commenting on or fixing this sort
of thing. Just rely on someone(tm) doing periodic sweeps to
fix them all up.
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/3] ftrace: graph of a single function
2008-12-03 21:07 ` Andrew Morton
@ 2008-12-03 21:10 ` Steven Rostedt
2008-12-03 21:32 ` Andrew Morton
0 siblings, 1 reply; 26+ messages in thread
From: Steven Rostedt @ 2008-12-03 21:10 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-kernel, mingo, fweisbec, peterz, arjan, dave, containers,
ebiederm, sukadev, serue, srostedt
On Wed, 3 Dec 2008, Andrew Morton wrote:
> On Wed, 03 Dec 2008 15:36:57 -0500
> Steven Rostedt <rostedt@goodmis.org> wrote:
>
> > +static int g_show(struct seq_file *m, void *v)
> > +{
> > + unsigned long *ptr = v;
> > + char str[KSYM_SYMBOL_LEN];
> > +
> > + if (!ptr)
> > + return 0;
> > +
> > + kallsyms_lookup(*ptr, NULL, NULL, NULL, str);
> > +
> > + seq_printf(m, "%s\n", str);
>
> Can we use %pF here?
If there's a way to not print the "+offset".
blk_unplug looks much nicer than blk_unplug+0x78/0x278
-- Steve
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/3] ftrace: graph of a single function
2008-12-03 21:08 ` Andrew Morton
@ 2008-12-03 21:11 ` Steven Rostedt
2008-12-04 8:41 ` Ingo Molnar
0 siblings, 1 reply; 26+ messages in thread
From: Steven Rostedt @ 2008-12-03 21:11 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-kernel, mingo, fweisbec, peterz, arjan, dave, containers,
ebiederm, sukadev, serue, srostedt
On Wed, 3 Dec 2008, Andrew Morton wrote:
> On Wed, 03 Dec 2008 15:36:57 -0500
> Steven Rostedt <rostedt@goodmis.org> wrote:
>
> > +static struct seq_operations ftrace_graph_seq_ops = {
> > + .start = g_start,
> > + .next = g_next,
> > + .stop = g_stop,
> > + .show = g_show,
> > +};
>
> This could be static I think.
s/static/const/
Damn damn damn damn!!!! I said to myself, I need to add const there and
still forgot :-(
>
> It's probably not worth even commenting on or fixing this sort
> of thing. Just rely on someone(tm) doing periodic sweeps to
> fix them all up.
Still on my todo list for kernel/trace/*.c
-- Steve
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/3] ftrace: graph of a single function
2008-12-03 21:10 ` Steven Rostedt
@ 2008-12-03 21:32 ` Andrew Morton
2008-12-03 21:36 ` Steven Rostedt
0 siblings, 1 reply; 26+ messages in thread
From: Andrew Morton @ 2008-12-03 21:32 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel, mingo, fweisbec, peterz, arjan, dave, containers,
ebiederm, sukadev, serue, srostedt
On Wed, 3 Dec 2008 16:10:38 -0500 (EST)
Steven Rostedt <rostedt@goodmis.org> wrote:
>
>
> On Wed, 3 Dec 2008, Andrew Morton wrote:
>
> > On Wed, 03 Dec 2008 15:36:57 -0500
> > Steven Rostedt <rostedt@goodmis.org> wrote:
> >
> > > +static int g_show(struct seq_file *m, void *v)
> > > +{
> > > + unsigned long *ptr = v;
> > > + char str[KSYM_SYMBOL_LEN];
> > > +
> > > + if (!ptr)
> > > + return 0;
> > > +
> > > + kallsyms_lookup(*ptr, NULL, NULL, NULL, str);
> > > +
> > > + seq_printf(m, "%s\n", str);
> >
> > Can we use %pF here?
>
> If there's a way to not print the "+offset".
Could be added, I guess. I wonder if it would be
reused elsewhere.
> blk_unplug looks much nicer than blk_unplug+0x78/0x278
<mutters something about in-kernel pretty-printers>
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/3] ftrace: graph of a single function
2008-12-03 21:32 ` Andrew Morton
@ 2008-12-03 21:36 ` Steven Rostedt
2008-12-04 8:39 ` Ingo Molnar
0 siblings, 1 reply; 26+ messages in thread
From: Steven Rostedt @ 2008-12-03 21:36 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-kernel, mingo, fweisbec, peterz, arjan, dave, containers,
ebiederm, sukadev, serue, srostedt
On Wed, 3 Dec 2008, Andrew Morton wrote:
> On Wed, 3 Dec 2008 16:10:38 -0500 (EST)
> Steven Rostedt <rostedt@goodmis.org> wrote:
> > > > +
> > > > + seq_printf(m, "%s\n", str);
> > >
> > > Can we use %pF here?
> >
> > If there's a way to not print the "+offset".
>
> Could be added, I guess. I wonder if it would be
> reused elsewhere.
There's lots of places in ftrace that would use it, and probably clean up
a bunch of code in the process.
>
> > blk_unplug looks much nicer than blk_unplug+0x78/0x278
>
> <mutters something about in-kernel pretty-printers>
Huh? sorry I couldn't hear you. Could you speak up. ;-)
-- Steve
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 2/3] ftrace: use task struct trace flag to filter on pid
2008-12-03 20:36 ` [PATCH 2/3] ftrace: use task struct trace flag to filter on pid Steven Rostedt
@ 2008-12-03 22:34 ` Eric W. Biederman
0 siblings, 0 replies; 26+ messages in thread
From: Eric W. Biederman @ 2008-12-03 22:34 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel, Ingo Molnar, Andrew Morton, Frederic Weisbecker,
Peter Zijlstra, Arjan van de Ven, Dave Hansen, containers,
Sukadev Bhattiprolu, Serge E. Hallyn, Steven Rostedt
Steven Rostedt <rostedt@goodmis.org> writes:
> From: Steven Rostedt <srostedt@redhat.com>
>
> Impact: clean up
>
> Use the new task struct trace flags to determine if a process should be
> traced or not.
Looks reasonable.
> Note: this moves the searching of the pid to the slow path of setting
> the pid field. This needs to be converted to the pid name space.
>
> Signed-off-by: Steven Rostedt <srostedt@redhat.com>
> ---
> kernel/trace/ftrace.c | 28 +++++++++++++++++++++++++---
> 1 files changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
> index b17a303..c5049f5 100644
> --- a/kernel/trace/ftrace.c
> +++ b/kernel/trace/ftrace.c
> @@ -47,7 +47,7 @@
> int ftrace_enabled __read_mostly;
> static int last_ftrace_enabled;
>
> -/* ftrace_pid_trace >= 0 will only trace threads with this pid */
> +/* set when tracing only a pid */
> static int ftrace_pid_trace = -1;
>
> /* Quick disabling of function tracer. */
> @@ -90,7 +90,7 @@ static void ftrace_list_func(unsigned long ip, unsigned long
> parent_ip)
>
> static void ftrace_pid_func(unsigned long ip, unsigned long parent_ip)
> {
> - if (current->pid != ftrace_pid_trace)
> + if (!test_tsk_trace_trace(current))
> return;
>
> ftrace_pid_function(ip, parent_ip);
> @@ -1714,11 +1714,33 @@ ftrace_pid_write(struct file *filp, const char __user
> *ubuf,
> ftrace_pid_trace = -1;
>
> } else {
> + struct task_struct *p;
> + int found = 0;
>
> if (ftrace_pid_trace == val)
> goto out;
>
> - ftrace_pid_trace = val;
> + /*
> + * Find the task that matches this pid.
> + * TODO: use pid namespaces instead.
> + */
> + rcu_read_lock();
> + for_each_process(p) {
> + if (p->pid == val) {
> + found = 1;
> + set_tsk_trace_trace(p);
> + } else if (test_tsk_trace_trace(p))
> + clear_tsk_trace_trace(p);
> + }
> + rcu_read_unlock();
Yes. This function you have just implemented inline is called find_pid.
It uses a hash lookup instead of an expensive walk trough all of the processes
in the system. So the code becomes something like:
do_each_pid_task(ftrace_pid_trace, PIDTYPE_PID, task) {
clear_tsk_trace_tace(p);
} while_each_pid_task(pid, PIDTYPE_PID, task);
put_pid(ftrace_pid_trace);
ftrace_pid_trace = find_get_vpid(val);
do_each_pid_task(ftrace_pid_trace, PIDTYPE_PID, task) {
set_tsk_trace_tace(p);
} while_each_pid_task(ftrace_pid_trace, PIDTYPE_PID, task);
if (!ftrace_pid_trace)
goto out;
The loops encompass both the test for validity, and handle the weird exec
case where the pid moves from one task to another.
Eric
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/3] ftrace: trace single pid for function graph tracer
2008-12-03 20:52 ` Steven Rostedt
@ 2008-12-03 23:36 ` Eric W. Biederman
2008-12-04 2:29 ` Steven Rostedt
0 siblings, 1 reply; 26+ messages in thread
From: Eric W. Biederman @ 2008-12-03 23:36 UTC (permalink / raw)
To: Steven Rostedt
Cc: Andrew Morton, linux-kernel, mingo, fweisbec, peterz, arjan, dave,
containers, sukadev, serue, srostedt
Steven Rostedt <rostedt@goodmis.org> writes:
>> > # echo $$ > /debugfs/tracing/set_ftrace_pid
>> > # echo function_graph > /debugfs/tracing/current_tracer
>> >
>> > Will cause only the current task to be traced. Note, the trace flags are
>> > also inherited by child processes, so the children of the shell
>> > will also be traced.
>>
>> Where did we end up on the pids-arent-unique issue? Gave up?
>
> Nah, patch 2 opens the door for a solution. I'm just pawning the work off
> to the container folks ;-)
The way patch 2 uses pids is just stupid. It has nothing to do with
pids aren't unique. You do a full walk of the process list instead
of using the hash table.
It makes me think that task->pid really should go away because with it
there people don't bother to look and see how things normally work.
Eric
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/3] ftrace: trace single pid for function graph tracer
2008-12-03 23:36 ` Eric W. Biederman
@ 2008-12-04 2:29 ` Steven Rostedt
2008-12-04 4:22 ` Eric W. Biederman
0 siblings, 1 reply; 26+ messages in thread
From: Steven Rostedt @ 2008-12-04 2:29 UTC (permalink / raw)
To: Eric W. Biederman
Cc: Andrew Morton, linux-kernel, mingo, fweisbec, peterz, arjan, dave,
containers, sukadev, serue, srostedt
On Wed, 3 Dec 2008, Eric W. Biederman wrote:
> Steven Rostedt <rostedt@goodmis.org> writes:
>
> The way patch 2 uses pids is just stupid. It has nothing to do with
> pids aren't unique. You do a full walk of the process list instead
> of using the hash table.
The way patch 2 uses the pids is stupid, it was just the easiest way to
implement it correctly ;-) I work with, do it stupid but correct first,
then optimize.
>
> It makes me think that task->pid really should go away because with it
> there people don't bother to look and see how things normally work.
This is far from a fast path, and I can easily fix it. The hard work was
the rest of the patch not this part. I even did it stupid knowing that I
would be rewriting it to handle namespaces. I stated that this needed to
be fixed in the patch itself.
One thing I never got an answer for, using the namespace pid path, can I
still select the idle task to trace, i.e. pid == 0.
-- Steve
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/3] ftrace: trace single pid for function graph tracer
2008-12-04 2:29 ` Steven Rostedt
@ 2008-12-04 4:22 ` Eric W. Biederman
2008-12-04 4:32 ` Steven Rostedt
0 siblings, 1 reply; 26+ messages in thread
From: Eric W. Biederman @ 2008-12-04 4:22 UTC (permalink / raw)
To: Steven Rostedt
Cc: Andrew Morton, linux-kernel, mingo, fweisbec, peterz, arjan, dave,
containers, sukadev, serue, srostedt
Steven Rostedt <rostedt@goodmis.org> writes:
> On Wed, 3 Dec 2008, Eric W. Biederman wrote:
>
>> Steven Rostedt <rostedt@goodmis.org> writes:
>>
>> The way patch 2 uses pids is just stupid. It has nothing to do with
>> pids aren't unique. You do a full walk of the process list instead
>> of using the hash table.
>
> The way patch 2 uses the pids is stupid, it was just the easiest way to
> implement it correctly ;-) I work with, do it stupid but correct first,
> then optimize.
Which is a reasonable and very unix approach. As long as I don't need to
do more than advise about what to do.
>> It makes me think that task->pid really should go away because with it
>> there people don't bother to look and see how things normally work.
>
> This is far from a fast path, and I can easily fix it. The hard work was
> the rest of the patch not this part. I even did it stupid knowing that I
> would be rewriting it to handle namespaces. I stated that this needed to
> be fixed in the patch itself.
>
> One thing I never got an answer for, using the namespace pid path, can I
> still select the idle task to trace, i.e. pid == 0.
Sorry I didn't see this question. As I recall we have a special pid that
is not hashed that is used by the idle task.
So it should be possible but it would need to be a special case. Although
please note we have one idle task per cpu.
Is the idle task doing anything interesting enough to warrant tracing?
We don't report the idle tasks in proc or in any of our other user space
interfaces.
Eric
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 3/3] ftrace: trace single pid for function graph tracer
2008-12-04 4:22 ` Eric W. Biederman
@ 2008-12-04 4:32 ` Steven Rostedt
0 siblings, 0 replies; 26+ messages in thread
From: Steven Rostedt @ 2008-12-04 4:32 UTC (permalink / raw)
To: Eric W. Biederman
Cc: Andrew Morton, linux-kernel, mingo, fweisbec, peterz, arjan, dave,
containers, sukadev, serue, srostedt
On Wed, 3 Dec 2008, Eric W. Biederman wrote:
> Steven Rostedt <rostedt@goodmis.org> writes:
>
> > On Wed, 3 Dec 2008, Eric W. Biederman wrote:
> >
> >> Steven Rostedt <rostedt@goodmis.org> writes:
> >>
> >> The way patch 2 uses pids is just stupid. It has nothing to do with
> >> pids aren't unique. You do a full walk of the process list instead
> >> of using the hash table.
> >
> > The way patch 2 uses the pids is stupid, it was just the easiest way to
> > implement it correctly ;-) I work with, do it stupid but correct first,
> > then optimize.
>
> Which is a reasonable and very unix approach. As long as I don't need to
> do more than advise about what to do.
No prob. I already wrote the patch and I'm just about ready to post.
>
> >> It makes me think that task->pid really should go away because with it
> >> there people don't bother to look and see how things normally work.
> >
> > This is far from a fast path, and I can easily fix it. The hard work was
> > the rest of the patch not this part. I even did it stupid knowing that I
> > would be rewriting it to handle namespaces. I stated that this needed to
> > be fixed in the patch itself.
> >
> > One thing I never got an answer for, using the namespace pid path, can I
> > still select the idle task to trace, i.e. pid == 0.
>
> Sorry I didn't see this question. As I recall we have a special pid that
> is not hashed that is used by the idle task.
>
> So it should be possible but it would need to be a special case. Although
> please note we have one idle task per cpu.
Yep, I'm almost finish with this patch. It is a special case.
>
> Is the idle task doing anything interesting enough to warrant tracing?
> We don't report the idle tasks in proc or in any of our other user space
> interfaces.
Yes, because we can see what wakes things up from idle. That is, if we
trace the idle task, we can trace the interrupts that happen while the CPU
is idle.
Thanks,
-- Steve
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 1/1] ftrace: avoid duplicated function when writing set_graph_function
2008-12-03 20:36 ` [PATCH 1/3] ftrace: graph of a single function Steven Rostedt
2008-12-03 21:07 ` Andrew Morton
2008-12-03 21:08 ` Andrew Morton
@ 2008-12-04 6:24 ` Liming Wang
2008-12-04 8:42 ` Ingo Molnar
2 siblings, 1 reply; 26+ messages in thread
From: Liming Wang @ 2008-12-04 6:24 UTC (permalink / raw)
To: Steven Rostedt, Ingo Molnar; +Cc: linux-kernel, Liming Wang
Impact: fix a bug
when writing function to set_graph_function, we should check whether it
has existed in set_graph_function to avoid duplicating.
Signed-off-by: Liming Wang <liming.wang@windriver.com>
---
kernel/trace/ftrace.c | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index eb57dc1..d2b1565 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1425,7 +1425,7 @@ ftrace_set_func(unsigned long *array, int idx, char *buffer)
struct dyn_ftrace *rec;
struct ftrace_page *pg;
int found = 0;
- int i;
+ int i, j;
if (ftrace_disabled)
return -ENODEV;
@@ -1443,7 +1443,13 @@ ftrace_set_func(unsigned long *array, int idx, char *buffer)
kallsyms_lookup(rec->ip, NULL, NULL, NULL, str);
if (strcmp(str, buffer) == 0) {
found = 1;
- array[idx] = rec->ip;
+ for (j = 0; j < idx; j++)
+ if (array[j] == rec->ip) {
+ found = 0;
+ break;
+ }
+ if (found)
+ array[idx] = rec->ip;
break;
}
}
--
1.6.0.3
^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: [PATCH 0/3] ftrace: updates for tip
2008-12-03 20:36 [PATCH 0/3] ftrace: updates for tip Steven Rostedt
` (2 preceding siblings ...)
2008-12-03 20:36 ` [PATCH 3/3] ftrace: trace single pid for function graph tracer Steven Rostedt
@ 2008-12-04 8:19 ` Ingo Molnar
2008-12-04 8:35 ` Ingo Molnar
4 siblings, 0 replies; 26+ messages in thread
From: Ingo Molnar @ 2008-12-04 8:19 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel, Andrew Morton, Frederic Weisbecker, Peter Zijlstra,
Arjan van de Ven, Dave Hansen, containers, Eric Biederman,
Sukadev Bhattiprolu, Serge E. Hallyn
* Steven Rostedt <rostedt@goodmis.org> wrote:
> Ingo,
>
> This series has three patches.
>
> The first patch adds a new feature that I've been wanting to have for some
> time and Arjan even requested. That is to pick a function and only
> trace that function and its children. Dynamic ftrace and function
> graph needs to be enabled for this.
>
> To do the above, I added a "trace" flags field in the task structure.
> The second patch uses this for the ftrace pid code. It searches for
> the task based on the pid and sets the trace flag, then in the
> ftrace function caller it only needs to check this flag.
>
> This means we can now trace more than one pid without any more overhead.
> It also means that we should be able to use the name space code that
> the container guys want us to. But since I'm not very up on the
> namespace code, I'm still using just the normal 'pid'. I've Cc'd the
> container folks so perhaps they could write up a patch for me ;-)
>
> Note: When writing to the set_ftrace_pid two things happen.
> - The task with the matching pid gets the trace flag set.
> - Any other task has its trace flag cleared.
> #2 needs to be addressed when converting to pid name spaces.
> Just because it is not enough to simply find the matching task.
> It may be good enough to just clear all tasks and then find the
> one that matches.
>
> The last patch makes the function graph tracer honor the set_ftrace_pid.
>
> The following patches are in:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace.git
>
> branch: tip/devel
>
>
> Steven Rostedt (3):
> ftrace: graph of a single function
> ftrace: use task struct trace flag to filter on pid
> ftrace: trace single pid for function graph tracer
>
> ----
> include/linux/ftrace.h | 46 +++++++++
> include/linux/sched.h | 4 +
> kernel/trace/ftrace.c | 257 +++++++++++++++++++++++++++++++++++++++++++++++-
> kernel/trace/trace.c | 11 ++
> kernel/trace/trace.h | 40 +++++++-
> 5 files changed, 353 insertions(+), 5 deletions(-)
> --
pulled, thanks Steve!
These are some very nice changes!
Ingo
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 0/3] ftrace: updates for tip
2008-12-03 20:36 [PATCH 0/3] ftrace: updates for tip Steven Rostedt
` (3 preceding siblings ...)
2008-12-04 8:19 ` [PATCH 0/3] ftrace: updates for tip Ingo Molnar
@ 2008-12-04 8:35 ` Ingo Molnar
2008-12-04 13:30 ` Steven Rostedt
4 siblings, 1 reply; 26+ messages in thread
From: Ingo Molnar @ 2008-12-04 8:35 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel, Andrew Morton, Frederic Weisbecker, Peter Zijlstra,
Arjan van de Ven, Dave Hansen, containers, Eric Biederman,
Sukadev Bhattiprolu, Serge E. Hallyn
* Steven Rostedt <rostedt@goodmis.org> wrote:
> Ingo,
>
> This series has three patches.
>
> The first patch adds a new feature that I've been wanting to have for
> some time and Arjan even requested. That is to pick a function and only
> trace that function and its children. Dynamic ftrace and function graph
> needs to be enabled for this.
>
> To do the above, I added a "trace" flags field in the task structure.
> The second patch uses this for the ftrace pid code. It searches for the
> task based on the pid and sets the trace flag, then in the ftrace
> function caller it only needs to check this flag.
Btw., i'd love to see this done via the regular regexp interface though,
if possible - instead of the add-on interface you added.
( Also perhaps enable to toggle tracing via the /proc/<PID>/ hierarchy -
a /proc/<PID>/tracing_enabled switch or so. )
Regarding the filter functions, the basic principle should be
mathematical set operations, like we have it now: add and remove, union,
wildcards, etc.
I'd suggest a natural and intuitive extension of the current syntax.
(while keeping all the current bits)
I already suggested a 'inverse' filter in a previous mail:
echo "-schedule*" >> set_ftrace_filter
This rule operates on the current set of filter functions: it strikes out
all existing filter functions that match this pattern.
To handle PIDs, we could do something like:
echo "sshd-312:schedule" > set_ftrace_filter
This would restrict tracing to the sshd-pid:312 task.
Note: the PID portion of the filter rules still stay separate from the
function names - we dont want per task function filter rules.
A natural variation would be:
echo "312:schedule" > set_ftrace_filter
to only specify the PID, or:
echo "312,313:schedule" > set_ftrace_filter
to specify two PIDs, or:
echo "sshd:schedule" > set_ftrace_filter
to only specify the 'comm' part, which expands to all PIDs where
task->comm matches sshd. Another variation would be:
echo "loop*:schedule" > set_ftrace_filter
that matches all PIDs where task->comm matches loop*.
To specify recursive tracing, we could use something like:
echo "loop*+schedule" > set_ftrace_filter
the '+' would signal that the 'schedule' function is 'expanded' and all
its child functions are traced as well.
btw., maybe it makes sense to separate the regexp rule-set from the set
of functions that we are tracing right now. For example:
$ echo "schedule*" > set_ftrace_filter
$ echo "time*" >> set_ftrace_filter
$ echo "sys_*" >> set_ftrace_filter
$ cat set_ftrace_filter
schedule*
time*
sys_*
We'd also have a separate, current_ftrace_functions file as well which
shows all traced functions. (on a global basis - with possible PID filter
rules added where applicable)
I know this will be hellishly hard to implement, but it would be _very_
elegant, and _very_ usable.
What do you think?
Ingo
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/3] ftrace: graph of a single function
2008-12-03 21:36 ` Steven Rostedt
@ 2008-12-04 8:39 ` Ingo Molnar
0 siblings, 0 replies; 26+ messages in thread
From: Ingo Molnar @ 2008-12-04 8:39 UTC (permalink / raw)
To: Steven Rostedt
Cc: Andrew Morton, linux-kernel, fweisbec, peterz, arjan, dave,
containers, ebiederm, sukadev, serue, srostedt
* Steven Rostedt <rostedt@goodmis.org> wrote:
>
> On Wed, 3 Dec 2008, Andrew Morton wrote:
>
> > On Wed, 3 Dec 2008 16:10:38 -0500 (EST)
> > Steven Rostedt <rostedt@goodmis.org> wrote:
> > > > > +
> > > > > + seq_printf(m, "%s\n", str);
> > > >
> > > > Can we use %pF here?
> > >
> > > If there's a way to not print the "+offset".
> >
> > Could be added, I guess. I wonder if it would be
> > reused elsewhere.
>
> There's lots of places in ftrace that would use it, and probably clean
> up a bunch of code in the process.
Well, we do eventually want to have a trace_option that extends all
function names with the +offset/size portion - and one that switches them
to raw RIPs.
In rare occasions, when the same function has multiple call sites of the
same child function, it can be useful. I ran into such scenarios with the
latency tracer and it had this capability to do 'verbose' symbol
printing.
So plain %pF wont cut it - please abstract out the "print function symbol
string" bit within the ftrace infrastructure.
And the default trace_option for this should be to print without
+offset/size spam, emphatically :)
Ingo
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/3] ftrace: graph of a single function
2008-12-03 21:11 ` Steven Rostedt
@ 2008-12-04 8:41 ` Ingo Molnar
2008-12-04 8:43 ` Peter Zijlstra
2008-12-15 9:21 ` Andy Whitcroft
0 siblings, 2 replies; 26+ messages in thread
From: Ingo Molnar @ 2008-12-04 8:41 UTC (permalink / raw)
To: Steven Rostedt, Andy Whitcroft
Cc: Andrew Morton, linux-kernel, fweisbec, peterz, arjan, dave,
containers, ebiederm, sukadev, serue, srostedt
* Steven Rostedt <rostedt@goodmis.org> wrote:
>
> On Wed, 3 Dec 2008, Andrew Morton wrote:
>
> > On Wed, 03 Dec 2008 15:36:57 -0500
> > Steven Rostedt <rostedt@goodmis.org> wrote:
> >
> > > +static struct seq_operations ftrace_graph_seq_ops = {
> > > + .start = g_start,
> > > + .next = g_next,
> > > + .stop = g_stop,
> > > + .show = g_show,
> > > +};
> >
> > This could be static I think.
>
> s/static/const/
>
> Damn damn damn damn!!!! I said to myself, I need to add const there and
> still forgot :-(
No need to get stressed up about such details - we need checkpatch help
for this.
Ingo
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/1] ftrace: avoid duplicated function when writing set_graph_function
2008-12-04 6:24 ` [PATCH 1/1] ftrace: avoid duplicated function when writing set_graph_function Liming Wang
@ 2008-12-04 8:42 ` Ingo Molnar
0 siblings, 0 replies; 26+ messages in thread
From: Ingo Molnar @ 2008-12-04 8:42 UTC (permalink / raw)
To: Liming Wang; +Cc: Steven Rostedt, linux-kernel
* Liming Wang <liming.wang@windriver.com> wrote:
> Impact: fix a bug
>
> when writing function to set_graph_function, we should check whether it
> has existed in set_graph_function to avoid duplicating.
>
> Signed-off-by: Liming Wang <liming.wang@windriver.com>
> ---
> kernel/trace/ftrace.c | 10 ++++++++--
> 1 files changed, 8 insertions(+), 2 deletions(-)
applied to tip/tracing/ftrace, thanks!
Ingo
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/3] ftrace: graph of a single function
2008-12-04 8:41 ` Ingo Molnar
@ 2008-12-04 8:43 ` Peter Zijlstra
2008-12-15 9:21 ` Andy Whitcroft
1 sibling, 0 replies; 26+ messages in thread
From: Peter Zijlstra @ 2008-12-04 8:43 UTC (permalink / raw)
To: Ingo Molnar
Cc: Steven Rostedt, Andy Whitcroft, Andrew Morton, linux-kernel,
fweisbec, arjan, dave, containers, ebiederm, sukadev, serue,
srostedt
On Thu, 2008-12-04 at 09:41 +0100, Ingo Molnar wrote:
> * Steven Rostedt <rostedt@goodmis.org> wrote:
>
> >
> > On Wed, 3 Dec 2008, Andrew Morton wrote:
> >
> > > On Wed, 03 Dec 2008 15:36:57 -0500
> > > Steven Rostedt <rostedt@goodmis.org> wrote:
> > >
> > > > +static struct seq_operations ftrace_graph_seq_ops = {
> > > > + .start = g_start,
> > > > + .next = g_next,
> > > > + .stop = g_stop,
> > > > + .show = g_show,
> > > > +};
> > >
> > > This could be static I think.
> >
> > s/static/const/
> >
> > Damn damn damn damn!!!! I said to myself, I need to add const there and
> > still forgot :-(
>
> No need to get stressed up about such details - we need checkpatch help
> for this.
I guess it would be too much for checkpatch, but I think sparse can do
it, it just means steve has to install sparse and actually run the
thing ;-)
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 0/3] ftrace: updates for tip
2008-12-04 8:35 ` Ingo Molnar
@ 2008-12-04 13:30 ` Steven Rostedt
0 siblings, 0 replies; 26+ messages in thread
From: Steven Rostedt @ 2008-12-04 13:30 UTC (permalink / raw)
To: Ingo Molnar
Cc: linux-kernel, Andrew Morton, Frederic Weisbecker, Peter Zijlstra,
Arjan van de Ven, Dave Hansen, containers, Eric Biederman,
Sukadev Bhattiprolu, Serge E. Hallyn
On Thu, 4 Dec 2008, Ingo Molnar wrote:
>
> * Steven Rostedt <rostedt@goodmis.org> wrote:
>
> > Ingo,
> >
> > This series has three patches.
> >
> > The first patch adds a new feature that I've been wanting to have for
> > some time and Arjan even requested. That is to pick a function and only
> > trace that function and its children. Dynamic ftrace and function graph
> > needs to be enabled for this.
> >
> > To do the above, I added a "trace" flags field in the task structure.
> > The second patch uses this for the ftrace pid code. It searches for the
> > task based on the pid and sets the trace flag, then in the ftrace
> > function caller it only needs to check this flag.
>
> Btw., i'd love to see this done via the regular regexp interface though,
> if possible - instead of the add-on interface you added.
So would I. Unfortunately the regex is tightly coupled to turning on or
off the function. This needs all functions enabled because we do not
know which functions the flagged one will call.
I could reuse the regex code if I add a call back to handle what to do on
a match. This is a bit more work, and will take some time to do.
If someone else has the time to do it, I would offer suggestions and
review the code. Right now I do not have the time myself.
>
> ( Also perhaps enable to toggle tracing via the /proc/<PID>/ hierarchy -
> a /proc/<PID>/tracing_enabled switch or so. )
>
> Regarding the filter functions, the basic principle should be
> mathematical set operations, like we have it now: add and remove, union,
> wildcards, etc.
>
> I'd suggest a natural and intuitive extension of the current syntax.
> (while keeping all the current bits)
>
> I already suggested a 'inverse' filter in a previous mail:
>
> echo "-schedule*" >> set_ftrace_filter
Ah, I did not see the '>>' that might be easier to do. I think you first
suggested this with a "!sched*" > set_ftrace_filter where the '>' would
truncate. But doing it with append '>>', might work.
>
> This rule operates on the current set of filter functions: it strikes out
> all existing filter functions that match this pattern.
>
> To handle PIDs, we could do something like:
>
> echo "sshd-312:schedule" > set_ftrace_filter
>
> This would restrict tracing to the sshd-pid:312 task.
>
> Note: the PID portion of the filter rules still stay separate from the
> function names - we dont want per task function filter rules.
Yep, agreed, A function is traced if the following conditions are true:
- function tracing is enabled
- the function is set to trace (not in set_ftrace_notrace)
- the pid filter is on and the current task has its trace bit set
or the pid filter is off.
- the function filter is on and the function is in the trace array
or the function filter is off
>
> A natural variation would be:
>
> echo "312:schedule" > set_ftrace_filter
>
> to only specify the PID, or:
>
> echo "312,313:schedule" > set_ftrace_filter
>
> to specify two PIDs, or:
>
> echo "sshd:schedule" > set_ftrace_filter
>
> to only specify the 'comm' part, which expands to all PIDs where
> task->comm matches sshd. Another variation would be:
>
> echo "loop*:schedule" > set_ftrace_filter
>
> that matches all PIDs where task->comm matches loop*.
>
> To specify recursive tracing, we could use something like:
>
> echo "loop*+schedule" > set_ftrace_filter
>
> the '+' would signal that the 'schedule' function is 'expanded' and all
> its child functions are traced as well.
>
> btw., maybe it makes sense to separate the regexp rule-set from the set
> of functions that we are tracing right now. For example:
>
> $ echo "schedule*" > set_ftrace_filter
> $ echo "time*" >> set_ftrace_filter
> $ echo "sys_*" >> set_ftrace_filter
>
> $ cat set_ftrace_filter
> schedule*
> time*
> sys_*
>
> We'd also have a separate, current_ftrace_functions file as well which
> shows all traced functions. (on a global basis - with possible PID filter
> rules added where applicable)
>
> I know this will be hellishly hard to implement, but it would be _very_
> elegant, and _very_ usable.
>
> What do you think?
Hmm, that is starting to get quite complex, just to use. This is something
we need to experiment with to find the best solution. I'd like to know use
cases first. Currently I have a simple program that forks, traces itself
and execs code to trace. It is exectued like:
./trace-func ls -ltr
to trace "ls -lrt", this code would become a little more complex with the
above methods. But I'm not set in stone in any of these options. I just
do not want to spend the days coding this to find out no one uses any of
it but what is already there.
-- Steve
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 1/3] ftrace: graph of a single function
2008-12-04 8:41 ` Ingo Molnar
2008-12-04 8:43 ` Peter Zijlstra
@ 2008-12-15 9:21 ` Andy Whitcroft
1 sibling, 0 replies; 26+ messages in thread
From: Andy Whitcroft @ 2008-12-15 9:21 UTC (permalink / raw)
To: Ingo Molnar
Cc: Steven Rostedt, Andrew Morton, linux-kernel, fweisbec, peterz,
arjan, dave, containers, ebiederm, sukadev, serue, srostedt
On Thu, Dec 04, 2008 at 09:41:18AM +0100, Ingo Molnar wrote:
>
> * Steven Rostedt <rostedt@goodmis.org> wrote:
>
> >
> > On Wed, 3 Dec 2008, Andrew Morton wrote:
> >
> > > On Wed, 03 Dec 2008 15:36:57 -0500
> > > Steven Rostedt <rostedt@goodmis.org> wrote:
> > >
> > > > +static struct seq_operations ftrace_graph_seq_ops = {
> > > > + .start = g_start,
> > > > + .next = g_next,
> > > > + .stop = g_stop,
> > > > + .show = g_show,
> > > > +};
> > >
> > > This could be static I think.
> >
> > s/static/const/
> >
> > Damn damn damn damn!!!! I said to myself, I need to add const there and
> > still forgot :-(
>
> No need to get stressed up about such details - we need checkpatch help
> for this.
This seems similar to the file_operations check we added recently. As in
should we be suggesting that seq_operations should generally be const.
That seems consistant at least to my mind.
-apw
^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2008-12-15 9:22 UTC | newest]
Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-03 20:36 [PATCH 0/3] ftrace: updates for tip Steven Rostedt
2008-12-03 20:36 ` [PATCH 1/3] ftrace: graph of a single function Steven Rostedt
2008-12-03 21:07 ` Andrew Morton
2008-12-03 21:10 ` Steven Rostedt
2008-12-03 21:32 ` Andrew Morton
2008-12-03 21:36 ` Steven Rostedt
2008-12-04 8:39 ` Ingo Molnar
2008-12-03 21:08 ` Andrew Morton
2008-12-03 21:11 ` Steven Rostedt
2008-12-04 8:41 ` Ingo Molnar
2008-12-04 8:43 ` Peter Zijlstra
2008-12-15 9:21 ` Andy Whitcroft
2008-12-04 6:24 ` [PATCH 1/1] ftrace: avoid duplicated function when writing set_graph_function Liming Wang
2008-12-04 8:42 ` Ingo Molnar
2008-12-03 20:36 ` [PATCH 2/3] ftrace: use task struct trace flag to filter on pid Steven Rostedt
2008-12-03 22:34 ` Eric W. Biederman
2008-12-03 20:36 ` [PATCH 3/3] ftrace: trace single pid for function graph tracer Steven Rostedt
2008-12-03 20:49 ` Andrew Morton
2008-12-03 20:52 ` Steven Rostedt
2008-12-03 23:36 ` Eric W. Biederman
2008-12-04 2:29 ` Steven Rostedt
2008-12-04 4:22 ` Eric W. Biederman
2008-12-04 4:32 ` Steven Rostedt
2008-12-04 8:19 ` [PATCH 0/3] ftrace: updates for tip Ingo Molnar
2008-12-04 8:35 ` Ingo Molnar
2008-12-04 13:30 ` Steven Rostedt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox