perf stat: Fail more clearly when an invalid modifier is specified
Commit-ID: ceb53fbf6dbb1df26d38379a262c6981fe73dd36 Gitweb: http://git.kernel.org/tip/ceb53fbf6dbb1df26d38379a262c6981fe73dd36 Author: Ingo Molnar <[email protected]> AuthorDate: Wed, 27 Apr 2011 04:06:33 +0200 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 26 Apr 2011 20:04:55 +0200
perf stat: Fail more clearly when an invalid modifier is specified
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 <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Signed-off-by Ingo Molnar <[email protected]>
--- tools/perf/util/parse-events.c | 33 ++++++++++++++++++++++----------- 1 files changed, 22 insertions(+), 11 deletions(-)
tools/perf/util/parse-events.c +22 -11
@@ -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)
@@ -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 ; }
@@ -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; }