Skip to content

Commit

Permalink
perf stat: Fail more clearly when an invalid modifier is specified
Browse files Browse the repository at this point in the history
Currently we fail without printing any error message on "perf stat -e task-clock-msecs".

The reason is that the task-clock event is matched and the "-msecs" postfix is assumed
to be an event modifier - but is not recognized.

This patch changes the code to be more informative:

 $ perf stat -e task-clock-msecs true
 invalid event modifier: '-msecs'
 Run 'perf list' for a list of valid events and modifiers

And restructures the return value of parse_event_modifier() to allow
the printing of all variants of invalid event modifiers.

Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Link: http://lkml.kernel.org/n/tip-wlaw3dvz1ly6wple8l52cfca@git.kernel.org
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Ingo Molnar committed Apr 26, 2011
1 parent b908deb commit ceb53fb
Showing 1 changed file with 22 additions and 11 deletions.
33 changes: 22 additions & 11 deletions tools/perf/util/parse-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -721,15 +721,19 @@ parse_numeric_event(const char **strp, struct perf_event_attr *attr)
return EVT_FAILED;
}

static enum event_result
static int
parse_event_modifier(const char **strp, struct perf_event_attr *attr)
{
const char *str = *strp;
int exclude = 0;
int eu = 0, ek = 0, eh = 0, precise = 0;

if (*str++ != ':')
if (!*str)
return 0;

if (*str++ != ':')
return -1;

while (*str) {
if (*str == 'u') {
if (!exclude)
Expand All @@ -750,14 +754,16 @@ parse_event_modifier(const char **strp, struct perf_event_attr *attr)

++str;
}
if (str >= *strp + 2) {
*strp = str;
attr->exclude_user = eu;
attr->exclude_kernel = ek;
attr->exclude_hv = eh;
attr->precise_ip = precise;
return 1;
}
if (str < *strp + 2)
return -1;

*strp = str;

attr->exclude_user = eu;
attr->exclude_kernel = ek;
attr->exclude_hv = eh;
attr->precise_ip = precise;

return 0;
}

Expand Down Expand Up @@ -800,7 +806,12 @@ parse_event_symbols(const struct option *opt, const char **str,
return EVT_FAILED;

modifier:
parse_event_modifier(str, attr);
if (parse_event_modifier(str, attr) < 0) {
fprintf(stderr, "invalid event modifier: '%s'\n", *str);
fprintf(stderr, "Run 'perf list' for a list of valid events and modifiers\n");

return EVT_FAILED;
}

return ret;
}
Expand Down

0 comments on commit ceb53fb

Please sign in to comment.