On Mon, 10 Dec 2018 18:01:34 -0600 Tom Zanussi <zanussi@xxxxxxxxxx> wrote: > From: Tom Zanussi <tom.zanussi@xxxxxxxxxxxxxxx> > > Since every var ref for a trigger has an entry in the var_ref[] array, > use that to destroy the var_refs, instead of piecemeal via the field > expressions. > > This allows us to avoid having to keep and treat differently separate > lists for the action-related references, which future patches will > remove. I'm not so sure, but this seems a bugfix... if so, please move this at the top of this series. Thank you, > > Signed-off-by: Tom Zanussi <tom.zanussi@xxxxxxxxxxxxxxx> > --- > kernel/trace/trace_events_hist.c | 24 +++++++++++++++++++----- > 1 file changed, 19 insertions(+), 5 deletions(-) > > diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c > index d07bb2d75e18..da4800c3f745 100644 > --- a/kernel/trace/trace_events_hist.c > +++ b/kernel/trace/trace_events_hist.c > @@ -2312,6 +2312,15 @@ static int contains_operator(char *str) > return field_op; > } > > +static void __destroy_hist_field(struct hist_field *hist_field) > +{ > + kfree(hist_field->var.name); > + kfree(hist_field->name); > + kfree(hist_field->type); > + > + kfree(hist_field); > +} > + > static void destroy_hist_field(struct hist_field *hist_field, > unsigned int level) > { > @@ -2323,14 +2332,13 @@ static void destroy_hist_field(struct hist_field *hist_field, > if (!hist_field) > return; > > + if (hist_field->flags & HIST_FIELD_FL_VAR_REF) > + return; /* var refs will be destroyed separately */ > + > for (i = 0; i < HIST_FIELD_OPERANDS_MAX; i++) > destroy_hist_field(hist_field->operands[i], level + 1); > > - kfree(hist_field->var.name); > - kfree(hist_field->name); > - kfree(hist_field->type); > - > - kfree(hist_field); > + __destroy_hist_field(hist_field); > } > > static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data, > @@ -2457,6 +2465,12 @@ static void destroy_hist_fields(struct hist_trigger_data *hist_data) > hist_data->fields[i] = NULL; > } > } > + > + for (i = 0; i < hist_data->n_var_refs; i++) { > + WARN_ON(!(hist_data->var_refs[i]->flags & HIST_FIELD_FL_VAR_REF)); > + __destroy_hist_field(hist_data->var_refs[i]); > + hist_data->var_refs[i] = NULL; > + } > } > > static int init_var_ref(struct hist_field *ref_field, > -- > 2.14.1 > -- Masami Hiramatsu <mhiramat@xxxxxxxxxx>