Messages in this thread Patch in this message | | | From | Jiri Olsa <> | Subject | [PATCH 5/9] perf tools: Read maximal precise value for 'precise' term | Date | Sat, 26 Jan 2013 18:27:51 +0100 |
| |
Currently if the term is specified without any value like -e 'cpu/...,precise,../', the number '1' is assigned as its default value.
Adding special treatment for 'precise' term to use the maximum allowed precise value in such case using the perf_precise__get function.
Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: David Ahern <dsahern@gmail.com> --- tools/perf/util/parse-events.c | 29 ++++++++++++++++++++++++++--- tools/perf/util/parse-events.h | 2 ++ tools/perf/util/parse-events.y | 2 +- 3 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 217ce56..a92c403 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -570,9 +570,14 @@ do { \ break; case PARSE_EVENTS__TERM_TYPE_PRECISE: CHECK_TYPE_VAL(NUM); - if ((unsigned)term->val.num > 2) - return -EINVAL; - attr->precise_ip = term->val.num; + /* No value specified, try to get it from sysfs. */ + if (term->val.num == (u64) -1) + attr->precise_ip = perf_precise__get(); + else { + if ((unsigned)term->val.num > 2) + return -EINVAL; + attr->precise_ip = term->val.num; + } break; default: return -EINVAL; @@ -1210,6 +1215,24 @@ int parse_events_term__num(struct parse_events_term **term, config, NULL, num); } +int parse_events_term__num_default(struct parse_events_term **term, + int type_term, char *config) +{ + /* + * If no value is specified for term, we use 1 as default. + * The PRECISE term is an exception, because we force special + * functionality when there's no value specified for it, + * so we need to recognize it. + */ + u64 num = 1; + + if (type_term == PARSE_EVENTS__TERM_TYPE_PRECISE) + num = (u64) -1; + + return new_term(term, PARSE_EVENTS__TERM_TYPE_NUM, type_term, + config, NULL, num); +} + int parse_events_term__str(struct parse_events_term **term, int type_term, char *config, char *str) { diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 9d526cf..a5c6d65 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -74,6 +74,8 @@ struct parse_events_terms { int parse_events__is_hardcoded_term(struct parse_events_term *term); int parse_events_term__num(struct parse_events_term **_term, int type_term, char *config, u64 num); +int parse_events_term__num_default(struct parse_events_term **term, + int type_term, char *config); int parse_events_term__str(struct parse_events_term **_term, int type_term, char *config, char *str); int parse_events_term__sym_hw(struct parse_events_term **term, diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 9d43c86..376e9b4 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -399,7 +399,7 @@ PE_TERM { struct parse_events_term *term; - ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1)); + ABORT_ON(parse_events_term__num_default(&term, (int)$1, NULL)); $$ = term; } -- 1.7.11.7
| |