* [PATCH 0/9] perf: Adding better precise_ip field handling @ 2013-01-26 17:27 Jiri Olsa 2013-01-26 17:27 ` [PATCH 1/9] perf x86: Add precise sysfs cpu pmu attribute Jiri Olsa ` (10 more replies) 0 siblings, 11 replies; 15+ messages in thread From: Jiri Olsa @ 2013-01-26 17:27 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern hi, adding sysfs attribute to specify the maximum allowed value for perf_event_attr::precise_ip field. Adding functionality for simple 'precise' term to get the maximum allowed value for perf_event_attr::precise_ip field. And finally adding several precise automated tests. thanks, jirka 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> --- Andi Kleen (1): perf tools: Add a precise event qualifier Jiri Olsa (8): perf x86: Add precise sysfs cpu pmu attribute perf tools: Add precise object to interface sysfs precise perf tests: Add precise event automated test perf tools: Read maximal precise value for 'precise' term perf tools: Favor 'p' modifier before 'precise' term properly perf tests: Add automated precise term test perf: Document the ABI for 'precise' sysfs attribute perf: Document the ABI for 'rdpmc' sysfs attribute Documentation/ABI/testing/sysfs-bus-event_source-cpu-precise | 10 ++++++++++ Documentation/ABI/testing/sysfs-bus-event_source-cpu-rdpmc | 8 ++++++++ arch/x86/kernel/cpu/perf_event.c | 34 +++++++++++++++++++++++--------- tools/perf/Makefile | 2 ++ tools/perf/tests/builtin-test.c | 4 ++++ tools/perf/tests/parse-events.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/tests/precise.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/tests/tests.h | 1 + tools/perf/util/parse-events.c | 38 +++++++++++++++++++++++++++++++++++- tools/perf/util/parse-events.h | 3 +++ tools/perf/util/parse-events.l | 1 + tools/perf/util/parse-events.y | 2 +- tools/perf/util/precise.c | 45 +++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/util.h | 2 ++ 14 files changed, 266 insertions(+), 11 deletions(-) ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/9] perf x86: Add precise sysfs cpu pmu attribute 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa @ 2013-01-26 17:27 ` Jiri Olsa 2013-01-26 17:27 ` [PATCH 2/9] perf tools: Add precise object to interface sysfs precise Jiri Olsa ` (9 subsequent siblings) 10 siblings, 0 replies; 15+ messages in thread From: Jiri Olsa @ 2013-01-26 17:27 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern Adding sysfs 'precise' attribute for cpu device (/sys/devices/cpu/precise) to show the maximum value for perf event precise attribute. This will be initially used for automated precise event perf test and could be helpful otherwise. TODO Arnaldo suggested to use this as a guide for default adding of precise attribute for HW events. 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> --- arch/x86/kernel/cpu/perf_event.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 6774c17..190995e 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c @@ -377,19 +377,26 @@ static inline int precise_br_compat(struct perf_event *event) return m == b; } -int x86_pmu_hw_config(struct perf_event *event) +static int x86_get_precise(void) { - if (event->attr.precise_ip) { - int precise = 0; + int precise = 0; - /* Support for constant skid */ - if (x86_pmu.pebs_active && !x86_pmu.pebs_broken) { + /* Support for constant skid */ + if (x86_pmu.pebs_active && !x86_pmu.pebs_broken) { + precise++; + + /* Support for IP fixup */ + if (x86_pmu.lbr_nr) precise++; + } - /* Support for IP fixup */ - if (x86_pmu.lbr_nr) - precise++; - } + return precise; +} + +int x86_pmu_hw_config(struct perf_event *event) +{ + if (event->attr.precise_ip) { + int precise = x86_get_precise(); if (event->attr.precise_ip > precise) return -EOPNOTSUPP; @@ -1700,6 +1707,13 @@ static int x86_pmu_event_init(struct perf_event *event) return err; } +static ssize_t get_attr_precise(struct device *cdev, + struct device_attribute *attr, + char *buf) +{ + return snprintf(buf, 10, "%d\n", x86_get_precise()); +} + static int x86_pmu_event_idx(struct perf_event *event) { int idx = event->hw.idx; @@ -1752,9 +1766,11 @@ static ssize_t set_attr_rdpmc(struct device *cdev, } static DEVICE_ATTR(rdpmc, S_IRUSR | S_IWUSR, get_attr_rdpmc, set_attr_rdpmc); +static DEVICE_ATTR(precise, S_IRUGO, get_attr_precise, NULL); static struct attribute *x86_pmu_attrs[] = { &dev_attr_rdpmc.attr, + &dev_attr_precise.attr, NULL, }; -- 1.7.11.7 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/9] perf tools: Add precise object to interface sysfs precise 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa 2013-01-26 17:27 ` [PATCH 1/9] perf x86: Add precise sysfs cpu pmu attribute Jiri Olsa @ 2013-01-26 17:27 ` Jiri Olsa 2013-01-26 17:27 ` [PATCH 3/9] perf tests: Add precise event automated test Jiri Olsa ` (8 subsequent siblings) 10 siblings, 0 replies; 15+ messages in thread From: Jiri Olsa @ 2013-01-26 17:27 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern Adding precise util object to get maximum value for perf_event_attr::precise_ip. The value is exported via sysfs file '/sys/devices/cpu/precise'. The interface is: int perf_precise__get(void) Returns: maximum value allowed for perf_event_attr::precise_ip 0 if sysfs attribute is not found (supported) -1 if we failed to read the sysfs attribute 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/Makefile | 1 + tools/perf/util/precise.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/util.h | 2 ++ 3 files changed, 48 insertions(+) create mode 100644 tools/perf/util/precise.c diff --git a/tools/perf/Makefile b/tools/perf/Makefile index a84021a..541d242 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile @@ -463,6 +463,7 @@ LIB_OBJS += $(OUTPUT)util/rblist.o LIB_OBJS += $(OUTPUT)util/intlist.o LIB_OBJS += $(OUTPUT)util/vdso.o LIB_OBJS += $(OUTPUT)util/stat.o +LIB_OBJS += $(OUTPUT)util/precise.o LIB_OBJS += $(OUTPUT)ui/setup.o LIB_OBJS += $(OUTPUT)ui/helpline.o diff --git a/tools/perf/util/precise.c b/tools/perf/util/precise.c new file mode 100644 index 0000000..d801f3e --- /dev/null +++ b/tools/perf/util/precise.c @@ -0,0 +1,45 @@ + +#include <linux/kernel.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdio.h> +#include "sysfs.h" +#include "util.h" + +/* + * Returns maximum value allowed for + * perf_event_attr::precise_ip, and: + * 0 if sysfs attribute is not found (supported) + * -1 if we failed to read the sysfs attribute + */ +int perf_precise__get(void) +{ + static int precise = -1; + struct stat st; + char path[PATH_MAX]; + + if (precise != -1) + return precise; + + scnprintf(path, PATH_MAX, "%s/devices/cpu/precise", + sysfs_find_mountpoint()); + + if (!lstat(path, &st)) { + FILE *file; + + file = fopen(path, "r"); + if (!file) + return -1; + + if (1 != fscanf(file, "%d", &precise)) + pr_debug("failed to read precise info\n"); + + fclose(file); + } else + /* Return 0 if there's no sysfs precise support. */ + precise = 0; + + + return precise; +} diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 09b4c26..6d846e9 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h @@ -275,4 +275,6 @@ extern unsigned int page_size; struct winsize; void get_term_dimensions(struct winsize *ws); +int perf_precise__get(void); + #endif -- 1.7.11.7 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/9] perf tests: Add precise event automated test 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa 2013-01-26 17:27 ` [PATCH 1/9] perf x86: Add precise sysfs cpu pmu attribute Jiri Olsa 2013-01-26 17:27 ` [PATCH 2/9] perf tools: Add precise object to interface sysfs precise Jiri Olsa @ 2013-01-26 17:27 ` Jiri Olsa 2013-01-26 17:27 ` [PATCH 4/9] perf tools: Add a precise event qualifier Jiri Olsa ` (7 subsequent siblings) 10 siblings, 0 replies; 15+ messages in thread From: Jiri Olsa @ 2013-01-26 17:27 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern The test detects the precise attribute availability and try to open perf event with each allowed precise attribute value. 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/Makefile | 1 + tools/perf/tests/builtin-test.c | 4 ++++ tools/perf/tests/precise.c | 52 +++++++++++++++++++++++++++++++++++++++++ tools/perf/tests/tests.h | 1 + 4 files changed, 58 insertions(+) create mode 100644 tools/perf/tests/precise.c diff --git a/tools/perf/Makefile b/tools/perf/Makefile index 541d242..46154f7 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile @@ -489,6 +489,7 @@ LIB_OBJS += $(OUTPUT)tests/evsel-tp-sched.o LIB_OBJS += $(OUTPUT)tests/pmu.o LIB_OBJS += $(OUTPUT)tests/hists_link.o LIB_OBJS += $(OUTPUT)tests/python-use.o +LIB_OBJS += $(OUTPUT)tests/precise.o BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o BUILTIN_OBJS += $(OUTPUT)builtin-bench.o diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c index acb98e0..c7649d7 100644 --- a/tools/perf/tests/builtin-test.c +++ b/tools/perf/tests/builtin-test.c @@ -78,6 +78,10 @@ static struct test { .func = test__python_use, }, { + .desc = "Test precise event attribute", + .func = test__precise, + }, + { .func = NULL, }, }; diff --git a/tools/perf/tests/precise.c b/tools/perf/tests/precise.c new file mode 100644 index 0000000..ef01d78 --- /dev/null +++ b/tools/perf/tests/precise.c @@ -0,0 +1,52 @@ +#include <linux/kernel.h> +#include <linux/perf_event.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include "perf.h" +#include "tests.h" +#include "util.h" +#include "sysfs.h" + +static int event_open_precise(int precise) +{ + struct perf_event_attr attr = { + .type = PERF_TYPE_HARDWARE, + .config = PERF_COUNT_HW_CPU_CYCLES, + .precise_ip = precise, + }; + int fd; + + pr_debug("open cycles event with precise %d\n", precise); + + fd = sys_perf_event_open(&attr, 0, -1, -1, 0); + if (fd < 0) { + pr_debug("failed to open event, syscall returned " + "with %d (%s)\n", fd, strerror(errno)); + return -1; + } + + close(fd); + return 0; + +} + +int test__precise(void) +{ + int precise = perf_precise__get(); + int i; + + if (!precise) { + pr_debug("no precise info or support\n"); + return TEST_SKIP; + } + + if (precise < 0) + return TEST_FAIL; + + for (i = 1; i <= precise; i++) + if (event_open_precise(i)) + return TEST_FAIL; + + return TEST_OK; +} diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h index 5de0be1..ff6db12 100644 --- a/tools/perf/tests/tests.h +++ b/tools/perf/tests/tests.h @@ -23,5 +23,6 @@ int test__dso_data(void); int test__parse_events(void); int test__hists_link(void); int test__python_use(void); +int test__precise(void); #endif /* TESTS_H */ -- 1.7.11.7 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 4/9] perf tools: Add a precise event qualifier 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa ` (2 preceding siblings ...) 2013-01-26 17:27 ` [PATCH 3/9] perf tests: Add precise event automated test Jiri Olsa @ 2013-01-26 17:27 ` Jiri Olsa 2013-01-26 17:27 ` [PATCH 5/9] perf tools: Read maximal precise value for 'precise' term Jiri Olsa ` (6 subsequent siblings) 10 siblings, 0 replies; 15+ messages in thread From: Jiri Olsa @ 2013-01-26 17:27 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern From: Andi Kleen <ak@linux.intel.com> Add a precise qualifier, like cpu/event=0x3c,precise=1/ This is needed so that the kernel can request enabling PEBS for TSX events. The parser bails out on any sysfs parse errors, so this is needed in any case to handle any event on the TSX perf kernel. Signed-off-by: Andi Kleen <ak@linux.intel.com> Cc: 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> [ nit: changed subject line a bit] Signed-off-by: Jiri Olsa <jolsa@redhat.com> --- tools/perf/util/parse-events.c | 6 ++++++ tools/perf/util/parse-events.h | 1 + tools/perf/util/parse-events.l | 1 + 3 files changed, 8 insertions(+) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 02f6421..217ce56 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -568,6 +568,12 @@ do { \ case PARSE_EVENTS__TERM_TYPE_NAME: CHECK_TYPE_VAL(STR); 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; + break; default: return -EINVAL; } diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 2cd2c42..9d526cf 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -48,6 +48,7 @@ enum { PARSE_EVENTS__TERM_TYPE_NAME, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE, + PARSE_EVENTS__TERM_TYPE_PRECISE, }; struct parse_events_term { diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index e9d1134..32a9000 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -169,6 +169,7 @@ period { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); } branch_type { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); } , { return ','; } "/" { BEGIN(INITIAL); return '/'; } +precise { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_PRECISE); } {name_minus} { return str(yyscanner, PE_NAME); } } -- 1.7.11.7 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 5/9] perf tools: Read maximal precise value for 'precise' term 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa ` (3 preceding siblings ...) 2013-01-26 17:27 ` [PATCH 4/9] perf tools: Add a precise event qualifier Jiri Olsa @ 2013-01-26 17:27 ` Jiri Olsa 2013-01-26 17:27 ` [PATCH 6/9] perf tools: Favor 'p' modifier before 'precise' term properly Jiri Olsa ` (5 subsequent siblings) 10 siblings, 0 replies; 15+ messages in thread From: Jiri Olsa @ 2013-01-26 17:27 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern 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 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 6/9] perf tools: Favor 'p' modifier before 'precise' term properly 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa ` (4 preceding siblings ...) 2013-01-26 17:27 ` [PATCH 5/9] perf tools: Read maximal precise value for 'precise' term Jiri Olsa @ 2013-01-26 17:27 ` Jiri Olsa 2013-01-26 17:27 ` [PATCH 7/9] perf tests: Add automated precise term test Jiri Olsa ` (4 subsequent siblings) 10 siblings, 0 replies; 15+ messages in thread From: Jiri Olsa @ 2013-01-26 17:27 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern The 'p' event modifier is stronger than setting precise_ip using the 'precise' term, like: 'cpu/cycles,precise/' - precise_ip = sysfs precise value 'cpu/cycles,precise/p' - precise_ip = 1 There's currently bug if the event modifier without 'p' is specified the precise_ip is set to zero, like: 'cpu/cycles,precise/u' - precise_ip = 0 This patch makes sure that the precise_ip value is overwritten only if any 'p' event modifier is specified, like: 'cpu/cycles,precise/u' - precise_ip = sysfs precise value 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index a92c403..83362f2 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -818,7 +818,14 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add) evsel->attr.exclude_user = mod.eu; evsel->attr.exclude_kernel = mod.ek; evsel->attr.exclude_hv = mod.eh; - evsel->attr.precise_ip = mod.precise; + + /* + * Change precise only if it's defined, so we don't + * overwrite 'precise' term if there's no 'p' modifier. + */ + if (mod.precise) + evsel->attr.precise_ip = mod.precise; + evsel->attr.exclude_host = mod.eH; evsel->attr.exclude_guest = mod.eG; evsel->exclude_GH = mod.exclude_GH; -- 1.7.11.7 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 7/9] perf tests: Add automated precise term test 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa ` (5 preceding siblings ...) 2013-01-26 17:27 ` [PATCH 6/9] perf tools: Favor 'p' modifier before 'precise' term properly Jiri Olsa @ 2013-01-26 17:27 ` Jiri Olsa 2013-01-26 17:27 ` [PATCH 8/9] perf: Document the ABI for 'precise' sysfs attribute Jiri Olsa ` (3 subsequent siblings) 10 siblings, 0 replies; 15+ messages in thread From: Jiri Olsa @ 2013-01-26 17:27 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern Adding automated test for precise term test in event: 'cpu/cycles,precise/' 'cpu/cycles,precise/p' 'cpu/cycles,precise/u' to check proper values of precise_ip driven by sysfs precise attribute. 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/tests/parse-events.c | 75 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c index 20acaff..f92580d 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c @@ -5,6 +5,7 @@ #include "sysfs.h" #include "debugfs.h" #include "tests.h" +#include "util.h" #include <linux/hw_breakpoint.h> #define TEST_ASSERT_VAL(text, cond) \ @@ -445,6 +446,68 @@ static int test__checkevent_pmu_name(struct perf_evlist *evlist) return 0; } +static int test__checkevent_pmu_precise(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = perf_evlist__first(evlist); + + /* cpu/cycles,precise/ */ + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); + TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest); + TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); + /* precise is driven by sysfs precise attribute */ + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == perf_precise__get()); + TEST_ASSERT_VAL("wrong group name", !evsel->group_name); + TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); + + return 0; +} + +static int test__checkevent_pmu_precise1(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = perf_evlist__first(evlist); + + /* cpu/cycles,precise/p */ + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); + TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest); + TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); + /* precise is driven by 'p' modifier */ + TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 1); + TEST_ASSERT_VAL("wrong group name", !evsel->group_name); + TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); + + return 0; +} + +static int test__checkevent_pmu_precise2(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = perf_evlist__first(evlist); + + /* cpu/cycles,precise/u */ + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); + TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest); + TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); + /* precise is driven by sysfs precise attribute */ + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == perf_precise__get()); + TEST_ASSERT_VAL("wrong group name", !evsel->group_name); + TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); + + return 0; +} + static int test__checkevent_pmu_events(struct perf_evlist *evlist) { struct perf_evsel *evsel; @@ -994,6 +1057,18 @@ static struct evlist_test test__events_pmu[] = { .name = "cpu/config=1,name=krava/u,cpu/config=2/u", .check = test__checkevent_pmu_name, }, + [2] = { + .name = "cpu/cycles,precise/", + .check = test__checkevent_pmu_precise, + }, + [3] = { + .name = "cpu/cycles,precise/p", + .check = test__checkevent_pmu_precise1, + }, + [4] = { + .name = "cpu/cycles,precise/u", + .check = test__checkevent_pmu_precise2, + }, }; struct terms_test { -- 1.7.11.7 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 8/9] perf: Document the ABI for 'precise' sysfs attribute 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa ` (6 preceding siblings ...) 2013-01-26 17:27 ` [PATCH 7/9] perf tests: Add automated precise term test Jiri Olsa @ 2013-01-26 17:27 ` Jiri Olsa 2013-01-26 17:27 ` [PATCH 9/9] perf: Document the ABI for 'rdpmc' " Jiri Olsa ` (2 subsequent siblings) 10 siblings, 0 replies; 15+ messages in thread From: Jiri Olsa @ 2013-01-26 17:27 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern Adding ABI documentation for newly added 'precise' sysfs attribute. It's added under the testing section. 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> --- .../ABI/testing/sysfs-bus-event_source-devices-cpu-precise | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-precise diff --git a/Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-precise b/Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-precise new file mode 100644 index 0000000..f3ed378 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-precise @@ -0,0 +1,10 @@ +Where: /sys/bus/event_source/devices/cpu/precise +Date: January 2013 +Kernel Version: 3.7 +Contact: Jiri Olsa <jolsa@redhat.com> + Linux kernel mailing list <linux-kernel@vger.kernel.org> +Description: + X86 specific attribute + + Attribute to specify the maximum allowed value + for perf_event_attr:precise_ip field. -- 1.7.11.7 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 9/9] perf: Document the ABI for 'rdpmc' sysfs attribute 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa ` (7 preceding siblings ...) 2013-01-26 17:27 ` [PATCH 8/9] perf: Document the ABI for 'precise' sysfs attribute Jiri Olsa @ 2013-01-26 17:27 ` Jiri Olsa 2013-01-26 18:53 ` [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa 2013-01-27 12:41 ` Ingo Molnar 10 siblings, 0 replies; 15+ messages in thread From: Jiri Olsa @ 2013-01-26 17:27 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern Adding ABI documentation for newly added 'rdpmc' sysfs attribute. It's added under the testing section. 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> --- .../ABI/testing/sysfs-bus-event_source-devices-cpu-rdpmc | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-rdpmc diff --git a/Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-rdpmc b/Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-rdpmc new file mode 100644 index 0000000..b4f5cbf --- /dev/null +++ b/Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-rdpmc @@ -0,0 +1,8 @@ +Where: /sys/bus/event_source/devices/cpu/rdpmc +Date: January 2013 +Kernel Version: 3.7 +Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org> +Description: + X86 specific attribute + + Attribute to enable/disable user space RDPMC instruction. -- 1.7.11.7 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 0/9] perf: Adding better precise_ip field handling 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa ` (8 preceding siblings ...) 2013-01-26 17:27 ` [PATCH 9/9] perf: Document the ABI for 'rdpmc' " Jiri Olsa @ 2013-01-26 18:53 ` Jiri Olsa 2013-01-27 12:41 ` Ingo Molnar 10 siblings, 0 replies; 15+ messages in thread From: Jiri Olsa @ 2013-01-26 18:53 UTC (permalink / raw) To: linux-kernel Cc: Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern On Sat, Jan 26, 2013 at 06:27:46PM +0100, Jiri Olsa wrote: > hi, > adding sysfs attribute to specify the maximum allowed value > for perf_event_attr::precise_ip field. > > Adding functionality for simple 'precise' term to get the > maximum allowed value for perf_event_attr::precise_ip field. > > And finally adding several precise automated tests. Available also at: git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/linux.git perf/precise3 jirka ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 0/9] perf: Adding better precise_ip field handling 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa ` (9 preceding siblings ...) 2013-01-26 18:53 ` [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa @ 2013-01-27 12:41 ` Ingo Molnar 2013-01-27 12:57 ` Jiri Olsa 10 siblings, 1 reply; 15+ messages in thread From: Ingo Molnar @ 2013-01-27 12:41 UTC (permalink / raw) To: Jiri Olsa Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern * Jiri Olsa <jolsa@redhat.com> wrote: > hi, > adding sysfs attribute to specify the maximum allowed value > for perf_event_attr::precise_ip field. > > Adding functionality for simple 'precise' term to get the > maximum allowed value for perf_event_attr::precise_ip field. > > And finally adding several precise automated tests. Ok - could we please as a next step turn on cycles:pp as the default in all the profiling tools (perf record, perf top), transparently? I.e. if the CPU supports it then use it, if not then don't complain, just use the highest grade profiling method available. Thanks, Ingo ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 0/9] perf: Adding better precise_ip field handling 2013-01-27 12:41 ` Ingo Molnar @ 2013-01-27 12:57 ` Jiri Olsa 2013-01-27 13:02 ` Ingo Molnar 0 siblings, 1 reply; 15+ messages in thread From: Jiri Olsa @ 2013-01-27 12:57 UTC (permalink / raw) To: Ingo Molnar Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern On Sun, Jan 27, 2013 at 01:41:33PM +0100, Ingo Molnar wrote: > > * Jiri Olsa <jolsa@redhat.com> wrote: > > > hi, > > adding sysfs attribute to specify the maximum allowed value > > for perf_event_attr::precise_ip field. > > > > Adding functionality for simple 'precise' term to get the > > maximum allowed value for perf_event_attr::precise_ip field. > > > > And finally adding several precise automated tests. > > Ok - could we please as a next step turn on cycles:pp as the > default in all the profiling tools (perf record, perf top), > transparently? I.e. if the CPU supports it then use it, if not > then don't complain, just use the highest grade profiling method > available. yep, we discussed with Arnaldo this would be good to have jirka ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 0/9] perf: Adding better precise_ip field handling 2013-01-27 12:57 ` Jiri Olsa @ 2013-01-27 13:02 ` Ingo Molnar 0 siblings, 0 replies; 15+ messages in thread From: Ingo Molnar @ 2013-01-27 13:02 UTC (permalink / raw) To: Jiri Olsa Cc: linux-kernel, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern * Jiri Olsa <jolsa@redhat.com> wrote: > On Sun, Jan 27, 2013 at 01:41:33PM +0100, Ingo Molnar wrote: > > > > * Jiri Olsa <jolsa@redhat.com> wrote: > > > > > hi, > > > adding sysfs attribute to specify the maximum allowed value > > > for perf_event_attr::precise_ip field. > > > > > > Adding functionality for simple 'precise' term to get the > > > maximum allowed value for perf_event_attr::precise_ip field. > > > > > > And finally adding several precise automated tests. > > > > Ok - could we please as a next step turn on cycles:pp as the > > default in all the profiling tools (perf record, perf top), > > transparently? I.e. if the CPU supports it then use it, if not > > then don't complain, just use the highest grade profiling method > > available. > > yep, we discussed with Arnaldo this would be good to have This would be a high-profile, user visible improvement to profiling quality. Thanks, Ingo ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 0/9] perf: Adding better precise_ip field handling @ 2013-05-09 13:32 Jiri Olsa 2013-05-09 13:32 ` [PATCH 7/9] perf tests: Add automated precise term test Jiri Olsa 0 siblings, 1 reply; 15+ messages in thread From: Jiri Olsa @ 2013-05-09 13:32 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern, Stephane Eranian hi, adding sysfs attribute to specify the maximum allowed value for perf_event_attr::precise_ip field. Adding functionality for simple 'p' modifier and 'precise' term to get the maximum allowed value for perf_event_attr::precise_ip field. Following events: -e 'cycles:p' -e 'cpu/cycles,precise/' get maximum allowed value for perf_event_attr::precise_ip field. Following event: -e 'cycles:pp' -e 'cpu/cycles,precise=2/' get perf_event_attr::precise_ip == 2. If precise is disabled completely (sysfs precise == 0), we display warning and continue with standard non-PEBS event. If precise attribute is not supported '1' is used as current default. Adding automated test to test precise event could be properly created (if sysfs precise is supported). And customizing parsing tests with precise modifier. Updating Documentation/ABI with 'precise' attribute and also forgotten 'rdpmc' attribute. thanks, jirka 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> Cc: Stephane Eranian <eranian@google.com> --- Andi Kleen (1): perf tools: Add a precise event qualifier Jiri Olsa (8): perf x86: Add precise sysfs cpu pmu attribute perf tools: Add precise object to interface sysfs precise perf tests: Add precise event automated test perf tools: Set maximum precise value for event 'p' modifier perf tools: Set maximum precise value for 'precise' term perf tests: Add automated precise term test perf: Document the ABI for 'precise' sysfs attribute perf: Document the ABI for 'rdpmc' sysfs attribute Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-precise | 10 ++++ Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-rdpmc | 8 +++ arch/x86/kernel/cpu/perf_event.c | 34 +++++++++---- tools/perf/Makefile | 2 + tools/perf/tests/builtin-test.c | 4 ++ tools/perf/tests/parse-events.c | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- tools/perf/tests/precise.c | 49 ++++++++++++++++++ tools/perf/tests/tests.h | 1 + tools/perf/util/parse-events.c | 69 ++++++++++++++++++++++++- tools/perf/util/parse-events.h | 3 ++ tools/perf/util/parse-events.l | 1 + tools/perf/util/parse-events.y | 2 +- tools/perf/util/precise.c | 44 ++++++++++++++++ tools/perf/util/util.h | 3 ++ 14 files changed, 379 insertions(+), 21 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-precise create mode 100644 Documentation/ABI/testing/sysfs-bus-event_source-devices-cpu-rdpmc create mode 100644 tools/perf/tests/precise.c create mode 100644 tools/perf/util/precise.c ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 7/9] perf tests: Add automated precise term test 2013-05-09 13:32 Jiri Olsa @ 2013-05-09 13:32 ` Jiri Olsa 0 siblings, 0 replies; 15+ messages in thread From: Jiri Olsa @ 2013-05-09 13:32 UTC (permalink / raw) To: linux-kernel Cc: Jiri Olsa, Corey Ashford, Frederic Weisbecker, Ingo Molnar, Namhyung Kim, Paul Mackerras, Peter Zijlstra, Arnaldo Carvalho de Melo, Andi Kleen, David Ahern, Stephane Eranian Adding automated test for precise term test in event: 'cpu/config=1,precise/' 'cpu/config=2,precise/p' 'cpu/config=3,precise/u' 'instructions:p' 'instructions:pp' to check proper values of precise_ip driven by sysfs precise attribute. Also changing other precise related testcases to follow new precise sysfs rules. 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> Cc: Stephane Eranian <eranian@google.com> --- tools/perf/tests/parse-events.c | 170 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 161 insertions(+), 9 deletions(-) diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c index f75328c..3b2e21c 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c @@ -5,6 +5,7 @@ #include "sysfs.h" #include <lk/debugfs.h> #include "tests.h" +#include "util.h" #include <linux/hw_breakpoint.h> #define TEST_ASSERT_VAL(text, cond) \ @@ -18,6 +19,21 @@ do { \ #define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \ PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD) +static int get_precise(void) +{ + int precise = perf_precise__get(); + + /* + * The sysfs precise attribute is not supported, + * fill in the 1 as default, check + * util/parse-events.c::precise_default function + */ + if (precise == -1) + precise = 1; + + return precise; +} + static int test__checkevent_tracepoint(struct perf_evlist *evlist) { struct perf_evsel *evsel = perf_evlist__first(evlist); @@ -228,7 +244,8 @@ static int test__checkevent_raw_modifier(struct perf_evlist *evlist) TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); - TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); return test__checkevent_raw(evlist); } @@ -240,7 +257,8 @@ static int test__checkevent_numeric_modifier(struct perf_evlist *evlist) TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); - TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); return test__checkevent_numeric(evlist); } @@ -296,7 +314,8 @@ static int test__checkevent_genhw_modifier(struct perf_evlist *evlist) TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); - TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); return test__checkevent_genhw(evlist); } @@ -337,7 +356,8 @@ static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist) TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); - TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); TEST_ASSERT_VAL("wrong name", !strcmp(perf_evsel__name(evsel), "mem:0:r:hp")); @@ -351,7 +371,8 @@ static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist) TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); - TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); TEST_ASSERT_VAL("wrong name", !strcmp(perf_evsel__name(evsel), "mem:0:w:up")); @@ -365,7 +386,8 @@ static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist) TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); - TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); TEST_ASSERT_VAL("wrong name", !strcmp(perf_evsel__name(evsel), "mem:0:rw:kp")); @@ -421,7 +443,8 @@ static int test__checkevent_list(struct perf_evlist *evlist) TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user); TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); - TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip); + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); return 0; } @@ -447,6 +470,69 @@ static int test__checkevent_pmu_name(struct perf_evlist *evlist) return 0; } +static int test__checkevent_pmu_precise(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = perf_evlist__first(evlist); + + /* cpu/cycles,precise/ */ + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config); + TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest); + TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); + /* precise is driven by sysfs precise attribute */ + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); + TEST_ASSERT_VAL("wrong group name", !evsel->group_name); + TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); + + return 0; +} + +static int test__checkevent_pmu_precise1(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = perf_evlist__first(evlist); + + /* cpu/cycles,precise/p */ + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + TEST_ASSERT_VAL("wrong config", 2 == evsel->attr.config); + TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest); + TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); + /* precise is driven by 'p' modifier */ + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); + TEST_ASSERT_VAL("wrong group name", !evsel->group_name); + TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); + + return 0; +} + +static int test__checkevent_pmu_precise2(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = perf_evlist__first(evlist); + + /* cpu/cycles,precise/u */ + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + TEST_ASSERT_VAL("wrong config", 3 == evsel->attr.config); + TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest); + TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); + /* precise is driven by sysfs precise attribute */ + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); + TEST_ASSERT_VAL("wrong group name", !evsel->group_name); + TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); + + return 0; +} + static int test__checkevent_pmu_events(struct perf_evlist *evlist) { struct perf_evsel *evsel; @@ -714,7 +800,8 @@ static int test__group4(struct perf_evlist *evlist __maybe_unused) /* use of precise requires exclude_guest */ TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest); TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); - TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 1); + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); TEST_ASSERT_VAL("wrong group name", !evsel->group_name); TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); @@ -732,7 +819,8 @@ static int test__group4(struct perf_evlist *evlist __maybe_unused) /* use of precise requires exclude_guest */ TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest); TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); - TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2); + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1); TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read); @@ -1078,6 +1166,50 @@ static int test__leader_sample2(struct perf_evlist *evlist __maybe_unused) return 0; } +static int test__precise_default1(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel, *leader; + + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + + /* instructions:p - default precise_ip value */ + evsel = leader = perf_evlist__first(evlist); + TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); + TEST_ASSERT_VAL("wrong config", + PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config); + TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest); + TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == get_precise()); + + return 0; +} + +static int test__precise_default2(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel, *leader; + + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + + /* instructions:pp - precise_ip == 2 */ + evsel = leader = perf_evlist__first(evlist); + TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); + TEST_ASSERT_VAL("wrong config", + PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config); + TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user); + TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel); + TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv); + TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest); + TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); + TEST_ASSERT_VAL("wrong precise_ip", + evsel->attr.precise_ip == 2); + + return 0; +} + static int count_tracepoints(void) { char events_path[PATH_MAX]; @@ -1302,6 +1434,14 @@ static struct evlist_test test__events[] = { .name = "{instructions,branch-misses}:Su", .check = test__leader_sample2, }, + [40] = { + .name = "instructions:p", + .check = test__precise_default1, + }, + [41] = { + .name = "instructions:pp", + .check = test__precise_default2, + }, }; static struct evlist_test test__events_pmu[] = { @@ -1313,6 +1453,18 @@ static struct evlist_test test__events_pmu[] = { .name = "cpu/config=1,name=krava/u,cpu/config=2/u", .check = test__checkevent_pmu_name, }, + [2] = { + .name = "cpu/config=1,precise/", + .check = test__checkevent_pmu_precise, + }, + [3] = { + .name = "cpu/config=2,precise/p", + .check = test__checkevent_pmu_precise1, + }, + [4] = { + .name = "cpu/config=3,precise/u", + .check = test__checkevent_pmu_precise2, + }, }; struct terms_test { -- 1.7.11.7 ^ permalink raw reply related [flat|nested] 15+ messages in thread
end of thread, other threads:[~2013-05-09 13:33 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-01-26 17:27 [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa 2013-01-26 17:27 ` [PATCH 1/9] perf x86: Add precise sysfs cpu pmu attribute Jiri Olsa 2013-01-26 17:27 ` [PATCH 2/9] perf tools: Add precise object to interface sysfs precise Jiri Olsa 2013-01-26 17:27 ` [PATCH 3/9] perf tests: Add precise event automated test Jiri Olsa 2013-01-26 17:27 ` [PATCH 4/9] perf tools: Add a precise event qualifier Jiri Olsa 2013-01-26 17:27 ` [PATCH 5/9] perf tools: Read maximal precise value for 'precise' term Jiri Olsa 2013-01-26 17:27 ` [PATCH 6/9] perf tools: Favor 'p' modifier before 'precise' term properly Jiri Olsa 2013-01-26 17:27 ` [PATCH 7/9] perf tests: Add automated precise term test Jiri Olsa 2013-01-26 17:27 ` [PATCH 8/9] perf: Document the ABI for 'precise' sysfs attribute Jiri Olsa 2013-01-26 17:27 ` [PATCH 9/9] perf: Document the ABI for 'rdpmc' " Jiri Olsa 2013-01-26 18:53 ` [PATCH 0/9] perf: Adding better precise_ip field handling Jiri Olsa 2013-01-27 12:41 ` Ingo Molnar 2013-01-27 12:57 ` Jiri Olsa 2013-01-27 13:02 ` Ingo Molnar -- strict thread matches above, loose matches on Subject: below -- 2013-05-09 13:32 Jiri Olsa 2013-05-09 13:32 ` [PATCH 7/9] perf tests: Add automated precise term test Jiri Olsa
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).