All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/2] perf expr: Add d_ratio operation
@ 2020-06-10 23:58 Ian Rogers
  2020-06-10 23:58 ` [PATCH v2 2/2] perf expr: Add < and > operators Ian Rogers
  2020-06-11  8:38 ` [PATCH v2 1/2] perf expr: Add d_ratio operation Jiri Olsa
  0 siblings, 2 replies; 5+ messages in thread
From: Ian Rogers @ 2020-06-10 23:58 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
	Andi Kleen, Jin Yao, John Garry, Paul Clarke, Kajol Jain,
	linux-kernel
  Cc: Stephane Eranian, linux-perf-users, Ian Rogers

d_ratio avoids division by 0 yielding infinity, such as when a counter
doesn't get scheduled. An example usage is:

{
    "BriefDescription": "DCache L1 misses",
    "MetricExpr": "d_ratio(MEM_LOAD_RETIRED.L1_MISS, MEM_LOAD_RETIRED.L1_HIT + MEM_LOAD_RETIRED.L1_MISS + MEM_LOAD_RETIRED.FB_HIT)",
    "MetricGroup": "DCache;DCache_L1",
    "MetricName": "DCache_L1_Miss",
    "ScaleUnit": "100%",
}

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/tests/expr.c |  2 ++
 tools/perf/util/expr.l  |  1 +
 tools/perf/util/expr.y  | 14 ++++++++++++--
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/tools/perf/tests/expr.c b/tools/perf/tests/expr.c
index 1cb02ca2b15f..c4877b36ab58 100644
--- a/tools/perf/tests/expr.c
+++ b/tools/perf/tests/expr.c
@@ -39,6 +39,8 @@ int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
 	ret |= test(&ctx, "1+1 if 3*4 else 0", 2);
 	ret |= test(&ctx, "1.1 + 2.1", 3.2);
 	ret |= test(&ctx, ".1 + 2.", 2.1);
+	ret |= test(&ctx, "d_ratio(1, 2)", 0.5);
+	ret |= test(&ctx, "d_ratio(2.5, 0)", 0);
 
 	if (ret)
 		return ret;
diff --git a/tools/perf/util/expr.l b/tools/perf/util/expr.l
index f397bf8b1a48..298d86660a96 100644
--- a/tools/perf/util/expr.l
+++ b/tools/perf/util/expr.l
@@ -100,6 +100,7 @@ symbol		({spec}|{sym})+
 		}
 	}
 
+d_ratio		{ return D_RATIO; }
 max		{ return MAX; }
 min		{ return MIN; }
 if		{ return IF; }
diff --git a/tools/perf/util/expr.y b/tools/perf/util/expr.y
index bf3e898e3055..fe145344bb39 100644
--- a/tools/perf/util/expr.y
+++ b/tools/perf/util/expr.y
@@ -10,6 +10,14 @@
 #include "smt.h"
 #include <string.h>
 
+static double d_ratio(double val0, double val1)
+{
+	if (val1 == 0) {
+		return 0;
+	}
+	return  val0 / val1;
+}
+
 %}
 
 %define api.pure full
@@ -28,7 +36,7 @@
 %token <num> NUMBER
 %token <str> ID
 %destructor { free ($$); } <str>
-%token MIN MAX IF ELSE SMT_ON
+%token MIN MAX IF ELSE SMT_ON D_RATIO
 %left MIN MAX IF
 %left '|'
 %left '^'
@@ -64,7 +72,8 @@ other: ID
 }
 |
 MIN | MAX | IF | ELSE | SMT_ON | NUMBER | '|' | '^' | '&' | '-' | '+' | '*' | '/' | '%' | '(' | ')' | ','
-
+|
+D_RATIO
 
 all_expr: if_expr			{ *final_val = $1; }
 	;
@@ -105,6 +114,7 @@ expr:	  NUMBER
 	| MIN '(' expr ',' expr ')' { $$ = $3 < $5 ? $3 : $5; }
 	| MAX '(' expr ',' expr ')' { $$ = $3 > $5 ? $3 : $5; }
 	| SMT_ON		 { $$ = smt_on() > 0; }
+	| D_RATIO '(' expr ',' expr ')' { $$ = d_ratio($3,$5); }
 	;
 
 %%
-- 
2.27.0.278.ge193c7cf3a9-goog

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] perf expr: Add < and > operators
  2020-06-10 23:58 [PATCH v2 1/2] perf expr: Add d_ratio operation Ian Rogers
@ 2020-06-10 23:58 ` Ian Rogers
  2020-06-11  8:38   ` Jiri Olsa
  2020-06-11  8:38 ` [PATCH v2 1/2] perf expr: Add d_ratio operation Jiri Olsa
  1 sibling, 1 reply; 5+ messages in thread
From: Ian Rogers @ 2020-06-10 23:58 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
	Andi Kleen, Jin Yao, John Garry, Paul Clarke, Kajol Jain,
	linux-kernel
  Cc: Stephane Eranian, linux-perf-users, Ian Rogers

These are broadly useful but required to handle TMA metrics. For
example encoding Ports_Utilization from:
https://download.01.org/perfmon/TMA_Metrics.csv
requires '<'.

{
  "BriefDescription": "This metric estimates fraction of cycles the CPU performance was potentially limited due to Core computation issues (non divider-related).  Two distinct categories can be attributed into this metric: (1) heavy data-dependency among contiguous instructions would manifest in this metric - such cases are often referred to as low Instruction Level Parallelism (ILP). (2) Contention on some hardware execution unit other than Divider. For example; when there are too many multiply operations.",
  "MetricExpr": "( ( cpu@EXE_ACTIVITY.EXE_BOUND_0_PORTS@ + cpu@EXE_ACTIVITY.1_PORTS_UTIL@ + ( cpu@EXE_ACTIVITY.2_PORTS_UTIL@ * ( ( ( cpu@UOPS_RETIRED.RETIRE_SLOTS@ ) / ( cpu@CPU_CLK_UNHALTED.THREAD@ ) ) / ( ( 4.000000 ) + 1.000000 ) ) ) ) / ( cpu@CPU_CLK_UNHALTED.THREAD@ ) if ( cpu@ARITH.DIVIDER_ACTIVE\\,cmask\\=1@ < cpu@EXE_ACTIVITY.EXE_BOUND_0_PORTS@ ) else ( ( cpu@EXE_ACTIVITY.EXE_BOUND_0_PORTS@ + cpu@EXE_ACTIVITY.1_PORTS_UTIL@ + ( cpu@EXE_ACTIVITY.2_PORTS_UTIL@ * ( ( ( cpu@UOPS_RETIRED.RETIRE_SLOTS@ ) / ( cpu@CPU_CLK_UNHALTED.THREAD@ ) ) / ( ( 4.000000 ) + 1.000000 ) ) ) ) - cpu@EXE_ACTIVITY.EXE_BOUND_0_PORTS@ ) / ( cpu@CPU_CLK_UNHALTED.THREAD@ ) )",
  "MetricGroup": "Topdown_Group_Ports_Utilization",
  "MetricName": "Topdown_Metric_Ports_Utilization"
},

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/tests/expr.c | 6 ++++++
 tools/perf/util/expr.l  | 2 ++
 tools/perf/util/expr.y  | 5 ++++-
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/tools/perf/tests/expr.c b/tools/perf/tests/expr.c
index c4877b36ab58..b7e5ef3007fc 100644
--- a/tools/perf/tests/expr.c
+++ b/tools/perf/tests/expr.c
@@ -41,6 +41,12 @@ int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
 	ret |= test(&ctx, ".1 + 2.", 2.1);
 	ret |= test(&ctx, "d_ratio(1, 2)", 0.5);
 	ret |= test(&ctx, "d_ratio(2.5, 0)", 0);
+	ret |= test(&ctx, "1.1 < 2.2", 1);
+	ret |= test(&ctx, "2.2 > 1.1", 1);
+	ret |= test(&ctx, "1.1 < 1.1", 0);
+	ret |= test(&ctx, "2.2 > 2.2", 0);
+	ret |= test(&ctx, "2.2 < 1.1", 0);
+	ret |= test(&ctx, "1.1 > 2.2", 0);
 
 	if (ret)
 		return ret;
diff --git a/tools/perf/util/expr.l b/tools/perf/util/expr.l
index 298d86660a96..13e5e3c75f56 100644
--- a/tools/perf/util/expr.l
+++ b/tools/perf/util/expr.l
@@ -111,6 +111,8 @@ else		{ return ELSE; }
 "|"		{ return '|'; }
 "^"		{ return '^'; }
 "&"		{ return '&'; }
+"<"		{ return '<'; }
+">"		{ return '>'; }
 "-"		{ return '-'; }
 "+"		{ return '+'; }
 "*"		{ return '*'; }
diff --git a/tools/perf/util/expr.y b/tools/perf/util/expr.y
index fe145344bb39..5fcb98800f9c 100644
--- a/tools/perf/util/expr.y
+++ b/tools/perf/util/expr.y
@@ -41,6 +41,7 @@ static double d_ratio(double val0, double val1)
 %left '|'
 %left '^'
 %left '&'
+%left '<' '>'
 %left '-' '+'
 %left '*' '/' '%'
 %left NEG NOT
@@ -73,7 +74,7 @@ other: ID
 |
 MIN | MAX | IF | ELSE | SMT_ON | NUMBER | '|' | '^' | '&' | '-' | '+' | '*' | '/' | '%' | '(' | ')' | ','
 |
-D_RATIO
+'<' | '>' | D_RATIO
 
 all_expr: if_expr			{ *final_val = $1; }
 	;
@@ -94,6 +95,8 @@ expr:	  NUMBER
 	| 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		{ $$ = $1 - $3; }
 	| expr '*' expr		{ $$ = $1 * $3; }
-- 
2.27.0.278.ge193c7cf3a9-goog

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/2] perf expr: Add d_ratio operation
  2020-06-10 23:58 [PATCH v2 1/2] perf expr: Add d_ratio operation Ian Rogers
  2020-06-10 23:58 ` [PATCH v2 2/2] perf expr: Add < and > operators Ian Rogers
@ 2020-06-11  8:38 ` Jiri Olsa
  2020-06-11 13:09   ` Arnaldo Carvalho de Melo
  1 sibling, 1 reply; 5+ messages in thread
From: Jiri Olsa @ 2020-06-11  8:38 UTC (permalink / raw)
  To: Ian Rogers
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Namhyung Kim, Andi Kleen,
	Jin Yao, John Garry, Paul Clarke, Kajol Jain, linux-kernel,
	Stephane Eranian, linux-perf-users

On Wed, Jun 10, 2020 at 04:58:22PM -0700, Ian Rogers wrote:
> d_ratio avoids division by 0 yielding infinity, such as when a counter
> doesn't get scheduled. An example usage is:
> 
> {
>     "BriefDescription": "DCache L1 misses",
>     "MetricExpr": "d_ratio(MEM_LOAD_RETIRED.L1_MISS, MEM_LOAD_RETIRED.L1_HIT + MEM_LOAD_RETIRED.L1_MISS + MEM_LOAD_RETIRED.FB_HIT)",
>     "MetricGroup": "DCache;DCache_L1",
>     "MetricName": "DCache_L1_Miss",
>     "ScaleUnit": "100%",
> }
> 
> Signed-off-by: Ian Rogers <irogers@google.com>

Acked-by: Jiri Olsa <jolsa@redhat.com>

thanks,
jirka

> ---
>  tools/perf/tests/expr.c |  2 ++
>  tools/perf/util/expr.l  |  1 +
>  tools/perf/util/expr.y  | 14 ++++++++++++--
>  3 files changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/perf/tests/expr.c b/tools/perf/tests/expr.c
> index 1cb02ca2b15f..c4877b36ab58 100644
> --- a/tools/perf/tests/expr.c
> +++ b/tools/perf/tests/expr.c
> @@ -39,6 +39,8 @@ int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
>  	ret |= test(&ctx, "1+1 if 3*4 else 0", 2);
>  	ret |= test(&ctx, "1.1 + 2.1", 3.2);
>  	ret |= test(&ctx, ".1 + 2.", 2.1);
> +	ret |= test(&ctx, "d_ratio(1, 2)", 0.5);
> +	ret |= test(&ctx, "d_ratio(2.5, 0)", 0);
>  
>  	if (ret)
>  		return ret;
> diff --git a/tools/perf/util/expr.l b/tools/perf/util/expr.l
> index f397bf8b1a48..298d86660a96 100644
> --- a/tools/perf/util/expr.l
> +++ b/tools/perf/util/expr.l
> @@ -100,6 +100,7 @@ symbol		({spec}|{sym})+
>  		}
>  	}
>  
> +d_ratio		{ return D_RATIO; }
>  max		{ return MAX; }
>  min		{ return MIN; }
>  if		{ return IF; }
> diff --git a/tools/perf/util/expr.y b/tools/perf/util/expr.y
> index bf3e898e3055..fe145344bb39 100644
> --- a/tools/perf/util/expr.y
> +++ b/tools/perf/util/expr.y
> @@ -10,6 +10,14 @@
>  #include "smt.h"
>  #include <string.h>
>  
> +static double d_ratio(double val0, double val1)
> +{
> +	if (val1 == 0) {
> +		return 0;
> +	}
> +	return  val0 / val1;
> +}
> +
>  %}
>  
>  %define api.pure full
> @@ -28,7 +36,7 @@
>  %token <num> NUMBER
>  %token <str> ID
>  %destructor { free ($$); } <str>
> -%token MIN MAX IF ELSE SMT_ON
> +%token MIN MAX IF ELSE SMT_ON D_RATIO
>  %left MIN MAX IF
>  %left '|'
>  %left '^'
> @@ -64,7 +72,8 @@ other: ID
>  }
>  |
>  MIN | MAX | IF | ELSE | SMT_ON | NUMBER | '|' | '^' | '&' | '-' | '+' | '*' | '/' | '%' | '(' | ')' | ','
> -
> +|
> +D_RATIO
>  
>  all_expr: if_expr			{ *final_val = $1; }
>  	;
> @@ -105,6 +114,7 @@ expr:	  NUMBER
>  	| MIN '(' expr ',' expr ')' { $$ = $3 < $5 ? $3 : $5; }
>  	| MAX '(' expr ',' expr ')' { $$ = $3 > $5 ? $3 : $5; }
>  	| SMT_ON		 { $$ = smt_on() > 0; }
> +	| D_RATIO '(' expr ',' expr ')' { $$ = d_ratio($3,$5); }
>  	;
>  
>  %%
> -- 
> 2.27.0.278.ge193c7cf3a9-goog
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 2/2] perf expr: Add < and > operators
  2020-06-10 23:58 ` [PATCH v2 2/2] perf expr: Add < and > operators Ian Rogers
@ 2020-06-11  8:38   ` Jiri Olsa
  0 siblings, 0 replies; 5+ messages in thread
From: Jiri Olsa @ 2020-06-11  8:38 UTC (permalink / raw)
  To: Ian Rogers
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Namhyung Kim, Andi Kleen,
	Jin Yao, John Garry, Paul Clarke, Kajol Jain, linux-kernel,
	Stephane Eranian, linux-perf-users

On Wed, Jun 10, 2020 at 04:58:23PM -0700, Ian Rogers wrote:
> These are broadly useful but required to handle TMA metrics. For
> example encoding Ports_Utilization from:
> https://download.01.org/perfmon/TMA_Metrics.csv
> requires '<'.
> 
> {
>   "BriefDescription": "This metric estimates fraction of cycles the CPU performance was potentially limited due to Core computation issues (non divider-related).  Two distinct categories can be attributed into this metric: (1) heavy data-dependency among contiguous instructions would manifest in this metric - such cases are often referred to as low Instruction Level Parallelism (ILP). (2) Contention on some hardware execution unit other than Divider. For example; when there are too many multiply operations.",
>   "MetricExpr": "( ( cpu@EXE_ACTIVITY.EXE_BOUND_0_PORTS@ + cpu@EXE_ACTIVITY.1_PORTS_UTIL@ + ( cpu@EXE_ACTIVITY.2_PORTS_UTIL@ * ( ( ( cpu@UOPS_RETIRED.RETIRE_SLOTS@ ) / ( cpu@CPU_CLK_UNHALTED.THREAD@ ) ) / ( ( 4.000000 ) + 1.000000 ) ) ) ) / ( cpu@CPU_CLK_UNHALTED.THREAD@ ) if ( cpu@ARITH.DIVIDER_ACTIVE\\,cmask\\=1@ < cpu@EXE_ACTIVITY.EXE_BOUND_0_PORTS@ ) else ( ( cpu@EXE_ACTIVITY.EXE_BOUND_0_PORTS@ + cpu@EXE_ACTIVITY.1_PORTS_UTIL@ + ( cpu@EXE_ACTIVITY.2_PORTS_UTIL@ * ( ( ( cpu@UOPS_RETIRED.RETIRE_SLOTS@ ) / ( cpu@CPU_CLK_UNHALTED.THREAD@ ) ) / ( ( 4.000000 ) + 1.000000 ) ) ) ) - cpu@EXE_ACTIVITY.EXE_BOUND_0_PORTS@ ) / ( cpu@CPU_CLK_UNHALTED.THREAD@ ) )",
>   "MetricGroup": "Topdown_Group_Ports_Utilization",
>   "MetricName": "Topdown_Metric_Ports_Utilization"
> },
> 
> Signed-off-by: Ian Rogers <irogers@google.com>

Acked-by: Jiri Olsa <jolsa@redhat.com>

thanks,
jirka

> ---
>  tools/perf/tests/expr.c | 6 ++++++
>  tools/perf/util/expr.l  | 2 ++
>  tools/perf/util/expr.y  | 5 ++++-
>  3 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/perf/tests/expr.c b/tools/perf/tests/expr.c
> index c4877b36ab58..b7e5ef3007fc 100644
> --- a/tools/perf/tests/expr.c
> +++ b/tools/perf/tests/expr.c
> @@ -41,6 +41,12 @@ int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
>  	ret |= test(&ctx, ".1 + 2.", 2.1);
>  	ret |= test(&ctx, "d_ratio(1, 2)", 0.5);
>  	ret |= test(&ctx, "d_ratio(2.5, 0)", 0);
> +	ret |= test(&ctx, "1.1 < 2.2", 1);
> +	ret |= test(&ctx, "2.2 > 1.1", 1);
> +	ret |= test(&ctx, "1.1 < 1.1", 0);
> +	ret |= test(&ctx, "2.2 > 2.2", 0);
> +	ret |= test(&ctx, "2.2 < 1.1", 0);
> +	ret |= test(&ctx, "1.1 > 2.2", 0);
>  
>  	if (ret)
>  		return ret;
> diff --git a/tools/perf/util/expr.l b/tools/perf/util/expr.l
> index 298d86660a96..13e5e3c75f56 100644
> --- a/tools/perf/util/expr.l
> +++ b/tools/perf/util/expr.l
> @@ -111,6 +111,8 @@ else		{ return ELSE; }
>  "|"		{ return '|'; }
>  "^"		{ return '^'; }
>  "&"		{ return '&'; }
> +"<"		{ return '<'; }
> +">"		{ return '>'; }
>  "-"		{ return '-'; }
>  "+"		{ return '+'; }
>  "*"		{ return '*'; }
> diff --git a/tools/perf/util/expr.y b/tools/perf/util/expr.y
> index fe145344bb39..5fcb98800f9c 100644
> --- a/tools/perf/util/expr.y
> +++ b/tools/perf/util/expr.y
> @@ -41,6 +41,7 @@ static double d_ratio(double val0, double val1)
>  %left '|'
>  %left '^'
>  %left '&'
> +%left '<' '>'
>  %left '-' '+'
>  %left '*' '/' '%'
>  %left NEG NOT
> @@ -73,7 +74,7 @@ other: ID
>  |
>  MIN | MAX | IF | ELSE | SMT_ON | NUMBER | '|' | '^' | '&' | '-' | '+' | '*' | '/' | '%' | '(' | ')' | ','
>  |
> -D_RATIO
> +'<' | '>' | D_RATIO
>  
>  all_expr: if_expr			{ *final_val = $1; }
>  	;
> @@ -94,6 +95,8 @@ expr:	  NUMBER
>  	| 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		{ $$ = $1 - $3; }
>  	| expr '*' expr		{ $$ = $1 * $3; }
> -- 
> 2.27.0.278.ge193c7cf3a9-goog
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/2] perf expr: Add d_ratio operation
  2020-06-11  8:38 ` [PATCH v2 1/2] perf expr: Add d_ratio operation Jiri Olsa
@ 2020-06-11 13:09   ` Arnaldo Carvalho de Melo
  0 siblings, 0 replies; 5+ messages in thread
From: Arnaldo Carvalho de Melo @ 2020-06-11 13:09 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Ian Rogers, Peter Zijlstra, Ingo Molnar, Mark Rutland,
	Alexander Shishkin, Namhyung Kim, Andi Kleen, Jin Yao, John Garry,
	Paul Clarke, Kajol Jain, linux-kernel, Stephane Eranian,
	linux-perf-users

Em Thu, Jun 11, 2020 at 10:38:46AM +0200, Jiri Olsa escreveu:
> On Wed, Jun 10, 2020 at 04:58:22PM -0700, Ian Rogers wrote:
> > d_ratio avoids division by 0 yielding infinity, such as when a counter
> > doesn't get scheduled. An example usage is:
> > 
> > {
> >     "BriefDescription": "DCache L1 misses",
> >     "MetricExpr": "d_ratio(MEM_LOAD_RETIRED.L1_MISS, MEM_LOAD_RETIRED.L1_HIT + MEM_LOAD_RETIRED.L1_MISS + MEM_LOAD_RETIRED.FB_HIT)",
> >     "MetricGroup": "DCache;DCache_L1",
> >     "MetricName": "DCache_L1_Miss",
> >     "ScaleUnit": "100%",
> > }
> > 
> > Signed-off-by: Ian Rogers <irogers@google.com>
> 
> Acked-by: Jiri Olsa <jolsa@redhat.com>

Thanks, applied both,

- Arnaldo
 
> thanks,
> jirka
> 
> > ---
> >  tools/perf/tests/expr.c |  2 ++
> >  tools/perf/util/expr.l  |  1 +
> >  tools/perf/util/expr.y  | 14 ++++++++++++--
> >  3 files changed, 15 insertions(+), 2 deletions(-)
> > 
> > diff --git a/tools/perf/tests/expr.c b/tools/perf/tests/expr.c
> > index 1cb02ca2b15f..c4877b36ab58 100644
> > --- a/tools/perf/tests/expr.c
> > +++ b/tools/perf/tests/expr.c
> > @@ -39,6 +39,8 @@ int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
> >  	ret |= test(&ctx, "1+1 if 3*4 else 0", 2);
> >  	ret |= test(&ctx, "1.1 + 2.1", 3.2);
> >  	ret |= test(&ctx, ".1 + 2.", 2.1);
> > +	ret |= test(&ctx, "d_ratio(1, 2)", 0.5);
> > +	ret |= test(&ctx, "d_ratio(2.5, 0)", 0);
> >  
> >  	if (ret)
> >  		return ret;
> > diff --git a/tools/perf/util/expr.l b/tools/perf/util/expr.l
> > index f397bf8b1a48..298d86660a96 100644
> > --- a/tools/perf/util/expr.l
> > +++ b/tools/perf/util/expr.l
> > @@ -100,6 +100,7 @@ symbol		({spec}|{sym})+
> >  		}
> >  	}
> >  
> > +d_ratio		{ return D_RATIO; }
> >  max		{ return MAX; }
> >  min		{ return MIN; }
> >  if		{ return IF; }
> > diff --git a/tools/perf/util/expr.y b/tools/perf/util/expr.y
> > index bf3e898e3055..fe145344bb39 100644
> > --- a/tools/perf/util/expr.y
> > +++ b/tools/perf/util/expr.y
> > @@ -10,6 +10,14 @@
> >  #include "smt.h"
> >  #include <string.h>
> >  
> > +static double d_ratio(double val0, double val1)
> > +{
> > +	if (val1 == 0) {
> > +		return 0;
> > +	}
> > +	return  val0 / val1;
> > +}
> > +
> >  %}
> >  
> >  %define api.pure full
> > @@ -28,7 +36,7 @@
> >  %token <num> NUMBER
> >  %token <str> ID
> >  %destructor { free ($$); } <str>
> > -%token MIN MAX IF ELSE SMT_ON
> > +%token MIN MAX IF ELSE SMT_ON D_RATIO
> >  %left MIN MAX IF
> >  %left '|'
> >  %left '^'
> > @@ -64,7 +72,8 @@ other: ID
> >  }
> >  |
> >  MIN | MAX | IF | ELSE | SMT_ON | NUMBER | '|' | '^' | '&' | '-' | '+' | '*' | '/' | '%' | '(' | ')' | ','
> > -
> > +|
> > +D_RATIO
> >  
> >  all_expr: if_expr			{ *final_val = $1; }
> >  	;
> > @@ -105,6 +114,7 @@ expr:	  NUMBER
> >  	| MIN '(' expr ',' expr ')' { $$ = $3 < $5 ? $3 : $5; }
> >  	| MAX '(' expr ',' expr ')' { $$ = $3 > $5 ? $3 : $5; }
> >  	| SMT_ON		 { $$ = smt_on() > 0; }
> > +	| D_RATIO '(' expr ',' expr ')' { $$ = d_ratio($3,$5); }
> >  	;
> >  
> >  %%
> > -- 
> > 2.27.0.278.ge193c7cf3a9-goog
> > 
> 

-- 

- Arnaldo

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-06-11 13:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-10 23:58 [PATCH v2 1/2] perf expr: Add d_ratio operation Ian Rogers
2020-06-10 23:58 ` [PATCH v2 2/2] perf expr: Add < and > operators Ian Rogers
2020-06-11  8:38   ` Jiri Olsa
2020-06-11  8:38 ` [PATCH v2 1/2] perf expr: Add d_ratio operation Jiri Olsa
2020-06-11 13:09   ` Arnaldo Carvalho de Melo

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.