Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753229AbbGSNYy (ORCPT ); Sun, 19 Jul 2015 09:24:54 -0400 Received: from mail-pd0-f170.google.com ([209.85.192.170]:33335 "EHLO mail-pd0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752766AbbGSNYx (ORCPT ); Sun, 19 Jul 2015 09:24:53 -0400 Date: Sun, 19 Jul 2015 22:22:33 +0900 From: Namhyung Kim To: Tom Zanussi Cc: rostedt@goodmis.org, daniel.wagner@bmw-carit.de, masami.hiramatsu.pt@hitachi.com, josh@joshtriplett.org, andi@firstfloor.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v9 14/22] tracing: Add hist trigger 'hex' modifier for displaying numeric fields Message-ID: <20150719132233.GD25163@danjae.kornet> References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23+89 (0255b37be491) (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4715 Lines: 143 Hi Tom, On Thu, Jul 16, 2015 at 12:22:47PM -0500, Tom Zanussi wrote: > Allow users to have numeric fields displayed as hex values in the > output by appending '.hex' to field names: > > # echo hist:keys=aaa,bbb.hex:vals=ccc.hex ... \ > [ if filter] > event/trigger > > Signed-off-by: Tom Zanussi > --- > kernel/trace/trace.c | 5 +++- > kernel/trace/trace_events_hist.c | 49 +++++++++++++++++++++++++++++++++++++--- > 2 files changed, 50 insertions(+), 4 deletions(-) > > diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c > index 27daa28..14f9472 100644 > --- a/kernel/trace/trace.c > +++ b/kernel/trace/trace.c > @@ -3810,7 +3810,10 @@ static const char readme_msg[] = > "\t entry is a simple list of the keys and values comprising the\n" > "\t entry; keys are printed first and are delineated by curly\n" > "\t braces, and are followed by the set of value fields for the\n" > - "\t entry. Numeric fields are displayed as base-10 integers.\n" > + "\t entry. By default, numeric fields are displayed as base-10\n" > + "\t integers. This can be modified by appending any of the\n" > + "\t following modifiers to the field name:\n\n" > + "\t .hex display a number as a hex value\n\n" > "\t By default, the size of the hash table is 2048 entries. The\n" > "\t 'size' param can be used to specify more or fewer than that.\n" > "\t The units are in terms of hashtable entries - if a run uses\n" > diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c > index d8259fe..9cc38ee 100644 > --- a/kernel/trace/trace_events_hist.c > +++ b/kernel/trace/trace_events_hist.c > @@ -72,6 +72,7 @@ enum hist_field_flags { > HIST_FIELD_HITCOUNT = 1, > HIST_FIELD_KEY = 2, > HIST_FIELD_STRING = 4, > + HIST_FIELD_HEX = 8, > }; > > struct hist_trigger_attrs { > @@ -284,9 +285,20 @@ static int create_val_field(struct hist_trigger_data *hist_data, > { > struct ftrace_event_field *field = NULL; > unsigned long flags = 0; > + char *field_name; > int ret = 0; > > - field = trace_find_event_field(file->event_call, field_str); > + field_name = strsep(&field_str, "."); > + if (field_str) { > + if (!strcmp(field_str, "hex")) > + flags |= HIST_FIELD_HEX; > + else { > + ret = -EINVAL; > + goto out; > + } > + } > + > + field = trace_find_event_field(file->event_call, field_name); > if (!field) { > ret = -EINVAL; > goto out; > @@ -349,11 +361,22 @@ static int create_key_field(struct hist_trigger_data *hist_data, > struct ftrace_event_field *field = NULL; > unsigned long flags = 0; > unsigned int key_size; > + char *field_name; > int ret = 0; > > flags |= HIST_FIELD_KEY; > > - field = trace_find_event_field(file->event_call, field_str); > + field_name = strsep(&field_str, "."); > + if (field_str) { > + if (!strcmp(field_str, "hex")) > + flags |= HIST_FIELD_HEX; > + else { > + ret = -EINVAL; > + goto out; > + } > + } > + > + field = trace_find_event_field(file->event_call, field_name); > if (!field) { > ret = -EINVAL; > goto out; > @@ -688,7 +711,11 @@ hist_trigger_entry_print(struct seq_file *m, > if (i > hist_data->n_vals) > seq_puts(m, ", "); > > - if (key_field->flags & HIST_FIELD_STRING) { > + if (key_field->flags & HIST_FIELD_HEX) { > + uval = *(u64 *)(key + key_field->offset); > + seq_printf(m, "%s: %llx", > + key_field->field->name, uval); > + } else if (key_field->flags & HIST_FIELD_STRING) { > seq_printf(m, "%s: %-35s", key_field->field->name, > (char *)(key + key_field->offset)); > } else { It seems the '.hex' modifier only affects key fields' output.. Thanks, Namhyung > @@ -791,9 +818,25 @@ const struct file_operations event_hist_fops = { > .release = single_release, > }; > > +static const char *get_hist_field_flags(struct hist_field *hist_field) > +{ > + const char *flags_str = NULL; > + > + if (hist_field->flags & HIST_FIELD_HEX) > + flags_str = "hex"; > + > + return flags_str; > +} > + > static void hist_field_print(struct seq_file *m, struct hist_field *hist_field) > { > seq_printf(m, "%s", hist_field->field->name); > + if (hist_field->flags) { > + const char *flags_str = get_hist_field_flags(hist_field); > + > + if (flags_str) > + seq_printf(m, ".%s", flags_str); > + } > } > > static int event_hist_trigger_print(struct seq_file *m, > -- > 1.9.3 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/