tracing: Have stack tracing set filtered functions at boot
authorSteven Rostedt <srostedt@redhat.com>
Tue, 20 Dec 2011 03:01:00 +0000 (22:01 -0500)
committerSteven Rostedt <rostedt@goodmis.org>
Wed, 21 Dec 2011 12:26:49 +0000 (07:26 -0500)
Add stacktrace_filter= to the kernel command line that lets
the user pick specific functions to check the stack on.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Documentation/kernel-parameters.txt
kernel/trace/trace_stack.c

index fd5c913..fde2ae0 100644 (file)
@@ -2435,6 +2435,14 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
        stacktrace      [FTRACE]
                        Enabled the stack tracer on boot up.
 
+       stacktrace_filter=[function-list]
+                       [FTRACE] Limit the functions that the stack tracer
+                       will trace at boot up. function-list is a comma separated
+                       list of functions. This list can be changed at run
+                       time by the stack_trace_filter file in the debugfs
+                       tracing directory. Note, this enables stack tracing
+                       and the stacktrace above is not needed.
+
        sti=            [PARISC,HW]
                        Format: <num>
                        Set the STI (builtin display/keyboard on the HP-PARISC
index 0398b7c..d4545f4 100644 (file)
@@ -13,6 +13,9 @@
 #include <linux/sysctl.h>
 #include <linux/init.h>
 #include <linux/fs.h>
+
+#include <asm/setup.h>
+
 #include "trace.h"
 
 #define STACK_TRACE_ENTRIES 500
@@ -352,8 +355,13 @@ stack_trace_sysctl(struct ctl_table *table, int write,
        return ret;
 }
 
+static char stack_trace_filter_buf[COMMAND_LINE_SIZE+1] __initdata;
+
 static __init int enable_stacktrace(char *str)
 {
+       if (strncmp(str, "_filter=", 8) == 0)
+               strncpy(stack_trace_filter_buf, str+8, COMMAND_LINE_SIZE);
+
        stack_tracer_enabled = 1;
        last_stack_tracer_enabled = 1;
        return 1;
@@ -375,6 +383,9 @@ static __init int stack_trace_init(void)
        trace_create_file("stack_trace_filter", 0444, d_tracer,
                        NULL, &stack_trace_filter_fops);
 
+       if (stack_trace_filter_buf[0])
+               ftrace_set_early_filter(&trace_ops, stack_trace_filter_buf, 1);
+
        if (stack_tracer_enabled)
                register_ftrace_function(&trace_ops);