Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754948AbbGUOK6 (ORCPT ); Tue, 21 Jul 2015 10:10:58 -0400 Received: from mga01.intel.com ([192.55.52.88]:43201 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754613AbbGUOK5 (ORCPT ); Tue, 21 Jul 2015 10:10:57 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,516,1432623600"; d="scan'208";a="766688400" Message-ID: <1437487834.22524.2.camel@tzanussi-mobl.amr.corp.intel.com> Subject: Re: [PATCH v9 14/22] tracing: Add hist trigger 'hex' modifier for displaying numeric fields From: Tom Zanussi To: Namhyung Kim 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 Date: Tue, 21 Jul 2015 09:10:34 -0500 In-Reply-To: <20150719132233.GD25163@danjae.kornet> References: <20150719132233.GD25163@danjae.kornet> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4 (3.10.4-4.fc20) Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5194 Lines: 154 Hi Namhyung, On Sun, 2015-07-19 at 22:22 +0900, Namhyung Kim wrote: > 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.. > Yeah, the .hex modifier seems to have gotten dropped for values in the patch splitup. Will fix, thanks for pointing it out. Tom > 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/