aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2010-10-19 14:41:38 -0400
committerIngo Molnar <mingo@elte.hu>2010-10-19 14:41:38 -0400
commit750ed158bf6c782d2813da1bca2c824365a0b777 (patch)
tree49bc9fb43e5211c97c8e572cb5b6b9352ea1aa14
parent3f7edb1656e5beba2b5e617d31e4064e1eed0bc0 (diff)
parent7e40798f406fe73f9bac496a390daabd8768a8f7 (diff)
Merge branch 'tip/perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-trace into perf/core
-rw-r--r--kernel/trace/ftrace.c4
-rw-r--r--kernel/trace/trace.c2
-rw-r--r--kernel/trace/trace.h4
-rw-r--r--kernel/trace/trace_functions_graph.c86
-rw-r--r--kernel/trace/trace_irqsoff.c152
-rw-r--r--kernel/trace/trace_sched_wakeup.c256
6 files changed, 373 insertions, 131 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 65fb077ea79c..ebd80d50c474 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1638,8 +1638,8 @@ ftrace_failures_open(struct inode *inode, struct file *file)
1638 1638
1639 ret = ftrace_avail_open(inode, file); 1639 ret = ftrace_avail_open(inode, file);
1640 if (!ret) { 1640 if (!ret) {
1641 m = (struct seq_file *)file->private_data; 1641 m = file->private_data;
1642 iter = (struct ftrace_iterator *)m->private; 1642 iter = m->private;
1643 iter->flags = FTRACE_ITER_FAILURES; 1643 iter->flags = FTRACE_ITER_FAILURES;
1644 } 1644 }
1645 1645
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 9ec59f541156..001bcd2ccf4a 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -2196,7 +2196,7 @@ int tracing_open_generic(struct inode *inode, struct file *filp)
2196 2196
2197static int tracing_release(struct inode *inode, struct file *file) 2197static int tracing_release(struct inode *inode, struct file *file)
2198{ 2198{
2199 struct seq_file *m = (struct seq_file *)file->private_data; 2199 struct seq_file *m = file->private_data;
2200 struct trace_iterator *iter; 2200 struct trace_iterator *iter;
2201 int cpu; 2201 int cpu;
2202 2202
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index d39b3c5454a5..9021f8c0c0c3 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -343,6 +343,10 @@ void trace_function(struct trace_array *tr,
343 unsigned long ip, 343 unsigned long ip,
344 unsigned long parent_ip, 344 unsigned long parent_ip,
345 unsigned long flags, int pc); 345 unsigned long flags, int pc);
346void trace_graph_function(struct trace_array *tr,
347 unsigned long ip,
348 unsigned long parent_ip,
349 unsigned long flags, int pc);
346void trace_default_header(struct seq_file *m); 350void trace_default_header(struct seq_file *m);
347void print_trace_header(struct seq_file *m, struct trace_iterator *iter); 351void print_trace_header(struct seq_file *m, struct trace_iterator *iter);
348int trace_empty(struct trace_iterator *iter); 352int trace_empty(struct trace_iterator *iter);
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
index ef49e9370b25..76b05980225c 100644
--- a/kernel/trace/trace_functions_graph.c
+++ b/kernel/trace/trace_functions_graph.c
@@ -262,6 +262,34 @@ int trace_graph_thresh_entry(struct ftrace_graph_ent *trace)
262 return trace_graph_entry(trace); 262 return trace_graph_entry(trace);
263} 263}
264 264
265static void
266__trace_graph_function(struct trace_array *tr,
267 unsigned long ip, unsigned long flags, int pc)
268{
269 u64 time = trace_clock_local();
270 struct ftrace_graph_ent ent = {
271 .func = ip,
272 .depth = 0,
273 };
274 struct ftrace_graph_ret ret = {
275 .func = ip,
276 .depth = 0,
277 .calltime = time,
278 .rettime = time,
279 };
280
281 __trace_graph_entry(tr, &ent, flags, pc);
282 __trace_graph_return(tr, &ret, flags, pc);
283}
284
285void
286trace_graph_function(struct trace_array *tr,
287 unsigned long ip, unsigned long parent_ip,
288 unsigned long flags, int pc)
289{
290 __trace_graph_function(tr, ip, flags, pc);
291}
292
265void __trace_graph_return(struct trace_array *tr, 293void __trace_graph_return(struct trace_array *tr,
266 struct ftrace_graph_ret *trace, 294 struct ftrace_graph_ret *trace,
267 unsigned long flags, 295 unsigned long flags,
@@ -888,12 +916,20 @@ check_irq_entry(struct trace_iterator *iter, u32 flags,
888 unsigned long addr, int depth) 916 unsigned long addr, int depth)
889{ 917{
890 int cpu = iter->cpu; 918 int cpu = iter->cpu;
919 int *depth_irq;
891 struct fgraph_data *data = iter->private; 920 struct fgraph_data *data = iter->private;
892 int *depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);
893 921
894 if (flags & TRACE_GRAPH_PRINT_IRQS) 922 /*
923 * If we are either displaying irqs, or we got called as
924 * a graph event and private data does not exist,
925 * then we bypass the irq check.
926 */
927 if ((flags & TRACE_GRAPH_PRINT_IRQS) ||
928 (!data))
895 return 0; 929 return 0;
896 930
931 depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);
932
897 /* 933 /*
898 * We are inside the irq code 934 * We are inside the irq code
899 */ 935 */
@@ -926,12 +962,20 @@ static int
926check_irq_return(struct trace_iterator *iter, u32 flags, int depth) 962check_irq_return(struct trace_iterator *iter, u32 flags, int depth)
927{ 963{
928 int cpu = iter->cpu; 964 int cpu = iter->cpu;
965 int *depth_irq;
929 struct fgraph_data *data = iter->private; 966 struct fgraph_data *data = iter->private;
930 int *depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);
931 967
932 if (flags & TRACE_GRAPH_PRINT_IRQS) 968 /*
969 * If we are either displaying irqs, or we got called as
970 * a graph event and private data does not exist,
971 * then we bypass the irq check.
972 */
973 if ((flags & TRACE_GRAPH_PRINT_IRQS) ||
974 (!data))
933 return 0; 975 return 0;
934 976
977 depth_irq = &(per_cpu_ptr(data->cpu_data, cpu)->depth_irq);
978
935 /* 979 /*
936 * We are not inside the irq code. 980 * We are not inside the irq code.
937 */ 981 */
@@ -1163,7 +1207,7 @@ print_graph_comment(struct trace_seq *s, struct trace_entry *ent,
1163 1207
1164 1208
1165enum print_line_t 1209enum print_line_t
1166print_graph_function_flags(struct trace_iterator *iter, u32 flags) 1210__print_graph_function_flags(struct trace_iterator *iter, u32 flags)
1167{ 1211{
1168 struct ftrace_graph_ent_entry *field; 1212 struct ftrace_graph_ent_entry *field;
1169 struct fgraph_data *data = iter->private; 1213 struct fgraph_data *data = iter->private;
@@ -1226,7 +1270,18 @@ print_graph_function_flags(struct trace_iterator *iter, u32 flags)
1226static enum print_line_t 1270static enum print_line_t
1227print_graph_function(struct trace_iterator *iter) 1271print_graph_function(struct trace_iterator *iter)
1228{ 1272{
1229 return print_graph_function_flags(iter, tracer_flags.val); 1273 return __print_graph_function_flags(iter, tracer_flags.val);
1274}
1275
1276enum print_line_t print_graph_function_flags(struct trace_iterator *iter,
1277 u32 flags)
1278{
1279 if (trace_flags & TRACE_ITER_LATENCY_FMT)
1280 flags |= TRACE_GRAPH_PRINT_DURATION;
1281 else
1282 flags |= TRACE_GRAPH_PRINT_ABS_TIME;
1283
1284 return __print_graph_function_flags(iter, flags);
1230} 1285}
1231 1286
1232static enum print_line_t 1287static enum print_line_t
@@ -1258,7 +1313,7 @@ static void print_lat_header(struct seq_file *s, u32 flags)
1258 seq_printf(s, "#%.*s|||| / \n", size, spaces); 1313 seq_printf(s, "#%.*s|||| / \n", size, spaces);
1259} 1314}
1260 1315
1261void print_graph_headers_flags(struct seq_file *s, u32 flags) 1316static void __print_graph_headers_flags(struct seq_file *s, u32 flags)
1262{ 1317{
1263 int lat = trace_flags & TRACE_ITER_LATENCY_FMT;