From: tip-bot for Andi Kleen <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: mingo@kernel.org, jolsa@kernel.org, ak@linux.intel.com,
linux-kernel@vger.kernel.org, acme@redhat.com, hpa@zytor.com,
tglx@linutronix.de
Subject: [tip:perf/core] perf tools: Expression parser enhancements for metrics
Date: Thu, 24 Aug 2017 01:21:07 -0700 [thread overview]
Message-ID: <tip-d73bad06851b8d5745c11dd4ab789464f6c71b39@git.kernel.org> (raw)
In-Reply-To: <20170811232634.30465-8-andi@firstfloor.org>
Commit-ID: d73bad06851b8d5745c11dd4ab789464f6c71b39
Gitweb: http://git.kernel.org/tip/d73bad06851b8d5745c11dd4ab789464f6c71b39
Author: Andi Kleen <ak@linux.intel.com>
AuthorDate: Fri, 11 Aug 2017 16:26:23 -0700
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 22 Aug 2017 12:15:53 -0300
perf tools: Expression parser enhancements for metrics
Enhance the expression parser for more complex metric formulas.
- Support python style IF ELSE operators
- Add an #SMT_On magic variable for formulas that depend on the SMT
status.
Example: 4 *( CPU_CLK_UNHALTED.THREAD_ANY / 2 ) if #SMT_on else cycles
- Support MIN/MAX operations
Example: min(1 , IDQ.MITE_UOPS / ( UPI * 16 * ( ICACHE.HIT + ICACHE.MISSES ) / 4.0 ) )
This is useful to fix up problems caused by multiplexing.
- Support | & ^ operators
- Minor cleanups and fixes
- Support an \ escape for operators. This allows to specify event names
like c2-residency
- Support @ as an alternative for / to be able to specify pmus without
conflicts with operators (like msr/tsc/ as msr@tsc@)
Example: (cstate_core@c3\\-residency@ / msr@tsc@) * 100
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20170811232634.30465-8-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/tests/expr.c | 5 ++++
tools/perf/util/expr.y | 61 ++++++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 60 insertions(+), 6 deletions(-)
diff --git a/tools/perf/tests/expr.c b/tools/perf/tests/expr.c
index e939032..cb251bf 100644
--- a/tools/perf/tests/expr.c
+++ b/tools/perf/tests/expr.c
@@ -31,6 +31,11 @@ int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
ret |= test(&ctx, "(BAR/2)%2", 1);
ret |= test(&ctx, "1 - -4", 5);
ret |= test(&ctx, "(FOO-1)*2 + (BAR/2)%2 - -4", 5);
+ ret |= test(&ctx, "1-1 | 1", 1);
+ ret |= test(&ctx, "1-1 & 1", 0);
+ ret |= test(&ctx, "min(1,2) + 1", 2);
+ ret |= test(&ctx, "max(1,2) + 1", 3);
+ ret |= test(&ctx, "1+1 if 3*4 else 0", 2);
if (ret)
return ret;
diff --git a/tools/perf/util/expr.y b/tools/perf/util/expr.y
index 953e65b..5753c4f 100644
--- a/tools/perf/util/expr.y
+++ b/tools/perf/util/expr.y
@@ -4,6 +4,7 @@
#include "util/debug.h"
#define IN_EXPR_Y 1
#include "expr.h"
+#include "smt.h"
#include <string.h>
#define MAXIDLEN 256
@@ -22,13 +23,15 @@
%token <num> NUMBER
%token <id> ID
+%token MIN MAX IF ELSE SMT_ON
+%left MIN MAX IF
%left '|'
%left '^'
%left '&'
%left '-' '+'
%left '*' '/' '%'
%left NEG NOT
-%type <num> expr
+%type <num> expr if_expr
%{
static int expr__lex(YYSTYPE *res, const char **pp);
@@ -57,7 +60,12 @@ static int lookup_id(struct parse_ctx *ctx, char *id, double *val)
%}
%%
-all_expr: expr { *final_val = $1; }
+all_expr: if_expr { *final_val = $1; }
+ ;
+
+if_expr:
+ expr IF expr ELSE expr { $$ = $3 ? $1 : $5; }
+ | expr
;
expr: NUMBER
@@ -66,13 +74,19 @@ expr: NUMBER
YYABORT;
}
}
+ | expr '|' expr { $$ = (long)$1 | (long)$3; }
+ | expr '&' expr { $$ = (long)$1 & (long)$3; }
+ | expr '^' expr { $$ = (long)$1 ^ (long)$3; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { if ($3 == 0) YYABORT; $$ = $1 / $3; }
| expr '%' expr { if ((long)$3 == 0) YYABORT; $$ = (long)$1 % (long)$3; }
| '-' expr %prec NEG { $$ = -$2; }
- | '(' expr ')' { $$ = $2; }
+ | '(' if_expr ')' { $$ = $2; }
+ | MIN '(' expr ',' expr ')' { $$ = $3 < $5 ? $3 : $5; }
+ | MAX '(' expr ',' expr ')' { $$ = $3 > $5 ? $3 : $5; }
+ | SMT_ON { $$ = smt_on() > 0; }
;
%%
@@ -82,13 +96,47 @@ static int expr__symbol(YYSTYPE *res, const char *p, const char **pp)
char *dst = res->id;
const char *s = p;
- while (isalnum(*p) || *p == '_' || *p == '.') {
+ if (*p == '#')
+ *dst++ = *p++;
+
+ while (isalnum(*p) || *p == '_' || *p == '.' || *p == ':' || *p == '@' || *p == '\\') {
if (p - s >= MAXIDLEN)
return -1;
- *dst++ = *p++;
+ /*
+ * Allow @ instead of / to be able to specify pmu/event/ without
+ * conflicts with normal division.
+ */
+ if (*p == '@')
+ *dst++ = '/';
+ else if (*p == '\\')
+ *dst++ = *++p;
+ else
+ *dst++ = *p;
+ p++;
}
*dst = 0;
*pp = p;
+ dst = res->id;
+ switch (dst[0]) {
+ case 'm':
+ if (!strcmp(dst, "min"))
+ return MIN;
+ if (!strcmp(dst, "max"))
+ return MAX;
+ break;
+ case 'i':
+ if (!strcmp(dst, "if"))
+ return IF;
+ break;
+ case 'e':
+ if (!strcmp(dst, "else"))
+ return ELSE;
+ break;
+ case '#':
+ if (!strcasecmp(dst, "#smt_on"))
+ return SMT_ON;
+ break;
+ }
return ID;
}
@@ -102,6 +150,7 @@ static int expr__lex(YYSTYPE *res, const char **pp)
p++;
s = p;
switch (*p++) {
+ case '#':
case 'a' ... 'z':
case 'A' ... 'Z':
return expr__symbol(res, p - 1, pp);
@@ -151,7 +200,7 @@ int expr__find_other(const char *p, const char *one, const char ***other,
err = 0;
break;
}
- if (tok == ID && strcasecmp(one, val.id)) {
+ if (tok == ID && (!one || strcasecmp(one, val.id))) {
if (num_other >= EXPR_MAX_OTHER - 1) {
pr_debug("Too many extra events in %s\n", orig);
break;
next prev parent reply other threads:[~2017-08-24 8:23 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-11 23:26 [PATCH v2 01/19] perf, tools: Save max_x, max_y in xyarray Andi Kleen
2017-08-11 23:26 ` [PATCH v2 02/19] perf, tools: Fix buffer overflow while freeing events Andi Kleen
2017-08-22 8:20 ` Jiri Olsa
2017-08-24 8:19 ` [tip:perf/core] perf evsel: " tip-bot for Andi Kleen
2017-08-11 23:26 ` [PATCH v2 03/19] perf, tools, stat: Fix saved values rbtree lookup Andi Kleen
2017-08-11 23:26 ` [PATCH v2 04/19] perf, tools: Tighten detection of BPF events Andi Kleen
2017-08-22 8:20 ` Jiri Olsa
2017-08-22 15:00 ` Arnaldo Carvalho de Melo
2017-08-24 8:20 ` [tip:perf/core] perf bpf: " tip-bot for Andi Kleen
2017-08-11 23:26 ` [PATCH v2 05/19] perf, tools: Support weak groups Andi Kleen
2017-08-22 8:34 ` Jiri Olsa
2017-08-22 20:58 ` Andi Kleen
2017-08-23 7:40 ` Jiri Olsa
2017-08-22 8:36 ` Jiri Olsa
2017-08-22 21:00 ` Andi Kleen
2017-08-11 23:26 ` [PATCH v2 06/19] perf, tools: Add missing newline to expr parser error messages Andi Kleen
2017-08-11 23:26 ` [PATCH v2 07/19] perf, tools: Add utility function to detect SMT status Andi Kleen
2017-08-22 8:45 ` Jiri Olsa
2017-08-22 15:16 ` Arnaldo Carvalho de Melo
2017-08-24 8:20 ` [tip:perf/core] perf " tip-bot for Andi Kleen
2017-08-11 23:26 ` [PATCH v2 08/19] perf, tools: Expression parser enhancements for metrics Andi Kleen
2017-08-22 8:45 ` Jiri Olsa
2017-08-22 15:16 ` Arnaldo Carvalho de Melo
2017-08-23 17:43 ` Jiri Olsa
2017-08-24 8:21 ` tip-bot for Andi Kleen [this message]
2017-08-11 23:26 ` [PATCH v2 09/19] perf, tools: Increase maximum number of events in expressions Andi Kleen
2017-08-22 8:45 ` Jiri Olsa
2017-08-22 15:17 ` Arnaldo Carvalho de Melo
2017-08-24 8:21 ` [tip:perf/core] perf " tip-bot for Andi Kleen
2017-08-11 23:26 ` [PATCH v2 10/19] perf, tools: Dedup events in expression parsing Andi Kleen
2017-08-22 8:46 ` Jiri Olsa
2017-08-24 8:21 ` [tip:perf/core] perf " tip-bot for Andi Kleen
2017-08-11 23:26 ` [PATCH v2 11/19] perf, tools: Support metric_group and no event name in json parser Andi Kleen
2017-08-11 23:26 ` [PATCH v2 12/19] perf, tools, stat: Factor out generic metric printing Andi Kleen
2017-08-28 9:19 ` Jiri Olsa
2017-08-11 23:26 ` [PATCH v2 13/19] perf, tools: Print generic metric header even for failed expressions Andi Kleen
2017-08-11 23:26 ` [PATCH v2 14/19] perf, tools, stat: Support JSON metrics in perf stat Andi Kleen
2017-08-28 8:13 ` Jiri Olsa
2017-08-28 9:19 ` Jiri Olsa
2017-08-28 9:19 ` Jiri Olsa
2017-08-28 16:46 ` Andi Kleen
2017-08-11 23:26 ` [PATCH v2 15/19] perf, tools, list: Add metric groups to perf list Andi Kleen
2017-08-11 23:26 ` [PATCH v2 16/19] perf, tools, stat: Don't use ctx for saved values lookup Andi Kleen
2017-08-11 23:26 ` [PATCH v2 17/19] perf, tools, stat: Support duration_time for metrics Andi Kleen
2017-08-28 9:19 ` Jiri Olsa
2017-08-28 16:47 ` Andi Kleen
2017-08-11 23:26 ` [PATCH v2 18/19] perf, tools, stat: Hide internal duration_time counter Andi Kleen
2017-08-11 23:26 ` [PATCH v2 19/19] perf, tools, stat: Update walltime_nsecs_stats in interval mode Andi Kleen
2017-08-14 20:15 ` [PATCH v2 01/19] perf, tools: Save max_x, max_y in xyarray Jiri Olsa
2017-08-14 20:39 ` Andi Kleen
2017-08-14 21:12 ` Jiri Olsa
2017-08-22 8:20 ` Jiri Olsa
2017-08-22 14:40 ` Arnaldo Carvalho de Melo
2017-08-22 14:44 ` Jiri Olsa
2017-08-22 15:07 ` Arnaldo Carvalho de Melo
2017-08-24 8:19 ` [tip:perf/core] perf xyarray: Save max_x, max_y tip-bot for Andi Kleen
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=tip-d73bad06851b8d5745c11dd4ab789464f6c71b39@git.kernel.org \
--to=tipbot@zytor.com \
--cc=acme@redhat.com \
--cc=ak@linux.intel.com \
--cc=hpa@zytor.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=tglx@linutronix.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome