| From: Tom Zanussi <tom.zanussi@linux.intel.com> |
| Date: Tue, 5 Sep 2017 16:57:16 -0500 |
| Subject: [PATCH 04/40] tracing: Add hist_field_name() accessor |
| |
| In preparation for hist_fields that won't be strictly based on |
| trace_event_fields, add a new hist_field_name() accessor to allow that |
| flexibility and update associated users. |
| |
| Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| --- |
| kernel/trace/trace_events_hist.c | 67 ++++++++++++++++++++++++++------------- |
| 1 file changed, 45 insertions(+), 22 deletions(-) |
| |
| --- a/kernel/trace/trace_events_hist.c |
| +++ b/kernel/trace/trace_events_hist.c |
| @@ -146,6 +146,23 @@ struct hist_trigger_data { |
| struct tracing_map *map; |
| }; |
| |
| +static const char *hist_field_name(struct hist_field *field, |
| + unsigned int level) |
| +{ |
| + const char *field_name = ""; |
| + |
| + if (level > 1) |
| + return field_name; |
| + |
| + if (field->field) |
| + field_name = field->field->name; |
| + |
| + if (field_name == NULL) |
| + field_name = ""; |
| + |
| + return field_name; |
| +} |
| + |
| static hist_field_fn_t select_value_fn(int field_size, int field_is_signed) |
| { |
| hist_field_fn_t fn = NULL; |
| @@ -642,7 +659,6 @@ static int is_descending(const char *str |
| static int create_sort_keys(struct hist_trigger_data *hist_data) |
| { |
| char *fields_str = hist_data->attrs->sort_key_str; |
| - struct ftrace_event_field *field = NULL; |
| struct tracing_map_sort_key *sort_key; |
| int descending, ret = 0; |
| unsigned int i, j; |
| @@ -659,7 +675,9 @@ static int create_sort_keys(struct hist_ |
| } |
| |
| for (i = 0; i < TRACING_MAP_SORT_KEYS_MAX; i++) { |
| + struct hist_field *hist_field; |
| char *field_str, *field_name; |
| + const char *test_name; |
| |
| sort_key = &hist_data->sort_keys[i]; |
| |
| @@ -692,8 +710,10 @@ static int create_sort_keys(struct hist_ |
| } |
| |
| for (j = 1; j < hist_data->n_fields; j++) { |
| - field = hist_data->fields[j]->field; |
| - if (field && (strcmp(field_name, field->name) == 0)) { |
| + hist_field = hist_data->fields[j]; |
| + test_name = hist_field_name(hist_field, 0); |
| + |
| + if (strcmp(field_name, test_name) == 0) { |
| sort_key->field_idx = j; |
| descending = is_descending(field_str); |
| if (descending < 0) { |
| @@ -941,6 +961,7 @@ hist_trigger_entry_print(struct seq_file |
| struct hist_field *key_field; |
| char str[KSYM_SYMBOL_LEN]; |
| bool multiline = false; |
| + const char *field_name; |
| unsigned int i; |
| u64 uval; |
| |
| @@ -952,26 +973,27 @@ hist_trigger_entry_print(struct seq_file |
| if (i > hist_data->n_vals) |
| seq_puts(m, ", "); |
| |
| + field_name = hist_field_name(key_field, 0); |
| + |
| if (key_field->flags & HIST_FIELD_FL_HEX) { |
| uval = *(u64 *)(key + key_field->offset); |
| - seq_printf(m, "%s: %llx", |
| - key_field->field->name, uval); |
| + seq_printf(m, "%s: %llx", field_name, uval); |
| } else if (key_field->flags & HIST_FIELD_FL_SYM) { |
| uval = *(u64 *)(key + key_field->offset); |
| sprint_symbol_no_offset(str, uval); |
| - seq_printf(m, "%s: [%llx] %-45s", |
| - key_field->field->name, uval, str); |
| + seq_printf(m, "%s: [%llx] %-45s", field_name, |
| + uval, str); |
| } else if (key_field->flags & HIST_FIELD_FL_SYM_OFFSET) { |
| uval = *(u64 *)(key + key_field->offset); |
| sprint_symbol(str, uval); |
| - seq_printf(m, "%s: [%llx] %-55s", |
| - key_field->field->name, uval, str); |
| + seq_printf(m, "%s: [%llx] %-55s", field_name, |
| + uval, str); |
| } else if (key_field->flags & HIST_FIELD_FL_EXECNAME) { |
| char *comm = elt->private_data; |
| |
| uval = *(u64 *)(key + key_field->offset); |
| - seq_printf(m, "%s: %-16s[%10llu]", |
| - key_field->field->name, comm, uval); |
| + seq_printf(m, "%s: %-16s[%10llu]", field_name, |
| + comm, uval); |
| } else if (key_field->flags & HIST_FIELD_FL_SYSCALL) { |
| const char *syscall_name; |
| |
| @@ -980,8 +1002,8 @@ hist_trigger_entry_print(struct seq_file |
| if (!syscall_name) |
| syscall_name = "unknown_syscall"; |
| |
| - seq_printf(m, "%s: %-30s[%3llu]", |
| - key_field->field->name, syscall_name, uval); |
| + seq_printf(m, "%s: %-30s[%3llu]", field_name, |
| + syscall_name, uval); |
| } else if (key_field->flags & HIST_FIELD_FL_STACKTRACE) { |
| seq_puts(m, "stacktrace:\n"); |
| hist_trigger_stacktrace_print(m, |
| @@ -989,15 +1011,14 @@ hist_trigger_entry_print(struct seq_file |
| HIST_STACKTRACE_DEPTH); |
| multiline = true; |
| } else if (key_field->flags & HIST_FIELD_FL_LOG2) { |
| - seq_printf(m, "%s: ~ 2^%-2llu", key_field->field->name, |
| + seq_printf(m, "%s: ~ 2^%-2llu", field_name, |
| *(u64 *)(key + key_field->offset)); |
| } else if (key_field->flags & HIST_FIELD_FL_STRING) { |
| - seq_printf(m, "%s: %-50s", key_field->field->name, |
| + seq_printf(m, "%s: %-50s", field_name, |
| (char *)(key + key_field->offset)); |
| } else { |
| uval = *(u64 *)(key + key_field->offset); |
| - seq_printf(m, "%s: %10llu", key_field->field->name, |
| - uval); |
| + seq_printf(m, "%s: %10llu", field_name, uval); |
| } |
| } |
| |
| @@ -1010,13 +1031,13 @@ hist_trigger_entry_print(struct seq_file |
| tracing_map_read_sum(elt, HITCOUNT_IDX)); |
| |
| for (i = 1; i < hist_data->n_vals; i++) { |
| + field_name = hist_field_name(hist_data->fields[i], 0); |
| + |
| if (hist_data->fields[i]->flags & HIST_FIELD_FL_HEX) { |
| - seq_printf(m, " %s: %10llx", |
| - hist_data->fields[i]->field->name, |
| + seq_printf(m, " %s: %10llx", field_name, |
| tracing_map_read_sum(elt, i)); |
| } else { |
| - seq_printf(m, " %s: %10llu", |
| - hist_data->fields[i]->field->name, |
| + seq_printf(m, " %s: %10llu", field_name, |
| tracing_map_read_sum(elt, i)); |
| } |
| } |
| @@ -1131,7 +1152,9 @@ static const char *get_hist_field_flags( |
| |
| static void hist_field_print(struct seq_file *m, struct hist_field *hist_field) |
| { |
| - seq_printf(m, "%s", hist_field->field->name); |
| + const char *field_name = hist_field_name(hist_field, 0); |
| + |
| + seq_printf(m, "%s", field_name); |
| if (hist_field->flags) { |
| const char *flags_str = get_hist_field_flags(hist_field); |
| |