aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2014-06-02 23:20:15 -0400
committerJiri Olsa <jolsa@kernel.org>2014-06-07 17:33:37 -0400
commit49440828ad7b809e9d31f6108875e3b1e974690c (patch)
tree73a9c6e1d464a99db3d444bcc400e5e8acba9889 /tools
parent5827f2faabe40cc285cc67b697277547a19b6c9a (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>
Diffstat (limited to 'tools')
-rw-r--r--tools/lib/traceevent/plugin_function.c43
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
36struct 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
56static struct pevent_plugin_option *ftrace_parent = &plugin_options[0];
57static struct pevent_plugin_option *ftrace_indent = &plugin_options[1];
58
36static void add_child(struct func_stack *stack, const char *child, int pos) 59static 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;