diff options
Diffstat (limited to 'kernel/trace/trace_stack.c')
| -rw-r--r-- | kernel/trace/trace_stack.c | 30 | 
1 files changed, 29 insertions, 1 deletions
| diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index 77575b386d97..d4545f49242e 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c @@ -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 @@ -133,7 +136,6 @@ stack_trace_call(unsigned long ip, unsigned long parent_ip)  static struct ftrace_ops trace_ops __read_mostly =  {  	.func = stack_trace_call, -	.flags = FTRACE_OPS_FL_GLOBAL,  };  static ssize_t @@ -311,6 +313,21 @@ static const struct file_operations stack_trace_fops = {  	.release	= seq_release,  }; +static int +stack_trace_filter_open(struct inode *inode, struct file *file) +{ +	return ftrace_regex_open(&trace_ops, FTRACE_ITER_FILTER, +				 inode, file); +} + +static const struct file_operations stack_trace_filter_fops = { +	.open = stack_trace_filter_open, +	.read = seq_read, +	.write = ftrace_filter_write, +	.llseek = ftrace_regex_lseek, +	.release = ftrace_regex_release, +}; +  int  stack_trace_sysctl(struct ctl_table *table, int write,  		   void __user *buffer, size_t *lenp, @@ -338,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; @@ -358,6 +380,12 @@ static __init int stack_trace_init(void)  	trace_create_file("stack_trace", 0444, d_tracer,  			NULL, &stack_trace_fops); +	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); | 
