From: Jiri Olsa <jolsa@redhat.com>
To: Ian Rogers <irogers@google.com>
Cc: Andi Kleen <ak@linux.intel.com>,
Jin Yao <yao.jin@linux.intel.com>,
Namhyung Kim <namhyung@kernel.org>,
John Garry <john.garry@huawei.com>,
Kajol Jain <kjain@linux.ibm.com>,
"Paul A . Clarke" <pc@us.ibm.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Riccardo Mancini <rickyman7@gmail.com>,
Kan Liang <kan.liang@linux.intel.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Madhavan Srinivasan <maddy@linux.ibm.com>,
Song Liu <song@kernel.org>, Wan Jiabing <wanjiabing@vivo.com>,
Yury Norov <yury.norov@gmail.com>,
Changbin Du <changbin.du@intel.com>,
linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 6/7] perf expr: Add metric literals for topology.
Date: Wed, 10 Nov 2021 15:35:09 +0100 [thread overview]
Message-ID: <YYvYnYPg43acgkvs@krava> (raw)
In-Reply-To: <CAP-5=fWRzptEG2TUALNJaVLdP2egHhyhPZ=9HuP2da68jiPPTA@mail.gmail.com>
On Wed, Nov 10, 2021 at 06:19:04AM -0800, Ian Rogers wrote:
> On Wed, Nov 10, 2021 at 4:56 AM Jiri Olsa <jolsa@redhat.com> wrote:
> >
> > On Fri, Nov 05, 2021 at 10:09:42AM -0700, Ian Rogers wrote:
> > > Allow the number of cpus, cores, dies and packages to be queried by a
> > > metric expression.
> > >
> > > Signed-off-by: Ian Rogers <irogers@google.com>
> > > ---
> > > tools/perf/tests/expr.c | 12 +++++++++++-
> > > tools/perf/util/expr.c | 27 +++++++++++++++++++++++++++
> > > 2 files changed, 38 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/tools/perf/tests/expr.c b/tools/perf/tests/expr.c
> > > index 9ee2dc91c27b..0c09ccc76665 100644
> > > --- a/tools/perf/tests/expr.c
> > > +++ b/tools/perf/tests/expr.c
> > > @@ -66,7 +66,7 @@ int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
> > > {
> > > struct expr_id_data *val_ptr;
> > > const char *p;
> > > - double val;
> > > + double val, num_cpus, num_cores, num_dies, num_packages;
> > > int ret;
> > > struct expr_parse_ctx *ctx;
> > >
> > > @@ -161,6 +161,16 @@ int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
> > > NULL, ctx) == 0);
> > > TEST_ASSERT_VAL("find ids", hashmap__size(ctx->ids) == 0);
> > >
> > > + /* Test toplogy constants appear well ordered. */
> > > + expr__ctx_clear(ctx);
> > > + TEST_ASSERT_VAL("#num_cpus", expr__parse(&num_cpus, ctx, "#num_cpus") == 0);
> > > + TEST_ASSERT_VAL("#num_cores", expr__parse(&num_cores, ctx, "#num_cores") == 0);
> > > + TEST_ASSERT_VAL("#num_cpus >= #num_cores", num_cpus >= num_cores);
> > > + TEST_ASSERT_VAL("#num_dies", expr__parse(&num_dies, ctx, "#num_dies") == 0);
> > > + TEST_ASSERT_VAL("#num_cores >= #num_dies", num_cores >= num_dies);
> > > + TEST_ASSERT_VAL("#num_packages", expr__parse(&num_packages, ctx, "#num_packages") == 0);
> > > + TEST_ASSERT_VAL("#num_dies >= #num_packages", num_dies >= num_packages);
> > > +
> > > expr__ctx_free(ctx);
> > >
> > > return 0;
> > > diff --git a/tools/perf/util/expr.c b/tools/perf/util/expr.c
> > > index 7464739c2890..15af8b8ef5e7 100644
> > > --- a/tools/perf/util/expr.c
> > > +++ b/tools/perf/util/expr.c
> > > @@ -5,6 +5,8 @@
> > > #include <stdlib.h>
> > > #include <string.h>
> > > #include "metricgroup.h"
> > > +#include "cpumap.h"
> > > +#include "cputopo.h"
> > > #include "debug.h"
> > > #include "expr.h"
> > > #include "expr-bison.h"
> > > @@ -375,9 +377,34 @@ double expr_id_data__value(const struct expr_id_data *data)
> > >
> > > double expr__get_literal(const char *literal)
> > > {
> > > + static struct cpu_topology *topology;
> > > +
> > > if (!strcmp("#smt_on", literal))
> > > return smt_on() > 0 ? 1.0 : 0.0;
> > >
> > > + if (!strcmp("#num_cpus", literal))
> > > + return cpu__max_present_cpu();
> > > +
> > > + /*
> > > + * Assume that topology strings are consistent, such as CPUs "0-1"
> > > + * wouldn't be listed as "0,1", and so after deduplication the number of
> > > + * these strings gives an indication of the number of packages, dies,
> > > + * etc.
> > > + */
> > > + if (!topology) {
> > > + topology = cpu_topology__new();
> >
> > any chance we could propagate expr_scanner_ctx in here and store topology
> > to it and release it at the end? I think we have several places like this,
> > so it'd be nice not to make more if it's possible ;-)
>
> The topology here is static and so will only get computed once per
> execution rather than once pre expression parse. I was worried about
> the cost of recomputing the topology for something like 'perf stat -I
> 1000 -M ...' in which case the static will do less recomputation.
can't we have the topology created/release on the top fo the parsing
and released after all expressions are parsed?
or we could come up with some generic way to handle this kind of release
jirka
>
> Thanks,
> Ian
>
> > thanks,
> > jirka
> >
> > > + if (!topology) {
> > > + pr_err("Error creating CPU topology");
> > > + return NAN;
> > > + }
> > > + }
> > > + if (!strcmp("#num_packages", literal))
> > > + return topology->package_cpus_lists;
> > > + if (!strcmp("#num_dies", literal))
> > > + return topology->die_cpus_lists;
> > > + if (!strcmp("#num_cores", literal))
> > > + return topology->core_cpus_lists;
> > > +
> > > pr_err("Unrecognized literal '%s'", literal);
> > > return NAN;
> > > }
> > > --
> > > 2.34.0.rc0.344.g81b53c2807-goog
> > >
> >
>
next prev parent reply other threads:[~2021-11-10 14:35 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-05 17:09 [PATCH 0/7] New function and literals for metrics Ian Rogers
2021-11-05 17:09 ` [PATCH 1/7] perf test: Add expr test for events with hyphens Ian Rogers
2021-11-05 17:09 ` [PATCH 2/7] perf cputopo: Update to use pakage_cpus Ian Rogers
2021-11-05 17:09 ` [PATCH 3/7] perf cputopo: Match die_siblings to topology ABI name Ian Rogers
2021-11-05 17:09 ` [PATCH 4/7] perf cputopo: Match thread_siblings " Ian Rogers
2021-11-05 17:09 ` [PATCH 5/7] perf expr: Add literal values starting with # Ian Rogers
2021-11-05 17:09 ` [PATCH 6/7] perf expr: Add metric literals for topology Ian Rogers
2021-11-10 12:56 ` Jiri Olsa
2021-11-10 14:19 ` Ian Rogers
2021-11-10 14:35 ` Jiri Olsa [this message]
2021-11-10 17:58 ` Ian Rogers
2021-11-10 18:29 ` Jiri Olsa
2021-11-05 17:09 ` [PATCH 7/7] perf expr: Add source_count for aggregating events Ian Rogers
2021-11-10 12:56 ` Jiri Olsa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YYvYnYPg43acgkvs@krava \
--to=jolsa@redhat.com \
--cc=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=changbin.du@intel.com \
--cc=irogers@google.com \
--cc=john.garry@huawei.com \
--cc=kan.liang@linux.intel.com \
--cc=kjain@linux.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=maddy@linux.ibm.com \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=pc@us.ibm.com \
--cc=peterz@infradead.org \
--cc=rickyman7@gmail.com \
--cc=song@kernel.org \
--cc=wanjiabing@vivo.com \
--cc=yao.jin@linux.intel.com \
--cc=yury.norov@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.