lkml.org 
[lkml]   [2020]   [Jul]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 12/23 v3] tools lib traceevent: Move kernel_stack event handler to "function" plugin.
    From: "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com>

    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>
    Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
    ---
    .../lib/traceevent/plugins/plugin_function.c | 41 +++++++++++++++++++
    1 file changed, 41 insertions(+)

    diff --git a/tools/lib/traceevent/plugins/plugin_function.c b/tools/lib/traceevent/plugins/plugin_function.c
    index cafddd6be983..c7d321968f39 100644
    --- a/tools/lib/traceevent/plugins/plugin_function.c
    +++ b/tools/lib/traceevent/plugins/plugin_function.c
    @@ -184,11 +184,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);
    +
    tep_plugin_add_options("ftrace", plugin_options);

    return 0;
    --
    2.26.2

    \
     
     \ /
      Last update: 2020-07-22 03:41    [W:2.945 / U:0.252 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site