diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-25 13:08:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-25 13:08:14 -0400 |
commit | a2c48d98fc0770f7993cf61c71659a99e1d2857e (patch) | |
tree | 2179ea82b5b16b74e3b4d5a18cf9e29d627033af /kernel | |
parent | 2409207a73cc8e4aff75ceccf6fe5c3ce4d391bc (diff) | |
parent | 4eebe38a37f9397ffecd4bd3afbdf36838a97969 (diff) |
Merge tag 'trace-v5.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
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
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/trace.h | 1 | ||||
-rw-r--r-- | kernel/trace/trace_events_hist.c | 13 |
2 files changed, 11 insertions, 3 deletions
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 1974ce818ddb..82c70b63d375 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/trace_seq.h> | 15 | #include <linux/trace_seq.h> |
16 | #include <linux/trace_events.h> | 16 | #include <linux/trace_events.h> |
17 | #include <linux/compiler.h> | 17 | #include <linux/compiler.h> |
18 | #include <linux/trace_seq.h> | ||
19 | #include <linux/glob.h> | 18 | #include <linux/glob.h> |
20 | 19 | ||
21 | #ifdef CONFIG_FTRACE_SYSCALLS | 20 | #ifdef CONFIG_FTRACE_SYSCALLS |
diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index 7fca3457c705..ca6b0dff60c5 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c | |||
@@ -59,7 +59,7 @@ | |||
59 | C(NO_CLOSING_PAREN, "No closing paren found"), \ | 59 | C(NO_CLOSING_PAREN, "No closing paren found"), \ |
60 | C(SUBSYS_NOT_FOUND, "Missing subsystem"), \ | 60 | C(SUBSYS_NOT_FOUND, "Missing subsystem"), \ |
61 | C(INVALID_SUBSYS_EVENT, "Invalid subsystem or event name"), \ | 61 | C(INVALID_SUBSYS_EVENT, "Invalid subsystem or event name"), \ |
62 | C(INVALID_REF_KEY, "Using variable references as keys not supported"), \ | 62 | C(INVALID_REF_KEY, "Using variable references in keys not supported"), \ |
63 | C(VAR_NOT_FOUND, "Couldn't find variable"), \ | 63 | C(VAR_NOT_FOUND, "Couldn't find variable"), \ |
64 | C(FIELD_NOT_FOUND, "Couldn't find field"), | 64 | C(FIELD_NOT_FOUND, "Couldn't find field"), |
65 | 65 | ||
@@ -1854,6 +1854,9 @@ static u64 hist_field_var_ref(struct hist_field *hist_field, | |||
1854 | struct hist_elt_data *elt_data; | 1854 | struct hist_elt_data *elt_data; |
1855 | u64 var_val = 0; | 1855 | u64 var_val = 0; |
1856 | 1856 | ||
1857 | if (WARN_ON_ONCE(!elt)) | ||
1858 | return var_val; | ||
1859 | |||
1857 | elt_data = elt->private_data; | 1860 | elt_data = elt->private_data; |
1858 | var_val = elt_data->var_ref_vals[hist_field->var_ref_idx]; | 1861 | var_val = elt_data->var_ref_vals[hist_field->var_ref_idx]; |
1859 | 1862 | ||
@@ -3582,14 +3585,20 @@ static bool cond_snapshot_update(struct trace_array *tr, void *cond_data) | |||
3582 | struct track_data *track_data = tr->cond_snapshot->cond_data; | 3585 | struct track_data *track_data = tr->cond_snapshot->cond_data; |
3583 | struct hist_elt_data *elt_data, *track_elt_data; | 3586 | struct hist_elt_data *elt_data, *track_elt_data; |
3584 | struct snapshot_context *context = cond_data; | 3587 | struct snapshot_context *context = cond_data; |
3588 | struct action_data *action; | ||
3585 | u64 track_val; | 3589 | u64 track_val; |
3586 | 3590 | ||
3587 | if (!track_data) | 3591 | if (!track_data) |
3588 | return false; | 3592 | return false; |
3589 | 3593 | ||
3594 | action = track_data->action_data; | ||
3595 | |||
3590 | track_val = get_track_val(track_data->hist_data, context->elt, | 3596 | track_val = get_track_val(track_data->hist_data, context->elt, |
3591 | track_data->action_data); | 3597 | track_data->action_data); |
3592 | 3598 | ||
3599 | if (!action->track_data.check_val(track_data->track_val, track_val)) | ||
3600 | return false; | ||
3601 | |||
3593 | track_data->track_val = track_val; | 3602 | track_data->track_val = track_val; |
3594 | memcpy(track_data->key, context->key, track_data->key_len); | 3603 | memcpy(track_data->key, context->key, track_data->key_len); |
3595 | 3604 | ||
@@ -4503,7 +4512,7 @@ static int create_key_field(struct hist_trigger_data *hist_data, | |||
4503 | goto out; | 4512 | goto out; |
4504 | } | 4513 | } |
4505 | 4514 | ||
4506 | if (hist_field->flags & HIST_FIELD_FL_VAR_REF) { | 4515 | if (field_has_hist_vars(hist_field, 0)) { |
4507 | hist_err(tr, HIST_ERR_INVALID_REF_KEY, errpos(field_str)); | 4516 | hist_err(tr, HIST_ERR_INVALID_REF_KEY, errpos(field_str)); |
4508 | destroy_hist_field(hist_field, 0); | 4517 | destroy_hist_field(hist_field, 0); |
4509 | ret = -EINVAL; | 4518 | ret = -EINVAL; |