Merge tag 'trace-v5.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 25 May 2019 17:08:14 +0000 (10:08 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 25 May 2019 17:08:14 +0000 (10:08 -0700)
Pull tracing fixes from Steven Rostedt:
 "Tom Zanussi sent me some small fixes and cleanups to the histogram
  code and I forgot to incorporate them.

  I also added a small clean up patch that was sent to me a while ago
  and I just noticed it"

* tag 'trace-v5.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
  kernel/trace/trace.h: Remove duplicate header of trace_seq.h
  tracing: Add a check_val() check before updating cond_snapshot() track_val
  tracing: Check keys for variable references in expressions too
  tracing: Prevent hist_field_var_ref() from accessing NULL tracing_map_elts

kernel/trace/trace.h
kernel/trace/trace_events_hist.c

index 1974ce818ddb921ce7a4723f3a97b7cbdf684937..82c70b63d37510261c011b1ce3f683719f8f22c3 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/trace_seq.h>
 #include <linux/trace_events.h>
 #include <linux/compiler.h>
-#include <linux/trace_seq.h>
 #include <linux/glob.h>
 
 #ifdef CONFIG_FTRACE_SYSCALLS
index 7fca3457c7059dd15b71d84f801d01b12fcdff35..ca6b0dff60c5be2af6315f5b135ac754983e92c6 100644 (file)
@@ -59,7 +59,7 @@
        C(NO_CLOSING_PAREN,     "No closing paren found"),              \
        C(SUBSYS_NOT_FOUND,     "Missing subsystem"),                   \
        C(INVALID_SUBSYS_EVENT, "Invalid subsystem or event name"),     \
-       C(INVALID_REF_KEY,      "Using variable references as keys not supported"), \
+       C(INVALID_REF_KEY,      "Using variable references in keys not supported"), \
        C(VAR_NOT_FOUND,        "Couldn't find variable"),              \
        C(FIELD_NOT_FOUND,      "Couldn't find field"),
 
@@ -1854,6 +1854,9 @@ static u64 hist_field_var_ref(struct hist_field *hist_field,
        struct hist_elt_data *elt_data;
        u64 var_val = 0;
 
+       if (WARN_ON_ONCE(!elt))
+               return var_val;
+
        elt_data = elt->private_data;
        var_val = elt_data->var_ref_vals[hist_field->var_ref_idx];
 
@@ -3582,14 +3585,20 @@ static bool cond_snapshot_update(struct trace_array *tr, void *cond_data)
        struct track_data *track_data = tr->cond_snapshot->cond_data;
        struct hist_elt_data *elt_data, *track_elt_data;
        struct snapshot_context *context = cond_data;
+       struct action_data *action;
        u64 track_val;
 
        if (!track_data)
                return false;
 
+       action = track_data->action_data;
+
        track_val = get_track_val(track_data->hist_data, context->elt,
                                  track_data->action_data);
 
+       if (!action->track_data.check_val(track_data->track_val, track_val))
+               return false;
+
        track_data->track_val = track_val;
        memcpy(track_data->key, context->key, track_data->key_len);
 
@@ -4503,7 +4512,7 @@ static int create_key_field(struct hist_trigger_data *hist_data,
                        goto out;
                }
 
-               if (hist_field->flags & HIST_FIELD_FL_VAR_REF) {
+               if (field_has_hist_vars(hist_field, 0)) {
                        hist_err(tr, HIST_ERR_INVALID_REF_KEY, errpos(field_str));
                        destroy_hist_field(hist_field, 0);
                        ret = -EINVAL;