diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index 532e4dbc98e684a6294cd97dad25ad831167b6be..d0c58f85c6178a4a6181065879ecad4a758392b7 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -3706,6 +3706,19 @@ static int __create_val_field(struct hist_trigger_data *hist_data, goto out; } + /* values and variables should not have some modifiers */ + if (hist_field->flags & HIST_FIELD_FL_VAR) { + /* Variable */ + if (hist_field->flags & (HIST_FIELD_FL_LOG2)) + goto err; + } else { + /* Value */ + if (hist_field->flags & (HIST_FIELD_FL_LOG2 | + HIST_FIELD_FL_SYM | HIST_FIELD_FL_SYM_OFFSET | + HIST_FIELD_FL_SYSCALL | HIST_FIELD_FL_STACKTRACE)) + goto err; + } + hist_data->fields[val_idx] = hist_field; ++hist_data->n_vals; @@ -3715,6 +3728,9 @@ static int __create_val_field(struct hist_trigger_data *hist_data, ret = -EINVAL; out: return ret; + err: + hist_err(file->tr, HIST_ERR_BAD_FIELD_MODIFIER, errpos(field_str)); + return -EINVAL; } static int create_val_field(struct hist_trigger_data *hist_data,