Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools lib traceevent: Move kernel_stack event handler to "function" plugin.

The "kernel_stack" event handler does not depend on any trace-cmd
context, it can be used aside from the application. The code is moved to
libtraceevent "function" plugin.

Link: http://lore.kernel.org/linux-trace-devel/20190726124308.18735-2-tz.stoyanov@gmail.com
Link: http://lore.kernel.org/linux-trace-devel/20200702174950.123454-4-tz.stoyanov@gmail.com

Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: linux-trace-devel@vger.kernel.org
Link: http://lore.kernel.org/lkml/20200702185705.284789930@goodmis.org
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Tzvetomir Stoyanov (VMware) and committed by
Arnaldo Carvalho de Melo
0dfceeff 5973e6eb

+41
+41
tools/lib/traceevent/plugins/plugin_function.c
··· 184 184 return 0; 185 185 } 186 186 187 + static int 188 + trace_stack_handler(struct trace_seq *s, struct tep_record *record, 189 + struct tep_event *event, void *context) 190 + { 191 + struct tep_format_field *field; 192 + unsigned long long addr; 193 + const char *func; 194 + int long_size; 195 + void *data = record->data; 196 + 197 + field = tep_find_any_field(event, "caller"); 198 + if (!field) { 199 + trace_seq_printf(s, "<CANT FIND FIELD %s>", "caller"); 200 + return 0; 201 + } 202 + 203 + trace_seq_puts(s, "<stack trace >\n"); 204 + 205 + long_size = tep_get_long_size(event->tep); 206 + 207 + for (data += field->offset; data < record->data + record->size; 208 + data += long_size) { 209 + addr = tep_read_number(event->tep, data, long_size); 210 + 211 + if ((long_size == 8 && addr == (unsigned long long)-1) || 212 + ((int)addr == -1)) 213 + break; 214 + 215 + func = tep_find_function(event->tep, addr); 216 + if (func) 217 + trace_seq_printf(s, "=> %s (%llx)\n", func, addr); 218 + else 219 + trace_seq_printf(s, "=> %llx\n", addr); 220 + } 221 + 222 + return 0; 223 + } 224 + 187 225 int TEP_PLUGIN_LOADER(struct tep_handle *tep) 188 226 { 189 227 tep_register_event_handler(tep, -1, "ftrace", "function", 190 228 function_handler, NULL); 229 + 230 + tep_register_event_handler(tep, -1, "ftrace", "kernel_stack", 231 + trace_stack_handler, NULL); 191 232 192 233 tep_plugin_add_options("ftrace", plugin_options); 193 234