Re: [PATCH 11/18] perf metric: Add referenced metrics to hash data
From: Jiri Olsa
Date: Wed Jul 15 2020 - 17:36:22 EST
On Wed, Jul 15, 2020 at 11:25:14AM -0700, Ian Rogers wrote:
> On Sun, Jul 12, 2020 at 6:27 AM Jiri Olsa <jolsa@xxxxxxxxxx> wrote:
SNIP
> > +int expr__add_ref(struct expr_parse_ctx *ctx, struct metric_ref *ref)
> > +{
> > + struct expr_id_data *data_ptr = NULL, *old_data = NULL;
> > + char *old_key = NULL;
> > + char *name;
> > + int ret;
> > +
> > + data_ptr = zalloc(sizeof(*data_ptr));
> > + if (!data_ptr)
> > + return -ENOMEM;
> > +
> > + name = strdup(ref->metric_name);
> > + if (!name) {
> > + free(data_ptr);
> > + return -ENOMEM;
> > + }
> > +
> > + data_ptr->ref.metric_name = ref->metric_name;
> > + data_ptr->ref.metric_expr = ref->metric_expr;
>
> Having one owned string and one unowned makes the memory management
> here somewhat complicated. Perhaps dupe both?
right, will check on this
>
> > + data_ptr->is_ref = true;
> > +
> > + ret = hashmap__set(&ctx->ids, name, data_ptr,
> > + (const void **)&old_key, (void **)&old_data);
> > +
> > + pr_debug2("adding ref metric %s: %s\n",
> > + ref->metric_name, ref->metric_expr);
> > +
> > + free(old_key);
> > + free(old_data);
> > + return ret;
> > +}
> > +
> > int expr__get_id(struct expr_parse_ctx *ctx, const char *id,
> > struct expr_id_data **data)
> > {
> > diff --git a/tools/perf/util/expr.h b/tools/perf/util/expr.h
> > index 2462abd0ac65..d19e66915228 100644
> > --- a/tools/perf/util/expr.h
> > +++ b/tools/perf/util/expr.h
> > @@ -11,12 +11,22 @@
> > #include "util/hashmap.h"
> > //#endif
> >
> > +struct metric_ref;
> > +
> > struct expr_parse_ctx {
> > struct hashmap ids;
> > };
> >
> > struct expr_id_data {
> > - double val;
> > + bool is_ref;
>
> nit: place at the end to avoid padding?
ok
>
> > +
> > + union {
> > + double val;
> > + struct {
> > + const char *metric_name;
> > + const char *metric_expr;
> > + } ref;
> > + };
> > };
> >
> > struct expr_scanner_ctx {
> > @@ -29,6 +39,7 @@ void expr__ctx_clear(struct expr_parse_ctx *ctx);
> > void expr__del_id(struct expr_parse_ctx *ctx, const char *id);
> > int expr__add_id(struct expr_parse_ctx *ctx, const char *id);
> > int expr__add_id_val(struct expr_parse_ctx *ctx, const char *id, double val);
> > +int expr__add_ref(struct expr_parse_ctx *ctx, struct metric_ref *ref);
> > int expr__get_id(struct expr_parse_ctx *ctx, const char *id,
> > struct expr_id_data **data);
> > int expr__parse(double *final_val, struct expr_parse_ctx *ctx,
> > diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c
> > index fc9ac4b4218e..e1ba6c1b916a 100644
> > --- a/tools/perf/util/stat-shadow.c
> > +++ b/tools/perf/util/stat-shadow.c
> > @@ -731,13 +731,14 @@ static void print_smi_cost(struct perf_stat_config *config,
> > }
> >
> > static int prepare_metric(struct evsel **metric_events,
> > + struct metric_ref *metric_refs,
>
> nit: the plural on refs confused me at first, perhaps a comment that
> this is the array of referenced metrics.
I'll add the comment
thanks,
jirka