[PATCH v8 14/23] tracing: Add hist trigger 'hex' modifier for displaying numeric fields

From: Tom Zanussi
Date: Mon Jun 29 2015 - 16:39:10 EST


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 <tom.zanussi@xxxxxxxxxxxxxxx>
---
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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/