lkml.org 
[lkml]   [2015]   [Sep]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v10 18/26] tracing: Add hist trigger 'syscall' modifier
    Date
    Allow users to have syscall id fields displayed as syscall names in
    the output by appending '.syscall' to field names:

    # echo hist:keys=aaa.syscall ... \
    [ if filter] > event/trigger

    Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
    ---
    kernel/trace/trace.c | 3 ++-
    kernel/trace/trace_events_hist.c | 15 +++++++++++++++
    2 files changed, 17 insertions(+), 1 deletion(-)

    diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
    index ac5454e..278d09c 100644
    --- a/kernel/trace/trace.c
    +++ b/kernel/trace/trace.c
    @@ -3812,7 +3812,8 @@ static const char readme_msg[] =
    "\t .hex display a number as a hex value\n"
    "\t .sym display an address as a symbol\n"
    "\t .sym-offset display an address as a symbol and offset\n"
    - "\t .execname display a common_pid as a program name\n\n"
    + "\t .execname display a common_pid as a program name\n"
    + "\t .syscall display a syscall id as a syscall name\n\n"
    "\t The 'pause' parameter can be used to pause an existing hist\n"
    "\t trigger or to start a hist trigger but not log any events\n"
    "\t until told to do so. 'continue' can be used to start or\n"
    diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
    index 656973a..b514719 100644
    --- a/kernel/trace/trace_events_hist.c
    +++ b/kernel/trace/trace_events_hist.c
    @@ -76,6 +76,7 @@ enum hist_field_flags {
    HIST_FIELD_SYM = 16,
    HIST_FIELD_SYM_OFFSET = 32,
    HIST_FIELD_EXECNAME = 64,
    + HIST_FIELD_SYSCALL = 128,
    };

    struct hist_trigger_attrs {
    @@ -452,6 +453,8 @@ static int create_key_field(struct hist_trigger_data *hist_data,
    else if (!strcmp(field_str, "execname") &&
    !strcmp(field_name, "common_pid"))
    flags |= HIST_FIELD_EXECNAME;
    + else if (!strcmp(field_str, "syscall"))
    + flags |= HIST_FIELD_SYSCALL;
    else {
    ret = -EINVAL;
    goto out;
    @@ -814,6 +817,16 @@ hist_trigger_entry_print(struct seq_file *m,
    uval = *(u64 *)(key + key_field->offset);
    seq_printf(m, "%s: %-16s[%10llu]",
    key_field->field->name, comm, uval);
    + } else if (key_field->flags & HIST_FIELD_SYSCALL) {
    + const char *syscall_name;
    +
    + uval = *(u64 *)(key + key_field->offset);
    + syscall_name = get_syscall_name(uval);
    + if (!syscall_name)
    + syscall_name = "unknown_syscall";
    +
    + seq_printf(m, "%s: %-30s[%3llu]",
    + key_field->field->name, syscall_name, uval);
    } else if (key_field->flags & HIST_FIELD_STRING) {
    seq_printf(m, "%s: %-50s", key_field->field->name,
    (char *)(key + key_field->offset));
    @@ -935,6 +948,8 @@ static const char *get_hist_field_flags(struct hist_field *hist_field)
    flags_str = "sym-offset";
    else if (hist_field->flags & HIST_FIELD_EXECNAME)
    flags_str = "execname";
    + else if (hist_field->flags & HIST_FIELD_SYSCALL)
    + flags_str = "syscall";

    return flags_str;
    }
    --
    1.9.3


    \
     
     \ /
      Last update: 2015-09-30 21:21    [W:4.597 / U:0.592 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site