Re: [PATCH v8 20/22] tracing: Use hist trigger's var_ref array to destroy var_refs
From: Masami Hiramatsu
Date: Fri Dec 14 2018 - 11:31:26 EST
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>