Skip to content

Commit

Permalink
perf tools: Dedup events in expression parsing
Browse files Browse the repository at this point in the history
Avoid adding redundant events while parsing an expression.  When we add
an "other" event check first if it already exists.

v2: Fix perf test failure.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20170811232634.30465-10-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Andi Kleen authored and Arnaldo Carvalho de Melo committed Aug 22, 2017
1 parent 8d3db2b commit d66dccd
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion tools/perf/util/expr.y
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,19 @@ void expr__ctx_init(struct parse_ctx *ctx)
ctx->num_ids = 0;
}

static bool already_seen(const char *val, const char *one, const char **other,
int num_other)
{
int i;

if (one && !strcasecmp(one, val))
return true;
for (i = 0; i < num_other; i++)
if (!strcasecmp(other[i], val))
return true;
return false;
}

int expr__find_other(const char *p, const char *one, const char ***other,
int *num_otherp)
{
Expand All @@ -200,7 +213,7 @@ int expr__find_other(const char *p, const char *one, const char ***other,
err = 0;
break;
}
if (tok == ID && (!one || strcasecmp(one, val.id))) {
if (tok == ID && !already_seen(val.id, one, *other, num_other)) {
if (num_other >= EXPR_MAX_OTHER - 1) {
pr_debug("Too many extra events in %s\n", orig);
break;
Expand Down

0 comments on commit d66dccd

Please sign in to comment.