Merge v5.14-rc3 into usb-next
[linux-2.6-microblaze.git] / kernel / trace / trace_events_hist.c
index ba03b7d..34325f4 100644 (file)
@@ -1111,7 +1111,7 @@ static const char *hist_field_name(struct hist_field *field,
                 field->flags & HIST_FIELD_FL_ALIAS)
                field_name = hist_field_name(field->operands[0], ++level);
        else if (field->flags & HIST_FIELD_FL_CPU)
-               field_name = "cpu";
+               field_name = "common_cpu";
        else if (field->flags & HIST_FIELD_FL_EXPR ||
                 field->flags & HIST_FIELD_FL_VAR_REF) {
                if (field->system) {
@@ -1555,6 +1555,13 @@ static int contains_operator(char *str)
 
        switch (*op) {
        case '-':
+               /*
+                * Unfortunately, the modifier ".sym-offset"
+                * can confuse things.
+                */
+               if (op - str >= 4 && !strncmp(op - 4, ".sym-offset", 11))
+                       return FIELD_OP_NONE;
+
                if (*str == '-')
                        field_op = FIELD_OP_UNARY_MINUS;
                else
@@ -1682,7 +1689,9 @@ static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data,
        if (WARN_ON_ONCE(!field))
                goto out;
 
-       if (is_string_field(field)) {
+       /* Pointers to strings are just pointers and dangerous to dereference */
+       if (is_string_field(field) &&
+           (field->filter_type != FILTER_PTR_STRING)) {
                flags |= HIST_FIELD_FL_STRING;
 
                hist_field->size = MAX_FILTER_STR_VAL;
@@ -1982,14 +1991,24 @@ parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file,
                hist_data->enable_timestamps = true;
                if (*flags & HIST_FIELD_FL_TIMESTAMP_USECS)
                        hist_data->attrs->ts_in_usecs = true;
-       } else if (strcmp(field_name, "cpu") == 0)
+       } else if (strcmp(field_name, "common_cpu") == 0)
                *flags |= HIST_FIELD_FL_CPU;
        else {
                field = trace_find_event_field(file->event_call, field_name);
                if (!field || !field->size) {
-                       hist_err(tr, HIST_ERR_FIELD_NOT_FOUND, errpos(field_name));
-                       field = ERR_PTR(-EINVAL);
-                       goto out;
+                       /*
+                        * For backward compatibility, if field_name
+                        * was "cpu", then we treat this the same as
+                        * common_cpu.
+                        */
+                       if (strcmp(field_name, "cpu") == 0) {
+                               *flags |= HIST_FIELD_FL_CPU;
+                       } else {
+                               hist_err(tr, HIST_ERR_FIELD_NOT_FOUND,
+                                        errpos(field_name));
+                               field = ERR_PTR(-EINVAL);
+                               goto out;
+                       }
                }
        }
  out:
@@ -4488,8 +4507,6 @@ static inline void add_to_key(char *compound_key, void *key,
                field = key_field->field;
                if (field->filter_type == FILTER_DYN_STRING)
                        size = *(u32 *)(rec + field->offset) >> 16;
-               else if (field->filter_type == FILTER_PTR_STRING)
-                       size = strlen(key);
                else if (field->filter_type == FILTER_STATIC_STRING)
                        size = field->size;
 
@@ -5078,7 +5095,7 @@ static void hist_field_print(struct seq_file *m, struct hist_field *hist_field)
                seq_printf(m, "%s=", hist_field->var.name);
 
        if (hist_field->flags & HIST_FIELD_FL_CPU)
-               seq_puts(m, "cpu");
+               seq_puts(m, "common_cpu");
        else if (field_name) {
                if (hist_field->flags & HIST_FIELD_FL_VAR_REF ||
                    hist_field->flags & HIST_FIELD_FL_ALIAS)