diff options
| author | Steven Rostedt (Red Hat) <rostedt@goodmis.org> | 2014-06-02 23:20:15 -0400 |
|---|---|---|
| committer | Jiri Olsa <jolsa@kernel.org> | 2014-06-07 17:33:37 -0400 |
| commit | 49440828ad7b809e9d31f6108875e3b1e974690c (patch) | |
| tree | 73a9c6e1d464a99db3d444bcc400e5e8acba9889 | |
| parent | 5827f2faabe40cc285cc67b697277547a19b6c9a (diff) | |
tools lib traceevent: Add options to function plugin
Add the options "parent" and "indent" to the function plugin.
When parent is set, the output looks like this:
function: fsnotify_modify <-- vfs_write
function: zone_statistics <-- get_page_from_freelist
function: __inc_zone_state <-- zone_statistics
function: inotify_inode_queue_event <-- fsnotify_modify
function: fsnotify_parent <-- fsnotify_modify
function: __inc_zone_state <-- zone_statistics
function: __fsnotify_parent <-- fsnotify_parent
function: inotify_dentry_parent_queue_event <-- fsnotify_parent
function: add_to_page_cache_lru <-- do_read_cache_page
When it's not set, it looks like:
function: fsnotify_modify
function: zone_statistics
function: __inc_zone_state
function: inotify_inode_queue_event
function: fsnotify_parent
function: __inc_zone_state
function: __fsnotify_parent
function: inotify_dentry_parent_queue_event
function: add_to_page_cache_lru
When the otpion "indent" is not set, it looks like this:
function: fsnotify_modify <-- vfs_write
function: zone_statistics <-- get_page_from_freelist
function: __inc_zone_state <-- zone_statistics
function: inotify_inode_queue_event <-- fsnotify_modify
function: fsnotify_parent <-- fsnotify_modify
function: __inc_zone_state <-- zone_statistics
function: __fsnotify_parent <-- fsnotify_parent
function: inotify_dentry_parent_queue_event <-- fsnotify_parent
function: add_to_page_cache_lru <-- do_read_cache_page
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/20140603032224.056940410@goodmis.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
| -rw-r--r-- | tools/lib/traceevent/plugin_function.c | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/tools/lib/traceevent/plugin_function.c b/tools/lib/traceevent/plugin_function.c index 80ba4ff1fe84..a00ec190821a 100644 --- a/tools/lib/traceevent/plugin_function.c +++ b/tools/lib/traceevent/plugin_function.c | |||
| @@ -33,6 +33,29 @@ static int cpus = -1; | |||
| 33 | 33 | ||
| 34 | #define STK_BLK 10 | 34 | #define STK_BLK 10 |
| 35 | 35 | ||
| 36 | struct pevent_plugin_option plugin_options[] = | ||
| 37 | { | ||
| 38 | { | ||
| 39 | .name = "parent", | ||
| 40 | .plugin_alias = "ftrace", | ||
| 41 | .description = | ||
| 42 | "Print parent of functions for function events", | ||
| 43 | }, | ||
| 44 | { | ||
| 45 | .name = "indent", | ||
| 46 | .plugin_alias = "ftrace", | ||
| 47 | .description = | ||
| 48 | "Try to show function call indents, based on parents", | ||
| 49 | .set = 1, | ||
| 50 | }, | ||
| 51 | { | ||
| 52 | .name = NULL, | ||
| 53 | } | ||
| 54 | }; | ||
| 55 | |||
| 56 | static struct pevent_plugin_option *ftrace_parent = &plugin_options[0]; | ||
| 57 | static struct pevent_plugin_option *ftrace_indent = &plugin_options[1]; | ||
| 58 | |||
| 36 | static void add_child(struct func_stack *stack, const char *child, int pos) | 59 | static void add_child(struct func_stack *stack, const char *child, int pos) |
| 37 | { | 60 | { |
| 38 | int i; | 61 | int i; |
| @@ -119,7 +142,8 @@ static int function_handler(struct trace_seq *s, struct pevent_record *record, | |||
| 119 | 142 | ||
| 120 | parent = pevent_find_function(pevent, pfunction); | 143 | parent = pevent_find_function(pevent, pfunction); |
| 121 | 144 | ||
| 122 | index = add_and_get_index(parent, func, record->cpu); | 145 | if (parent && ftrace_indent->set) |
| 146 | index = add_and_get_index(parent, func, record->cpu); | ||
| 123 | 147 | ||
| 124 | trace_seq_printf(s, "%*s", index*3, ""); | 148 | trace_seq_printf(s, "%*s", index*3, ""); |
| 125 | 149 | ||
| @@ -128,11 +152,13 @@ static int function_handler(struct trace_seq *s, struct pevent_record *record, | |||
| 128 | else | 152 | else |
| 129 | trace_seq_printf(s, "0x%llx", function); | 153 | trace_seq_printf(s, "0x%llx", function); |
| 130 | 154 | ||
| 131 | trace_seq_printf(s, " <-- "); | 155 | if (ftrace_parent->set) { |
| 132 | if (parent) | 156 | trace_seq_printf(s, " <-- "); |
| 133 | trace_seq_printf(s, "%s", parent); | 157 | if (parent) |
| 134 | else | 158 | trace_seq_printf(s, "%s", parent); |
| 135 | trace_seq_printf(s, "0x%llx", pfunction); | 159 | else |
| 160 | trace_seq_printf(s, "0x%llx", pfunction); | ||
| 161 | } | ||
| 136 | 162 | ||
| 137 | return 0; | 163 | return 0; |
| 138 | } | 164 | } |
| @@ -141,6 +167,9 @@ int PEVENT_PLUGIN_LOADER(struct pevent *pevent) | |||
| 141 | { | 167 | { |
| 142 | pevent_register_event_handler(pevent, -1, "ftrace", "function", | 168 | pevent_register_event_handler(pevent, -1, "ftrace", "function", |
| 143 | function_handler, NULL); | 169 | function_handler, NULL); |
| 170 | |||
| 171 | traceevent_plugin_add_options("ftrace", plugin_options); | ||
| 172 | |||
| 144 | return 0; | 173 | return 0; |
| 145 | } | 174 | } |
| 146 | 175 | ||
| @@ -157,6 +186,8 @@ void PEVENT_PLUGIN_UNLOADER(struct pevent *pevent) | |||
| 157 | free(fstack[i].stack); | 186 | free(fstack[i].stack); |
| 158 | } | 187 | } |
| 159 | 188 | ||
| 189 | traceevent_plugin_remove_options(plugin_options); | ||
| 190 | |||
| 160 | free(fstack); | 191 | free(fstack); |
| 161 | fstack = NULL; | 192 | fstack = NULL; |
| 162 | cpus = -1; | 193 | cpus = -1; |
