lkml.org 
[lkml]   [2020]   [Jul]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH 10/18] perf metric: Collect referenced metrics in struct metric_expr
    On Sun, Jul 12, 2020 at 6:27 AM Jiri Olsa <jolsa@kernel.org> wrote:
    >
    > Add referenced metrics into struct metric_expr object,
    > so they are accessible when computing the metric.
    >
    > Storing just name and expression itself, so the metric
    > can be resolved and computed.
    >
    > Signed-off-by: Jiri Olsa <jolsa@kernel.org>

    Acked-by: Ian Rogers <irogers@google.com>

    Thanks,
    Ian

    > ---
    > tools/perf/util/metricgroup.c | 26 ++++++++++++++++++++++++++
    > tools/perf/util/metricgroup.h | 6 ++++++
    > 2 files changed, 32 insertions(+)
    >
    > diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
    > index 9923eef1e2d4..8cbcc5e05fef 100644
    > --- a/tools/perf/util/metricgroup.c
    > +++ b/tools/perf/util/metricgroup.c
    > @@ -83,6 +83,7 @@ static void metric_event_delete(struct rblist *rblist __maybe_unused,
    > struct metric_expr *expr, *tmp;
    >
    > list_for_each_entry_safe(expr, tmp, &me->head, nd) {
    > + free(expr->metric_refs);
    > free(expr);
    > }
    >
    > @@ -243,6 +244,7 @@ static int metricgroup__setup_events(struct list_head *groups,
    >
    > list_for_each_entry (eg, groups, nd) {
    > struct evsel **metric_events;
    > + struct metric_ref *metric_refs = NULL;
    >
    > metric_events = calloc(sizeof(void *),
    > hashmap__size(&eg->pctx.ids) + 1);
    > @@ -274,6 +276,30 @@ static int metricgroup__setup_events(struct list_head *groups,
    > free(metric_events);
    > break;
    > }
    > +
    > + /*
    > + * Collect and store collected nested expressions
    > + * for metric processing.
    > + */
    > + if (eg->refs_cnt) {
    > + struct metric_ref_node *ref;
    > +
    > + metric_refs = zalloc(sizeof(struct metric_ref) * (eg->refs_cnt + 1));
    > + if (!metric_refs) {
    > + ret = -ENOMEM;
    > + free(metric_events);
    > + break;
    > + }
    > +
    > + i = 0;
    > + list_for_each_entry(ref, &eg->refs, list) {
    > + metric_refs[i].metric_name = ref->metric_name;
    > + metric_refs[i].metric_expr = ref->metric_expr;
    > + i++;
    > + }
    > + };
    > +
    > + expr->metric_refs = metric_refs;
    > expr->metric_expr = eg->metric_expr;
    > expr->metric_name = eg->metric_name;
    > expr->metric_unit = eg->metric_unit;
    > diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h
    > index 8315bd1a7da4..62623a39cbec 100644
    > --- a/tools/perf/util/metricgroup.h
    > +++ b/tools/perf/util/metricgroup.h
    > @@ -18,12 +18,18 @@ struct metric_event {
    > struct list_head head; /* list of metric_expr */
    > };
    >
    > +struct metric_ref {
    > + const char *metric_name;
    > + const char *metric_expr;
    > +};
    > +
    > struct metric_expr {
    > struct list_head nd;
    > const char *metric_expr;
    > const char *metric_name;
    > const char *metric_unit;
    > struct evsel **metric_events;
    > + struct metric_ref *metric_refs;
    > int runtime;
    > };
    >
    > --
    > 2.25.4
    >

    \
     
     \ /
      Last update: 2020-07-15 02:39    [W:4.327 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site