@@ -31,17 +31,6 @@ struct tep_plugin_option trace_ftrace_options[] = {
static struct tep_plugin_option *fgraph_tail = &trace_ftrace_options[0];
static struct tep_plugin_option *fgraph_depth = &trace_ftrace_options[1];
-static void find_long_size(struct tracecmd_ftrace *finfo)
-{
- finfo->long_size = tracecmd_long_size(finfo->handle);
-}
-
-#define long_size_check(handle) \
- do { \
- if (!finfo->long_size) \
- find_long_size(finfo); \
- } while (0)
-
static int find_ret_event(struct tracecmd_ftrace *finfo, struct tep_handle *pevent)
{
struct tep_event *event;
@@ -361,44 +350,6 @@ fgraph_ret_handler(struct trace_seq *s, struct tep_record *record,
return 0;
}
-static int
-trace_stack_handler(struct trace_seq *s, struct tep_record *record,
- struct tep_event *event, void *context)
-{
- struct tracecmd_ftrace *finfo = context;
- struct tep_format_field *field;
- unsigned long long addr;
- const char *func;
- void *data = record->data;
-
- field = tep_find_any_field(event, "caller");
- if (!field) {
- trace_seq_printf(s, "<CANT FIND FIELD %s>", "caller");
- return 0;
- }
-
- trace_seq_puts(s, "<stack trace>\n");
-
- long_size_check(finfo);
-
- for (data += field->offset; data < record->data + record->size;
- data += finfo->long_size) {
- addr = tep_read_number(event->tep, data, finfo->long_size);
-
- if ((finfo->long_size == 8 && addr == (unsigned long long)-1) ||
- ((int)addr == -1))
- break;
-
- func = tep_find_function(event->tep, addr);
- if (func)
- trace_seq_printf(s, "=> %s (%llx)\n", func, addr);
- else
- trace_seq_printf(s, "=> %llx\n", addr);
- }
-
- return 0;
-}
-
/**
* tracecmd_ftrace_load_options - load the ftrace options
*
@@ -430,9 +381,6 @@ int tracecmd_ftrace_overrides(struct tracecmd_input *handle,
tep_register_event_handler(pevent, -1, "ftrace", "funcgraph_exit",
fgraph_ret_handler, finfo);
- tep_register_event_handler(pevent, -1, "ftrace", "kernel_stack",
- trace_stack_handler, finfo);
-
trace_util_add_options("ftrace", trace_ftrace_options);
/* Store the func ret id and event for later use */
@@ -169,11 +169,52 @@ static int function_handler(struct trace_seq *s, struct tep_record *record,
return 0;
}
+static int
+trace_stack_handler(struct trace_seq *s, struct tep_record *record,
+ struct tep_event *event, void *context)
+{
+ struct tep_format_field *field;
+ unsigned long long addr;
+ const char *func;
+ int long_size;
+ void *data = record->data;
+
+ field = tep_find_any_field(event, "caller");
+ if (!field) {
+ trace_seq_printf(s, "<CANT FIND FIELD %s>", "caller");
+ return 0;
+ }
+
+ trace_seq_puts(s, "<stack trace >\n");
+
+ long_size = tep_get_long_size(event->tep);
+
+ for (data += field->offset; data < record->data + record->size;
+ data += long_size) {
+ addr = tep_read_number(event->tep, data, long_size);
+
+ if ((long_size == 8 && addr == (unsigned long long)-1) ||
+ ((int)addr == -1))
+ break;
+
+ func = tep_find_function(event->tep, addr);
+ if (func)
+ trace_seq_printf(s, "=> %s (%llx)\n", func, addr);
+ else
+ trace_seq_printf(s, "=> %llx\n", addr);
+ }
+
+ return 0;
+}
+
int TEP_PLUGIN_LOADER(struct tep_handle *tep)
{
tep_register_event_handler(tep, -1, "ftrace", "function",
function_handler, NULL);
+ tep_register_event_handler(tep, -1, "ftrace", "kernel_stack",
+ trace_stack_handler, NULL);
+
trace_util_add_options("ftrace", plugin_options);
return 0;
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. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- lib/trace-cmd/trace-ftrace.c | 52 ------------------------------------ plugins/plugin_function.c | 41 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 52 deletions(-)