diff options
Diffstat (limited to 'kernel/trace/ftrace.c')
-rw-r--r-- | kernel/trace/ftrace.c | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 140699a9a8a7..d6973dfadb36 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <trace/events/sched.h> | 32 | #include <trace/events/sched.h> |
33 | 33 | ||
34 | #include <asm/ftrace.h> | 34 | #include <asm/ftrace.h> |
35 | #include <asm/setup.h> | ||
35 | 36 | ||
36 | #include "trace_output.h" | 37 | #include "trace_output.h" |
37 | #include "trace_stat.h" | 38 | #include "trace_stat.h" |
@@ -598,7 +599,7 @@ function_profile_call(unsigned long ip, unsigned long parent_ip) | |||
598 | local_irq_save(flags); | 599 | local_irq_save(flags); |
599 | 600 | ||
600 | stat = &__get_cpu_var(ftrace_profile_stats); | 601 | stat = &__get_cpu_var(ftrace_profile_stats); |
601 | if (!stat->hash) | 602 | if (!stat->hash || !ftrace_profile_enabled) |
602 | goto out; | 603 | goto out; |
603 | 604 | ||
604 | rec = ftrace_find_profiled_func(stat, ip); | 605 | rec = ftrace_find_profiled_func(stat, ip); |
@@ -629,7 +630,7 @@ static void profile_graph_return(struct ftrace_graph_ret *trace) | |||
629 | 630 | ||
630 | local_irq_save(flags); | 631 | local_irq_save(flags); |
631 | stat = &__get_cpu_var(ftrace_profile_stats); | 632 | stat = &__get_cpu_var(ftrace_profile_stats); |
632 | if (!stat->hash) | 633 | if (!stat->hash || !ftrace_profile_enabled) |
633 | goto out; | 634 | goto out; |
634 | 635 | ||
635 | calltime = trace->rettime - trace->calltime; | 636 | calltime = trace->rettime - trace->calltime; |
@@ -723,6 +724,10 @@ ftrace_profile_write(struct file *filp, const char __user *ubuf, | |||
723 | ftrace_profile_enabled = 1; | 724 | ftrace_profile_enabled = 1; |
724 | } else { | 725 | } else { |
725 | ftrace_profile_enabled = 0; | 726 | ftrace_profile_enabled = 0; |
727 | /* | ||
728 | * unregister_ftrace_profiler calls stop_machine | ||
729 | * so this acts like an synchronize_sched. | ||
730 | */ | ||
726 | unregister_ftrace_profiler(); | 731 | unregister_ftrace_profiler(); |
727 | } | 732 | } |
728 | } | 733 | } |
@@ -2369,6 +2374,45 @@ void ftrace_set_notrace(unsigned char *buf, int len, int reset) | |||
2369 | ftrace_set_regex(buf, len, reset, 0); | 2374 | ftrace_set_regex(buf, len, reset, 0); |
2370 | } | 2375 | } |
2371 | 2376 | ||
2377 | /* | ||
2378 | * command line interface to allow users to set filters on boot up. | ||
2379 | */ | ||
2380 | #define FTRACE_FILTER_SIZE COMMAND_LINE_SIZE | ||
2381 | static char ftrace_notrace_buf[FTRACE_FILTER_SIZE] __initdata; | ||
2382 | static char ftrace_filter_buf[FTRACE_FILTER_SIZE] __initdata; | ||
2383 | |||
2384 | static int __init set_ftrace_notrace(char *str) | ||
2385 | { | ||
2386 | strncpy(ftrace_notrace_buf, str, FTRACE_FILTER_SIZE); | ||
2387 | return 1; | ||
2388 | } | ||
2389 | __setup("ftrace_notrace=", set_ftrace_notrace); | ||
2390 | |||
2391 | static int __init set_ftrace_filter(char *str) | ||
2392 | { | ||
2393 | strncpy(ftrace_filter_buf, str, FTRACE_FILTER_SIZE); | ||
2394 | return 1; | ||
2395 | } | ||
2396 | __setup("ftrace_filter=", set_ftrace_filter); | ||
2397 | |||
2398 | static void __init set_ftrace_early_filter(char *buf, int enable) | ||
2399 | { | ||
2400 | char *func; | ||
2401 | |||
2402 | while (buf) { | ||
2403 | func = strsep(&buf, ","); | ||
2404 | ftrace_set_regex(func, strlen(func), 0, enable); | ||
2405 | } | ||
2406 | } | ||
2407 | |||
2408 | static void __init set_ftrace_early_filters(void) | ||
2409 | { | ||
2410 | if (ftrace_filter_buf[0]) | ||
2411 | set_ftrace_early_filter(ftrace_filter_buf, 1); | ||
2412 | if (ftrace_notrace_buf[0]) | ||
2413 | set_ftrace_early_filter(ftrace_notrace_buf, 0); | ||
2414 | } | ||
2415 | |||
2372 | static int | 2416 | static int |
2373 | ftrace_regex_release(struct inode *inode, struct file *file, int enable) | 2417 | ftrace_regex_release(struct inode *inode, struct file *file, int enable) |
2374 | { | 2418 | { |
@@ -2829,6 +2873,8 @@ void __init ftrace_init(void) | |||
2829 | if (ret) | 2873 | if (ret) |
2830 | pr_warning("Failed to register trace ftrace module notifier\n"); | 2874 | pr_warning("Failed to register trace ftrace module notifier\n"); |
2831 | 2875 | ||
2876 | set_ftrace_early_filters(); | ||
2877 | |||
2832 | return; | 2878 | return; |
2833 | failed: | 2879 | failed: |
2834 | ftrace_disabled = 1; | 2880 | ftrace_disabled = 1; |