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 @@ | |||
| 13 | #include <linux/sysctl.h> | 13 | #include <linux/sysctl.h> |
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/fs.h> | 15 | #include <linux/fs.h> |
| 16 | |||
| 17 | #include <asm/setup.h> | ||
| 18 | |||
| 16 | #include "trace.h" | 19 | #include "trace.h" |
| 17 | 20 | ||
| 18 | #define STACK_TRACE_ENTRIES 500 | 21 | #define STACK_TRACE_ENTRIES 500 |
| @@ -133,7 +136,6 @@ stack_trace_call(unsigned long ip, unsigned long parent_ip) | |||
| 133 | static struct ftrace_ops trace_ops __read_mostly = | 136 | static struct ftrace_ops trace_ops __read_mostly = |
| 134 | { | 137 | { |
| 135 | .func = stack_trace_call, | 138 | .func = stack_trace_call, |
| 136 | .flags = FTRACE_OPS_FL_GLOBAL, | ||
| 137 | }; | 139 | }; |
| 138 | 140 | ||
| 139 | static ssize_t | 141 | static ssize_t |
| @@ -311,6 +313,21 @@ static const struct file_operations stack_trace_fops = { | |||
| 311 | .release = seq_release, | 313 | .release = seq_release, |
| 312 | }; | 314 | }; |
| 313 | 315 | ||
| 316 | static int | ||
| 317 | stack_trace_filter_open(struct inode *inode, struct file *file) | ||
| 318 | { | ||
| 319 | return ftrace_regex_open(&trace_ops, FTRACE_ITER_FILTER, | ||
| 320 | inode, file); | ||
| 321 | } | ||
| 322 | |||
| 323 | static const struct file_operations stack_trace_filter_fops = { | ||
| 324 | .open = stack_trace_filter_open, | ||
| 325 | .read = seq_read, | ||
| 326 | .write = ftrace_filter_write, | ||
| 327 | .llseek = ftrace_regex_lseek, | ||
| 328 | .release = ftrace_regex_release, | ||
| 329 | }; | ||
| 330 | |||
| 314 | int | 331 | int |
| 315 | stack_trace_sysctl(struct ctl_table *table, int write, | 332 | stack_trace_sysctl(struct ctl_table *table, int write, |
| 316 | void __user *buffer, size_t *lenp, | 333 | void __user *buffer, size_t *lenp, |
| @@ -338,8 +355,13 @@ stack_trace_sysctl(struct ctl_table *table, int write, | |||
| 338 | return ret; | 355 | return ret; |
| 339 | } | 356 | } |
| 340 | 357 | ||
| 358 | static char stack_trace_filter_buf[COMMAND_LINE_SIZE+1] __initdata; | ||
| 359 | |||
| 341 | static __init int enable_stacktrace(char *str) | 360 | static __init int enable_stacktrace(char *str) |
| 342 | { | 361 | { |
| 362 | if (strncmp(str, "_filter=", 8) == 0) | ||
| 363 | strncpy(stack_trace_filter_buf, str+8, COMMAND_LINE_SIZE); | ||
| 364 | |||
| 343 | stack_tracer_enabled = 1; | 365 | stack_tracer_enabled = 1; |
| 344 | last_stack_tracer_enabled = 1; | 366 | last_stack_tracer_enabled = 1; |
| 345 | return 1; | 367 | return 1; |
| @@ -358,6 +380,12 @@ static __init int stack_trace_init(void) | |||
| 358 | trace_create_file("stack_trace", 0444, d_tracer, | 380 | trace_create_file("stack_trace", 0444, d_tracer, |
| 359 | NULL, &stack_trace_fops); | 381 | NULL, &stack_trace_fops); |
| 360 | 382 | ||
| 383 | trace_create_file("stack_trace_filter", 0444, d_tracer, | ||
| 384 | NULL, &stack_trace_filter_fops); | ||
| 385 | |||
| 386 | if (stack_trace_filter_buf[0]) | ||
| 387 | ftrace_set_early_filter(&trace_ops, stack_trace_filter_buf, 1); | ||
| 388 | |||
| 361 | if (stack_tracer_enabled) | 389 | if (stack_tracer_enabled) |
| 362 | register_ftrace_function(&trace_ops); | 390 | register_ftrace_function(&trace_ops); |
| 363 | 391 | ||
