The syntax for fully-qualified variable references in histograms is
subsys.event.$var, which is parsed correctly, but not displayed
correctly when printing a histogram spec. The current code puts the $
reference at the beginning of the fully-qualified variable name
i.e. $subsys.event.var, which is incorrect.

Before:

trigger info: 
hist:keys=next_comm:vals=hitcount:wakeup_lat=common_timestamp.usecs-$sched.sched_wakeup.ts0:
 ...

After:

trigger info: 
hist:keys=next_comm:vals=hitcount:wakeup_lat=common_timestamp.usecs-sched.sched_wakeup.$ts0:
 ...

Signed-off-by: Tom Zanussi <[email protected]>
---
 kernel/trace/trace_events_hist.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index b2b675c7d663..0dbbf6cca9bc 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -1361,9 +1361,12 @@ static const char *hist_field_name(struct hist_field 
*field,
                 field->flags & HIST_FIELD_FL_VAR_REF) {
                if (field->system) {
                        static char full_name[MAX_FILTER_STR_VAL];
+                       static char *fmt;
                        int len;
 
-                       len = snprintf(full_name, sizeof(full_name), "%s.%s.%s",
+                       fmt = field->flags & HIST_FIELD_FL_VAR_REF ? 
"%s.%s.$%s" : "%s.%s.%s";
+
+                       len = snprintf(full_name, sizeof(full_name), fmt,
                                       field->system, field->event_name,
                                       field->name);
                        if (len >= sizeof(full_name))
@@ -1742,9 +1745,10 @@ static const char *get_hist_field_flags(struct 
hist_field *hist_field)
 
 static void expr_field_str(struct hist_field *field, char *expr)
 {
-       if (field->flags & HIST_FIELD_FL_VAR_REF)
-               strcat(expr, "$");
-       else if (field->flags & HIST_FIELD_FL_CONST) {
+       if (field->flags & HIST_FIELD_FL_VAR_REF) {
+               if (!field->system)
+                       strcat(expr, "$");
+       } else if (field->flags & HIST_FIELD_FL_CONST) {
                char str[HIST_CONST_DIGITS_MAX];
 
                snprintf(str, HIST_CONST_DIGITS_MAX, "%llu", field->constant);
@@ -6156,7 +6160,8 @@ static void hist_field_print(struct seq_file *m, struct 
hist_field *hist_field)
        else if (field_name) {
                if (hist_field->flags & HIST_FIELD_FL_VAR_REF ||
                    hist_field->flags & HIST_FIELD_FL_ALIAS)
-                       seq_putc(m, '$');
+                       if (!hist_field->system)
+                               seq_putc(m, '$');
                seq_printf(m, "%s", field_name);
        } else if (hist_field->flags & HIST_FIELD_FL_TIMESTAMP)
                seq_puts(m, "common_timestamp");
-- 
2.43.0


Reply via email to