diff options
| -rw-r--r-- | kernel/trace/ftrace.c | 6 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 24 | ||||
| -rw-r--r-- | kernel/trace/trace.h | 3 | ||||
| -rw-r--r-- | kernel/trace/trace_functions_graph.c | 27 |
4 files changed, 48 insertions, 12 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 83783579378f..d4d1238b096b 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -84,10 +84,6 @@ ftrace_func_t ftrace_trace_function __read_mostly = ftrace_stub; | |||
| 84 | ftrace_func_t __ftrace_trace_function __read_mostly = ftrace_stub; | 84 | ftrace_func_t __ftrace_trace_function __read_mostly = ftrace_stub; |
| 85 | ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub; | 85 | ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub; |
| 86 | 86 | ||
| 87 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
| 88 | static int ftrace_set_func(unsigned long *array, int *idx, char *buffer); | ||
| 89 | #endif | ||
| 90 | |||
| 91 | static void ftrace_list_func(unsigned long ip, unsigned long parent_ip) | 87 | static void ftrace_list_func(unsigned long ip, unsigned long parent_ip) |
| 92 | { | 88 | { |
| 93 | struct ftrace_ops *op = ftrace_list; | 89 | struct ftrace_ops *op = ftrace_list; |
| @@ -2276,6 +2272,8 @@ __setup("ftrace_filter=", set_ftrace_filter); | |||
| 2276 | 2272 | ||
| 2277 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 2273 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
| 2278 | static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata; | 2274 | static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata; |
| 2275 | static int ftrace_set_func(unsigned long *array, int *idx, char *buffer); | ||
| 2276 | |||
| 2279 | static int __init set_graph_function(char *str) | 2277 | static int __init set_graph_function(char *str) |
| 2280 | { | 2278 | { |
| 2281 | strlcpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE); | 2279 | strlcpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE); |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 5edf410bc540..6af8d7bc953b 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -374,6 +374,21 @@ static int __init set_buf_size(char *str) | |||
| 374 | } | 374 | } |
| 375 | __setup("trace_buf_size=", set_buf_size); | 375 | __setup("trace_buf_size=", set_buf_size); |
| 376 | 376 | ||
| 377 | static int __init set_tracing_thresh(char *str) | ||
| 378 | { | ||
| 379 | unsigned long threshhold; | ||
| 380 | int ret; | ||
| 381 | |||
| 382 | if (!str) | ||
| 383 | return 0; | ||
| 384 | ret = strict_strtoul(str, 0, &threshhold); | ||
| 385 | if (ret < 0) | ||
| 386 | return 0; | ||
| 387 | tracing_thresh = threshhold * 1000; | ||
| 388 | return 1; | ||
| 389 | } | ||
| 390 | __setup("tracing_thresh=", set_tracing_thresh); | ||
| 391 | |||
| 377 | unsigned long nsecs_to_usecs(unsigned long nsecs) | 392 | unsigned long nsecs_to_usecs(unsigned long nsecs) |
| 378 | { | 393 | { |
| 379 | return nsecs / 1000; | 394 | return nsecs / 1000; |
| @@ -579,9 +594,10 @@ static ssize_t trace_seq_to_buffer(struct trace_seq *s, void *buf, size_t cnt) | |||
| 579 | static arch_spinlock_t ftrace_max_lock = | 594 | static arch_spinlock_t ftrace_max_lock = |
| 580 | (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; | 595 | (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; |
| 581 | 596 | ||
| 597 | unsigned long __read_mostly tracing_thresh; | ||
| 598 | |||
| 582 | #ifdef CONFIG_TRACER_MAX_TRACE | 599 | #ifdef CONFIG_TRACER_MAX_TRACE |
| 583 | unsigned long __read_mostly tracing_max_latency; | 600 | unsigned long __read_mostly tracing_max_latency; |
| 584 | unsigned long __read_mostly tracing_thresh; | ||
| 585 | 601 | ||
| 586 | /* | 602 | /* |
| 587 | * Copy the new maximum trace into the separate maximum-trace | 603 | * Copy the new maximum trace into the separate maximum-trace |
| @@ -592,7 +608,7 @@ static void | |||
| 592 | __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) | 608 | __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) |
| 593 | { | 609 | { |
| 594 | struct trace_array_cpu *data = tr->data[cpu]; | 610 | struct trace_array_cpu *data = tr->data[cpu]; |
| 595 | struct trace_array_cpu *max_data = tr->data[cpu]; | 611 | struct trace_array_cpu *max_data; |
| 596 | 612 | ||
| 597 | max_tr.cpu = cpu; | 613 | max_tr.cpu = cpu; |
| 598 | max_tr.time_start = data->preempt_timestamp; | 614 | max_tr.time_start = data->preempt_timestamp; |
| @@ -602,7 +618,7 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) | |||
| 602 | max_data->critical_start = data->critical_start; | 618 | max_data->critical_start = data->critical_start; |
| 603 | max_data->critical_end = data->critical_end; | 619 | max_data->critical_end = data->critical_end; |
| 604 | 620 | ||
| 605 | memcpy(data->comm, tsk->comm, TASK_COMM_LEN); | 621 | memcpy(max_data->comm, tsk->comm, TASK_COMM_LEN); |
| 606 | max_data->pid = tsk->pid; | 622 | max_data->pid = tsk->pid; |
| 607 | max_data->uid = task_uid(tsk); | 623 | max_data->uid = task_uid(tsk); |
| 608 | max_data->nice = tsk->static_prio - 20 - MAX_RT_PRIO; | 624 | max_data->nice = tsk->static_prio - 20 - MAX_RT_PRIO; |
| @@ -4249,10 +4265,10 @@ static __init int tracer_init_debugfs(void) | |||
| 4249 | #ifdef CONFIG_TRACER_MAX_TRACE | 4265 | #ifdef CONFIG_TRACER_MAX_TRACE |
| 4250 | trace_create_file("tracing_max_latency", 0644, d_tracer, | 4266 | trace_create_file("tracing_max_latency", 0644, d_tracer, |
| 4251 | &tracing_max_latency, &tracing_max_lat_fops); | 4267 | &tracing_max_latency, &tracing_max_lat_fops); |
| 4268 | #endif | ||
| 4252 | 4269 | ||
| 4253 | trace_create_file("tracing_thresh", 0644, d_tracer, | 4270 | trace_create_file("tracing_thresh", 0644, d_tracer, |
| 4254 | &tracing_thresh, &tracing_max_lat_fops); | 4271 | &tracing_thresh, &tracing_max_lat_fops); |
| 4255 | #endif | ||
| 4256 | 4272 | ||
| 4257 | trace_create_file("README", 0444, d_tracer, | 4273 | trace_create_file("README", 0444, d_tracer, |
| 4258 | NULL, &tracing_readme_fops); | 4274 | NULL, &tracing_readme_fops); |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index fd05bcaf91b0..1bc8cd1431d7 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
| @@ -396,9 +396,10 @@ extern int process_new_ksym_entry(char *ksymname, int op, unsigned long addr); | |||
| 396 | 396 | ||
| 397 | extern unsigned long nsecs_to_usecs(unsigned long nsecs); | 397 | extern unsigned long nsecs_to_usecs(unsigned long nsecs); |
| 398 | 398 | ||
| 399 | extern unsigned long tracing_thresh; | ||
| 400 | |||
| 399 | #ifdef CONFIG_TRACER_MAX_TRACE | 401 | #ifdef CONFIG_TRACER_MAX_TRACE |
| 400 | extern unsigned long tracing_max_latency; | 402 | extern unsigned long tracing_max_latency; |
| 401 | extern unsigned long tracing_thresh; | ||
| 402 | 403 | ||
| 403 | void update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu); | 404 | void update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu); |
| 404 | void update_max_tr_single(struct trace_array *tr, | 405 | void update_max_tr_single(struct trace_array *tr, |
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index e998a824e9db..e9df04b60267 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c | |||
| @@ -237,6 +237,14 @@ int trace_graph_entry(struct ftrace_graph_ent *trace) | |||
| 237 | return ret; | 237 | return ret; |
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | int trace_graph_thresh_entry(struct ftrace_graph_ent *trace) | ||
| 241 | { | ||
| 242 | if (tracing_thresh) | ||
| 243 | return 1; | ||
| 244 | else | ||
| 245 | return trace_graph_entry(trace); | ||
| 246 | } | ||
| 247 | |||
| 240 | static void __trace_graph_return(struct trace_array *tr, | 248 | static void __trace_graph_return(struct trace_array *tr, |
| 241 | struct ftrace_graph_ret *trace, | 249 | struct ftrace_graph_ret *trace, |
| 242 | unsigned long flags, | 250 | unsigned long flags, |
| @@ -290,13 +298,26 @@ void set_graph_array(struct trace_array *tr) | |||
| 290 | smp_mb(); | 298 | smp_mb(); |
| 291 | } | 299 | } |
| 292 | 300 | ||
| 301 | void trace_graph_thresh_return(struct ftrace_graph_ret *trace) | ||
| 302 | { | ||
| 303 | if (tracing_thresh && | ||
| 304 | (trace->rettime - trace->calltime < tracing_thresh)) | ||
| 305 | return; | ||
| 306 | else | ||
| 307 | trace_graph_return(trace); | ||
| 308 | } | ||
| 309 | |||
| 293 | static int graph_trace_init(struct trace_array *tr) | 310 | static int graph_trace_init(struct trace_array *tr) |
| 294 | { | 311 | { |
| 295 | int ret; | 312 | int ret; |
| 296 | 313 | ||
| 297 | set_graph_array(tr); | 314 | set_graph_array(tr); |
| 298 | ret = register_ftrace_graph(&trace_graph_return, | 315 | if (tracing_thresh) |
| 299 | &trace_graph_entry); | 316 | ret = register_ftrace_graph(&trace_graph_thresh_return, |
| 317 | &trace_graph_thresh_entry); | ||
| 318 | else | ||
| 319 | ret = register_ftrace_graph(&trace_graph_return, | ||
| 320 | &trace_graph_entry); | ||
| 300 | if (ret) | 321 | if (ret) |
| 301 | return ret; | 322 | return ret; |
| 302 | tracing_start_cmdline_record(); | 323 | tracing_start_cmdline_record(); |
| @@ -920,7 +941,7 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s, | |||
| 920 | if (!ret) | 941 | if (!ret) |
| 921 | return TRACE_TYPE_PARTIAL_LINE; | 942 | return TRACE_TYPE_PARTIAL_LINE; |
| 922 | } else { | 943 | } else { |
| 923 | ret = trace_seq_printf(s, "} (%ps)\n", (void *)trace->func); | 944 | ret = trace_seq_printf(s, "} /* %ps */\n", (void *)trace->func); |
| 924 | if (!ret) | 945 | if (!ret) |
| 925 | return TRACE_TYPE_PARTIAL_LINE; | 946 | return TRACE_TYPE_PARTIAL_LINE; |
| 926 | } | 947 | } |
