Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932329AbbGPRXx (ORCPT ); Thu, 16 Jul 2015 13:23:53 -0400 Received: from mga03.intel.com ([134.134.136.65]:6111 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932178AbbGPRXu (ORCPT ); Thu, 16 Jul 2015 13:23:50 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,488,1432623600"; d="scan'208";a="525475392" From: Tom Zanussi To: rostedt@goodmis.org Cc: daniel.wagner@bmw-carit.de, masami.hiramatsu.pt@hitachi.com, namhyung@kernel.org, josh@joshtriplett.org, andi@firstfloor.org, linux-kernel@vger.kernel.org, Tom Zanussi Subject: [PATCH v9 14/22] tracing: Add hist trigger 'hex' modifier for displaying numeric fields Date: Thu, 16 Jul 2015 12:22:47 -0500 Message-Id: X-Mailer: git-send-email 1.9.3 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4305 Lines: 133 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 { @@ -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/