lkml.org 
[lkml]   [2022]   [Aug]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 033/365] tracing/eprobes: Fix reading of string fields
    Date
    From: Steven Rostedt (Google) <rostedt@goodmis.org>

    commit f04dec93466a0481763f3b56cdadf8076e28bfbf upstream.

    Currently when an event probe (eprobe) hooks to a string field, it does
    not display it as a string, but instead as a number. This makes the field
    rather useless. Handle the different kinds of strings, dynamic, static,
    relational/dynamic etc.

    Now when a string field is used, the ":string" type can be used to display
    it:

    echo "e:sw sched/sched_switch comm=$next_comm:string" > dynamic_events

    Link: https://lkml.kernel.org/r/20220820134400.959640191@goodmis.org

    Cc: stable@vger.kernel.org
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Tzvetomir Stoyanov <tz.stoyanov@gmail.com>
    Cc: Tom Zanussi <zanussi@kernel.org>
    Fixes: 7491e2c44278 ("tracing: Add a probe that attaches to trace events")
    Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    kernel/trace/trace_eprobe.c | 21 +++++++++++++++++++++
    1 file changed, 21 insertions(+)

    --- a/kernel/trace/trace_eprobe.c
    +++ b/kernel/trace/trace_eprobe.c
    @@ -310,6 +310,27 @@ static unsigned long get_event_field(str

    addr = rec + field->offset;

    + if (is_string_field(field)) {
    + switch (field->filter_type) {
    + case FILTER_DYN_STRING:
    + val = (unsigned long)(rec + (*(unsigned int *)addr & 0xffff));
    + break;
    + case FILTER_RDYN_STRING:
    + val = (unsigned long)(addr + (*(unsigned int *)addr & 0xffff));
    + break;
    + case FILTER_STATIC_STRING:
    + val = (unsigned long)addr;
    + break;
    + case FILTER_PTR_STRING:
    + val = (unsigned long)(*(char *)addr);
    + break;
    + default:
    + WARN_ON_ONCE(1);
    + return 0;
    + }
    + return val;
    + }
    +
    switch (field->size) {
    case 1:
    if (field->is_signed)

    \
     
     \ /
      Last update: 2022-08-23 10:14    [W:4.010 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site