Create a "set_ftrace_filter" and "set_ftrace_notrace" files in the instance directories to let users filter of functions to trace for the given instance.
Showing the changes to kernel/trace/trace_functions.c (1 of 5 files). Show all
Unified · Split
| @@ -52,10 +52,34 @@ static int allocate_ftrace_ops(struct trace_array *tr) · 51 unmodified lines | |||
| 52 | return 0; | 52 | return 0; |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | |||
| 56 | int ftrace_create_function_files(struct trace_array *tr, | ||
| 57 | struct dentry *parent) | ||
| 58 | { | ||
| 59 | int ret; | ||
| 60 | |||
| 61 | /* The top level array uses the "global_ops". */ | ||
| 62 | if (!(tr->flags & TRACE_ARRAY_FL_GLOBAL)) { | ||
| 63 | ret = allocate_ftrace_ops(tr); | ||
| 64 | if (ret) | ||
| 65 | return ret; | ||
| 66 | } | ||
| 67 | |||
| 68 | ftrace_create_filter_files(tr->ops, parent); | ||
| 69 | |||
| 70 | return 0; | ||
| 71 | } | ||
| 72 | |||
| 73 | void ftrace_destroy_function_files(struct trace_array *tr) | ||
| 74 | { | ||
| 75 | ftrace_destroy_filter_files(tr->ops); | ||
| 76 | kfree(tr->ops); | ||
| 77 | tr->ops = NULL; | ||
| 78 | } | ||
| 79 | |||
| 55 | static int function_trace_init(struct trace_array *tr) | 80 | static int function_trace_init(struct trace_array *tr) |
| 56 | { | 81 | { |
| 57 | struct ftrace_ops *ops; | 82 | struct ftrace_ops *ops; |
| 58 | int ret; | ||
| 59 | 83 | ||
| 60 | if (tr->flags & TRACE_ARRAY_FL_GLOBAL) { | 84 | if (tr->flags & TRACE_ARRAY_FL_GLOBAL) { |
| 61 | /* There's only one global tr */ | 85 | /* There's only one global tr */ |
| @@ -69,10 +93,13 @@ static int function_trace_init(struct trace_array *tr) · 7 unmodified lines | |||
| 69 | else | 93 | else |
| 70 | ops = &trace_ops; | 94 | ops = &trace_ops; |
| 71 | tr->ops = ops; | 95 | tr->ops = ops; |
| 72 | } else { | 96 | } else if (!tr->ops) { |
| 73 | ret = allocate_ftrace_ops(tr); | 97 | /* |
| 74 | if (ret) | 98 | * Instance trace_arrays get their ops allocated |
| 75 | return ret; | 99 | * at instance creation. Unless it failed |
| 100 | * the allocation. | ||
| 101 | */ | ||
| 102 | return -ENOMEM; | ||
| 76 | } | 103 | } |
| 77 | 104 | ||
| 78 | tr->trace_buffer.cpu = get_cpu(); | 105 | tr->trace_buffer.cpu = get_cpu(); |
| @@ -87,9 +114,6 @@ static void function_trace_reset(struct trace_array *tr) · 8 unmodified lines | |||
| 87 | { | 114 | { |
| 88 | tracing_stop_function_trace(tr); | 115 | tracing_stop_function_trace(tr); |
| 89 | tracing_stop_cmdline_record(); | 116 | tracing_stop_cmdline_record(); |
| 90 | if (!(tr->flags & TRACE_ARRAY_FL_GLOBAL)) | ||
| 91 | kfree(tr->ops); | ||
| 92 | tr->ops = NULL; | ||
| 93 | } | 117 | } |
| 94 | 118 | ||
| 95 | static void function_trace_start(struct trace_array *tr) | 119 | static void function_trace_start(struct trace_array *tr) |