* [PATCH] perf: fix wrong hw_breakpoint documentation @ 2012-06-27 8:39 Jovi Zhang 2012-06-27 8:59 ` Namhyung Kim 0 siblings, 1 reply; 18+ messages in thread From: Jovi Zhang @ 2012-06-27 8:39 UTC (permalink / raw) To: Arnaldo Carvalho de Melo, mingo, Peter Zijlstra, LKML; +Cc: jovi zhang >From f5f9c3a064482cf3d0fb7ed788c66630bddbfc79 Mon Sep 17 00:00:00 2001 From: Jovi Zhang <bookjovi@gmail.com> Date: Wed, 27 Jun 2012 16:09:21 +0800 Subject: [PATCH] perf: fix wrong hw_breakpoint documentation read-write access hw_breakpoint event is passed as 'mem:addr', 'mem:0x1000:rw' is parsed as invalid argument currently. Signed-off-by: Jovi Zhang <bookjovi@gmail.com> --- tools/perf/Documentation/perf-record.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt index b38a1f9..f9321b3 100644 --- a/tools/perf/Documentation/perf-record.txt +++ b/tools/perf/Documentation/perf-record.txt @@ -38,7 +38,7 @@ OPTIONS Access is the memory access type (read, write, execute) it can be passed as follows: '\mem:addr[:[r][w][x]]'. If you want to profile read-write accesses in 0x1000, just set - 'mem:0x1000:rw'. + 'mem:0x1000'. --filter=<filter>:: Event filter. -- 1.7.9.7 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH] perf: fix wrong hw_breakpoint documentation 2012-06-27 8:39 [PATCH] perf: fix wrong hw_breakpoint documentation Jovi Zhang @ 2012-06-27 8:59 ` Namhyung Kim 2012-06-27 13:40 ` Jovi Zhang 2012-06-27 16:15 ` Arnaldo Carvalho de Melo 0 siblings, 2 replies; 18+ messages in thread From: Namhyung Kim @ 2012-06-27 8:59 UTC (permalink / raw) To: Jovi Zhang; +Cc: Arnaldo Carvalho de Melo, mingo, Peter Zijlstra, LKML Hi, Jovi On Wed, 27 Jun 2012 16:39:19 +0800, Jovi Zhang wrote: > From f5f9c3a064482cf3d0fb7ed788c66630bddbfc79 Mon Sep 17 00:00:00 2001 > From: Jovi Zhang <bookjovi@gmail.com> > Date: Wed, 27 Jun 2012 16:09:21 +0800 > Subject: [PATCH] perf: fix wrong hw_breakpoint documentation > > read-write access hw_breakpoint event is passed as 'mem:addr', > 'mem:0x1000:rw' is parsed as invalid argument currently. > It should be a bug in event parser. I guess the patch below will fix it: diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 488362e14133..aafca33a8a09 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -76,7 +76,7 @@ num_hex 0x[a-fA-F0-9]+ num_raw_hex [a-fA-F0-9]+ name [a-zA-Z_*?][a-zA-Z0-9_*?]* modifier_event [ukhpGH]{1,8} -modifier_bp [rwx] +modifier_bp [rwx]+ %% ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH] perf: fix wrong hw_breakpoint documentation 2012-06-27 8:59 ` Namhyung Kim @ 2012-06-27 13:40 ` Jovi Zhang 2012-06-27 16:15 ` Arnaldo Carvalho de Melo 1 sibling, 0 replies; 18+ messages in thread From: Jovi Zhang @ 2012-06-27 13:40 UTC (permalink / raw) To: Namhyung Kim; +Cc: Arnaldo Carvalho de Melo, mingo, Peter Zijlstra, LKML Hi Kim, > It should be a bug in event parser. I guess the patch below will fix it: > > > diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l > index 488362e14133..aafca33a8a09 100644 > --- a/tools/perf/util/parse-events.l > +++ b/tools/perf/util/parse-events.l > @@ -76,7 +76,7 @@ num_hex 0x[a-fA-F0-9]+ > num_raw_hex [a-fA-F0-9]+ > name [a-zA-Z_*?][a-zA-Z0-9_*?]* > modifier_event [ukhpGH]{1,8} > -modifier_bp [rwx] > +modifier_bp [rwx]+ > that should also be fine, but it will export rx/wx interface to user, and rx/wx mostly not supported on many architecture. Perhaps this issue is very tiny :) [root@jovi perf]# ./perf stat -e mem:0x080652c8:rx -e mem:0x0 -- /usr/bin/ls > /dev/null Performance counter stats for '/usr/bin/ls': <not supported> mem:0x80652c8:rx 0 mem:(nil):rw 0.006728643 seconds time elapsed ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] perf: fix wrong hw_breakpoint documentation 2012-06-27 8:59 ` Namhyung Kim 2012-06-27 13:40 ` Jovi Zhang @ 2012-06-27 16:15 ` Arnaldo Carvalho de Melo 2012-06-27 19:07 ` Jiri Olsa 1 sibling, 1 reply; 18+ messages in thread From: Arnaldo Carvalho de Melo @ 2012-06-27 16:15 UTC (permalink / raw) To: Jiri Olsa; +Cc: Namhyung Kim, Jovi Zhang, mingo, Peter Zijlstra, LKML Em Wed, Jun 27, 2012 at 05:59:34PM +0900, Namhyung Kim escreveu: > Hi, Jovi > > On Wed, 27 Jun 2012 16:39:19 +0800, Jovi Zhang wrote: > > From f5f9c3a064482cf3d0fb7ed788c66630bddbfc79 Mon Sep 17 00:00:00 2001 > > From: Jovi Zhang <bookjovi@gmail.com> > > Date: Wed, 27 Jun 2012 16:09:21 +0800 > > Subject: [PATCH] perf: fix wrong hw_breakpoint documentation > > > > read-write access hw_breakpoint event is passed as 'mem:addr', > > 'mem:0x1000:rw' is parsed as invalid argument currently. > > > > It should be a bug in event parser. I guess the patch below will fix it: Jiri, Ack? If so, Namhyung, can you send a patch with his Ack? - Arnaldo > > diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l > index 488362e14133..aafca33a8a09 100644 > --- a/tools/perf/util/parse-events.l > +++ b/tools/perf/util/parse-events.l > @@ -76,7 +76,7 @@ num_hex 0x[a-fA-F0-9]+ > num_raw_hex [a-fA-F0-9]+ > name [a-zA-Z_*?][a-zA-Z0-9_*?]* > modifier_event [ukhpGH]{1,8} > -modifier_bp [rwx] > +modifier_bp [rwx]+ > > %% > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] perf: fix wrong hw_breakpoint documentation 2012-06-27 16:15 ` Arnaldo Carvalho de Melo @ 2012-06-27 19:07 ` Jiri Olsa 2012-06-27 19:58 ` Peter Zijlstra 0 siblings, 1 reply; 18+ messages in thread From: Jiri Olsa @ 2012-06-27 19:07 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: Namhyung Kim, Jovi Zhang, mingo, Peter Zijlstra, LKML On Wed, Jun 27, 2012 at 01:15:57PM -0300, Arnaldo Carvalho de Melo wrote: > Em Wed, Jun 27, 2012 at 05:59:34PM +0900, Namhyung Kim escreveu: > > Hi, Jovi > > > > On Wed, 27 Jun 2012 16:39:19 +0800, Jovi Zhang wrote: > > > From f5f9c3a064482cf3d0fb7ed788c66630bddbfc79 Mon Sep 17 00:00:00 2001 > > > From: Jovi Zhang <bookjovi@gmail.com> > > > Date: Wed, 27 Jun 2012 16:09:21 +0800 > > > Subject: [PATCH] perf: fix wrong hw_breakpoint documentation > > > > > > read-write access hw_breakpoint event is passed as 'mem:addr', > > > 'mem:0x1000:rw' is parsed as invalid argument currently. > > > > > > > It should be a bug in event parser. I guess the patch below will fix it: > > Jiri, > > Ack? If so, Namhyung, can you send a patch with his Ack? > > - Arnaldo > > > > > diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l > > index 488362e14133..aafca33a8a09 100644 > > --- a/tools/perf/util/parse-events.l > > +++ b/tools/perf/util/parse-events.l > > @@ -76,7 +76,7 @@ num_hex 0x[a-fA-F0-9]+ > > num_raw_hex [a-fA-F0-9]+ > > name [a-zA-Z_*?][a-zA-Z0-9_*?]* > > modifier_event [ukhpGH]{1,8} > > -modifier_bp [rwx] > > +modifier_bp [rwx]+ > > > > %% > > we could have it more precise with -modifier_bp [rwx] +modifier_bp [rwx]{1,3} and fail parse_breakpoint_type function for nonsense types aaand automated tests updated ;) jirka ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] perf: fix wrong hw_breakpoint documentation 2012-06-27 19:07 ` Jiri Olsa @ 2012-06-27 19:58 ` Peter Zijlstra 2012-06-27 20:19 ` Jiri Olsa 0 siblings, 1 reply; 18+ messages in thread From: Peter Zijlstra @ 2012-06-27 19:58 UTC (permalink / raw) To: Jiri Olsa; +Cc: Arnaldo Carvalho de Melo, Namhyung Kim, Jovi Zhang, mingo, LKML On Wed, 2012-06-27 at 21:07 +0200, Jiri Olsa wrote: > -modifier_bp [rwx] > +modifier_bp [rwx]{1,3} > > and fail parse_breakpoint_type function for nonsense types If you're going to modify parse_breakpoint_type() to fail on nonsense types, you might as well do the + thing, right? Doesn't really matter that much though ;-) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] perf: fix wrong hw_breakpoint documentation 2012-06-27 19:58 ` Peter Zijlstra @ 2012-06-27 20:19 ` Jiri Olsa 2012-06-28 1:30 ` Namhyung Kim 0 siblings, 1 reply; 18+ messages in thread From: Jiri Olsa @ 2012-06-27 20:19 UTC (permalink / raw) To: Peter Zijlstra Cc: Arnaldo Carvalho de Melo, Namhyung Kim, Jovi Zhang, mingo, LKML On Wed, Jun 27, 2012 at 09:58:22PM +0200, Peter Zijlstra wrote: > On Wed, 2012-06-27 at 21:07 +0200, Jiri Olsa wrote: > > -modifier_bp [rwx] > > +modifier_bp [rwx]{1,3} > > > > and fail parse_breakpoint_type function for nonsense types > > If you're going to modify parse_breakpoint_type() to fail on nonsense > types, you might as well do the + thing, right? > > Doesn't really matter that much though ;-) yo ;-) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] perf: fix wrong hw_breakpoint documentation 2012-06-27 20:19 ` Jiri Olsa @ 2012-06-28 1:30 ` Namhyung Kim 2012-06-28 10:32 ` Jiri Olsa 0 siblings, 1 reply; 18+ messages in thread From: Namhyung Kim @ 2012-06-28 1:30 UTC (permalink / raw) To: Jiri Olsa Cc: Peter Zijlstra, Arnaldo Carvalho de Melo, Jovi Zhang, mingo, LKML On Wed, 27 Jun 2012 22:19:28 +0200, Jiri Olsa wrote: > On Wed, Jun 27, 2012 at 09:58:22PM +0200, Peter Zijlstra wrote: >> On Wed, 2012-06-27 at 21:07 +0200, Jiri Olsa wrote: >> > -modifier_bp [rwx] >> > +modifier_bp [rwx]{1,3} >> > >> > and fail parse_breakpoint_type function for nonsense types >> >> If you're going to modify parse_breakpoint_type() to fail on nonsense >> types, you might as well do the + thing, right? >> >> Doesn't really matter that much though ;-) > > yo ;-) So, are you ok to resend the original patch with your ack? Or will you send the above soon? Thanks, Namhyung ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH] perf: fix wrong hw_breakpoint documentation 2012-06-28 1:30 ` Namhyung Kim @ 2012-06-28 10:32 ` Jiri Olsa 2012-06-28 21:18 ` [PATCH 0/2] perf, tool: Hw breakpoint events parsing fixes Jiri Olsa 0 siblings, 1 reply; 18+ messages in thread From: Jiri Olsa @ 2012-06-28 10:32 UTC (permalink / raw) To: Namhyung Kim Cc: Peter Zijlstra, Arnaldo Carvalho de Melo, Jovi Zhang, mingo, LKML On Thu, Jun 28, 2012 at 10:30:51AM +0900, Namhyung Kim wrote: > On Wed, 27 Jun 2012 22:19:28 +0200, Jiri Olsa wrote: > > On Wed, Jun 27, 2012 at 09:58:22PM +0200, Peter Zijlstra wrote: > >> On Wed, 2012-06-27 at 21:07 +0200, Jiri Olsa wrote: > >> > -modifier_bp [rwx] > >> > +modifier_bp [rwx]{1,3} > >> > > >> > and fail parse_breakpoint_type function for nonsense types > >> > >> If you're going to modify parse_breakpoint_type() to fail on nonsense > >> types, you might as well do the + thing, right? > >> > >> Doesn't really matter that much though ;-) > > > > yo ;-) > > So, are you ok to resend the original patch with your ack? Or will you > send the above soon? I can send the change by the end of the week jirka ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 0/2] perf, tool: Hw breakpoint events parsing fixes 2012-06-28 10:32 ` Jiri Olsa @ 2012-06-28 21:18 ` Jiri Olsa 2012-06-28 21:18 ` [PATCH 1/2] perf, tool: Fix hw breakpoint's type modifier parsing Jiri Olsa 2012-06-28 21:18 ` [PATCH 2/2] perf, tool: Handle hw breakpoints event names via perf_evsel__name Jiri Olsa 0 siblings, 2 replies; 18+ messages in thread From: Jiri Olsa @ 2012-06-28 21:18 UTC (permalink / raw) To: namhyung, bookjovi, acme, a.p.zijlstra, mingo, paulus; +Cc: linux-kernel hi, patch 1 is the change we discussed, patch 2 is to fix hw breakpoint event names. Attached patches: 1/2 perf, tool: Fix hw breakpoint's type modifier parsing 2/2 perf, tool: Handle hw breakpoints event names via perf_evsel__name jirka --- tools/perf/util/evsel.c | 30 ++++++++++++++++++++++ tools/perf/util/parse-events-test.c | 47 +++++++++++++++++++++++++++++++++++ tools/perf/util/parse-events.c | 20 ++++++++++---- tools/perf/util/parse-events.l | 2 +- 4 files changed, 92 insertions(+), 7 deletions(-) ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 1/2] perf, tool: Fix hw breakpoint's type modifier parsing 2012-06-28 21:18 ` [PATCH 0/2] perf, tool: Hw breakpoint events parsing fixes Jiri Olsa @ 2012-06-28 21:18 ` Jiri Olsa 2012-06-29 0:40 ` Namhyung Kim 2012-06-28 21:18 ` [PATCH 2/2] perf, tool: Handle hw breakpoints event names via perf_evsel__name Jiri Olsa 1 sibling, 1 reply; 18+ messages in thread From: Jiri Olsa @ 2012-06-28 21:18 UTC (permalink / raw) To: namhyung, bookjovi, acme, a.p.zijlstra, mingo, paulus Cc: linux-kernel, Jiri Olsa Fixing the hw breakpoint's type modifier parsing to allow all possible combinations of 'rwx' characters. Adding automated tests to the parsing test suite. Original-patch-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Jiri Olsa <jolsa@redhat.com> --- tools/perf/util/parse-events-test.c | 37 +++++++++++++++++++++++++++++++++++ tools/perf/util/parse-events.c | 16 ++++++++++++-- tools/perf/util/parse-events.l | 2 +- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/tools/perf/util/parse-events-test.c b/tools/perf/util/parse-events-test.c index 229af6d..50e6a94 100644 --- a/tools/perf/util/parse-events-test.c +++ b/tools/perf/util/parse-events-test.c @@ -181,6 +181,22 @@ static int test__checkevent_breakpoint_w(struct perf_evlist *evlist) return 0; } +static int test__checkevent_breakpoint_rw(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + TEST_ASSERT_VAL("wrong type", + PERF_TYPE_BREAKPOINT == evsel->attr.type); + TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config); + TEST_ASSERT_VAL("wrong bp_type", + (HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type); + TEST_ASSERT_VAL("wrong bp_len", + HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len); + return 0; +} + static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist) { struct perf_evsel *evsel = list_entry(evlist->entries.next, @@ -352,6 +368,19 @@ static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist) return test__checkevent_breakpoint_w(evlist); } +static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + 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); + + return test__checkevent_breakpoint_rw(evlist); +} + static int test__checkevent_pmu(struct perf_evlist *evlist) { @@ -584,6 +613,14 @@ static struct test__event_st test__events[] = { .name = "instructions:H", .check = test__checkevent_exclude_guest_modifier, }, + [26] = { + .name = "mem:0:rw", + .check = test__checkevent_breakpoint_rw, + }, + [27] = { + .name = "mem:0:rw:kp", + .check = test__checkevent_breakpoint_rw_modifier, + }, }; #define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st)) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 0cc27da..7ae76af 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -383,21 +383,31 @@ parse_breakpoint_type(const char *type, struct perf_event_attr *attr) if (!type || !type[i]) break; +#define CHECK_SET_TYPE(bit) \ +do { \ + if (attr->bp_type & bit) \ + return -EINVAL; \ + else \ + attr->bp_type |= bit; \ +} while (0) + switch (type[i]) { case 'r': - attr->bp_type |= HW_BREAKPOINT_R; + CHECK_SET_TYPE(HW_BREAKPOINT_R); break; case 'w': - attr->bp_type |= HW_BREAKPOINT_W; + CHECK_SET_TYPE(HW_BREAKPOINT_W); break; case 'x': - attr->bp_type |= HW_BREAKPOINT_X; + CHECK_SET_TYPE(HW_BREAKPOINT_X); break; default: return -EINVAL; } } +#undef CHECK_SET_TYPE + if (!attr->bp_type) /* Default */ attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 488362e..a066894 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -76,7 +76,7 @@ num_hex 0x[a-fA-F0-9]+ num_raw_hex [a-fA-F0-9]+ name [a-zA-Z_*?][a-zA-Z0-9_*?]* modifier_event [ukhpGH]{1,8} -modifier_bp [rwx] +modifier_bp [rwx]{1,3} %% -- 1.7.7.6 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 1/2] perf, tool: Fix hw breakpoint's type modifier parsing 2012-06-28 21:18 ` [PATCH 1/2] perf, tool: Fix hw breakpoint's type modifier parsing Jiri Olsa @ 2012-06-29 0:40 ` Namhyung Kim 2012-06-29 1:01 ` Jovi Zhang 0 siblings, 1 reply; 18+ messages in thread From: Namhyung Kim @ 2012-06-29 0:40 UTC (permalink / raw) To: Jiri Olsa; +Cc: bookjovi, acme, a.p.zijlstra, mingo, paulus, linux-kernel On Thu, 28 Jun 2012 23:18:48 +0200, Jiri Olsa wrote: > Fixing the hw breakpoint's type modifier parsing to allow all > possible combinations of 'rwx' characters. > > Adding automated tests to the parsing test suite. > You might need this too: Reported-by: Zovi Zhang <bookzovi@gmail.com> Thanks, Namhyung > Original-patch-by: Namhyung Kim <namhyung@kernel.org> > Signed-off-by: Jiri Olsa <jolsa@redhat.com> > --- > tools/perf/util/parse-events-test.c | 37 +++++++++++++++++++++++++++++++++++ > tools/perf/util/parse-events.c | 16 ++++++++++++-- > tools/perf/util/parse-events.l | 2 +- > 3 files changed, 51 insertions(+), 4 deletions(-) > > diff --git a/tools/perf/util/parse-events-test.c b/tools/perf/util/parse-events-test.c > index 229af6d..50e6a94 100644 > --- a/tools/perf/util/parse-events-test.c > +++ b/tools/perf/util/parse-events-test.c > @@ -181,6 +181,22 @@ static int test__checkevent_breakpoint_w(struct perf_evlist *evlist) > return 0; > } > > +static int test__checkevent_breakpoint_rw(struct perf_evlist *evlist) > +{ > + struct perf_evsel *evsel = list_entry(evlist->entries.next, > + struct perf_evsel, node); > + > + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); > + TEST_ASSERT_VAL("wrong type", > + PERF_TYPE_BREAKPOINT == evsel->attr.type); > + TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config); > + TEST_ASSERT_VAL("wrong bp_type", > + (HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type); > + TEST_ASSERT_VAL("wrong bp_len", > + HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len); > + return 0; > +} > + > static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist) > { > struct perf_evsel *evsel = list_entry(evlist->entries.next, > @@ -352,6 +368,19 @@ static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist) > return test__checkevent_breakpoint_w(evlist); > } > > +static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist) > +{ > + struct perf_evsel *evsel = list_entry(evlist->entries.next, > + struct perf_evsel, node); > + > + 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); > + > + return test__checkevent_breakpoint_rw(evlist); > +} > + > static int test__checkevent_pmu(struct perf_evlist *evlist) > { > > @@ -584,6 +613,14 @@ static struct test__event_st test__events[] = { > .name = "instructions:H", > .check = test__checkevent_exclude_guest_modifier, > }, > + [26] = { > + .name = "mem:0:rw", > + .check = test__checkevent_breakpoint_rw, > + }, > + [27] = { > + .name = "mem:0:rw:kp", > + .check = test__checkevent_breakpoint_rw_modifier, > + }, > }; > > #define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st)) > diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c > index 0cc27da..7ae76af 100644 > --- a/tools/perf/util/parse-events.c > +++ b/tools/perf/util/parse-events.c > @@ -383,21 +383,31 @@ parse_breakpoint_type(const char *type, struct perf_event_attr *attr) > if (!type || !type[i]) > break; > > +#define CHECK_SET_TYPE(bit) \ > +do { \ > + if (attr->bp_type & bit) \ > + return -EINVAL; \ > + else \ > + attr->bp_type |= bit; \ > +} while (0) > + > switch (type[i]) { > case 'r': > - attr->bp_type |= HW_BREAKPOINT_R; > + CHECK_SET_TYPE(HW_BREAKPOINT_R); > break; > case 'w': > - attr->bp_type |= HW_BREAKPOINT_W; > + CHECK_SET_TYPE(HW_BREAKPOINT_W); > break; > case 'x': > - attr->bp_type |= HW_BREAKPOINT_X; > + CHECK_SET_TYPE(HW_BREAKPOINT_X); > break; > default: > return -EINVAL; > } > } > > +#undef CHECK_SET_TYPE > + > if (!attr->bp_type) /* Default */ > attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; > > diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l > index 488362e..a066894 100644 > --- a/tools/perf/util/parse-events.l > +++ b/tools/perf/util/parse-events.l > @@ -76,7 +76,7 @@ num_hex 0x[a-fA-F0-9]+ > num_raw_hex [a-fA-F0-9]+ > name [a-zA-Z_*?][a-zA-Z0-9_*?]* > modifier_event [ukhpGH]{1,8} > -modifier_bp [rwx] > +modifier_bp [rwx]{1,3} > > %% ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/2] perf, tool: Fix hw breakpoint's type modifier parsing 2012-06-29 0:40 ` Namhyung Kim @ 2012-06-29 1:01 ` Jovi Zhang 2012-06-29 1:34 ` Namhyung Kim 2012-06-29 7:22 ` [PATCHv2 " Jiri Olsa 0 siblings, 2 replies; 18+ messages in thread From: Jovi Zhang @ 2012-06-29 1:01 UTC (permalink / raw) To: Namhyung Kim; +Cc: Jiri Olsa, acme, a.p.zijlstra, mingo, paulus, linux-kernel On Fri, Jun 29, 2012 at 8:40 AM, Namhyung Kim <namhyung@kernel.org> wrote: > On Thu, 28 Jun 2012 23:18:48 +0200, Jiri Olsa wrote: >> Fixing the hw breakpoint's type modifier parsing to allow all >> possible combinations of 'rwx' characters. >> >> Adding automated tests to the parsing test suite. >> > > You might need this too: > > Reported-by: Zovi Zhang <bookzovi@gmail.com> > > Thanks, > Namhyung > Thanks Namhyung, Jovi Zhang <bookjovi@gmail.com> :) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/2] perf, tool: Fix hw breakpoint's type modifier parsing 2012-06-29 1:01 ` Jovi Zhang @ 2012-06-29 1:34 ` Namhyung Kim 2012-06-29 7:22 ` [PATCHv2 " Jiri Olsa 1 sibling, 0 replies; 18+ messages in thread From: Namhyung Kim @ 2012-06-29 1:34 UTC (permalink / raw) To: Jovi Zhang; +Cc: Jiri Olsa, acme, a.p.zijlstra, mingo, paulus, linux-kernel On Fri, 29 Jun 2012 09:01:05 +0800, Jovi Zhang wrote: > On Fri, Jun 29, 2012 at 8:40 AM, Namhyung Kim <namhyung@kernel.org> wrote: >> On Thu, 28 Jun 2012 23:18:48 +0200, Jiri Olsa wrote: >>> Fixing the hw breakpoint's type modifier parsing to allow all >>> possible combinations of 'rwx' characters. >>> >>> Adding automated tests to the parsing test suite. >>> >> >> You might need this too: >> >> Reported-by: Zovi Zhang <bookzovi@gmail.com> >> >> Thanks, >> Namhyung >> > > Thanks Namhyung, Jovi Zhang <bookjovi@gmail.com> :) Oops, sorry about that. ;-) Thanks, Namhyung ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCHv2 1/2] perf, tool: Fix hw breakpoint's type modifier parsing 2012-06-29 1:01 ` Jovi Zhang 2012-06-29 1:34 ` Namhyung Kim @ 2012-06-29 7:22 ` Jiri Olsa 2012-07-06 10:57 ` [tip:perf/core] perf tools: Fix hw breakpoint' s " tip-bot for Jiri Olsa 1 sibling, 1 reply; 18+ messages in thread From: Jiri Olsa @ 2012-06-29 7:22 UTC (permalink / raw) To: Jovi Zhang; +Cc: Namhyung Kim, acme, a.p.zijlstra, mingo, paulus, linux-kernel On Fri, Jun 29, 2012 at 09:01:05AM +0800, Jovi Zhang wrote: > On Fri, Jun 29, 2012 at 8:40 AM, Namhyung Kim <namhyung@kernel.org> wrote: > > On Thu, 28 Jun 2012 23:18:48 +0200, Jiri Olsa wrote: > >> Fixing the hw breakpoint's type modifier parsing to allow all > >> possible combinations of 'rwx' characters. > >> > >> Adding automated tests to the parsing test suite. > >> > > > > You might need this too: > > > > Reported-by: Zovi Zhang <bookzovi@gmail.com> > > > > Thanks, > > Namhyung > > > > Thanks Namhyung, Jovi Zhang <bookjovi@gmail.com> :) oops, sry about that.. Arnaldo, please take this one thanks, jirka --- Fixing the hw breakpoint's type modifier parsing to allow all possible combinations of 'rwx' characters. Adding automated tests to the parsing test suite. Original-patch-by: Namhyung Kim <namhyung@kernel.org> Reported-by: Jovi Zhang <bookjovi@gmail.com> Signed-off-by: Jiri Olsa <jolsa@redhat.com> --- tools/perf/util/parse-events-test.c | 37 +++++++++++++++++++++++++++++++++++ tools/perf/util/parse-events.c | 16 ++++++++++++-- tools/perf/util/parse-events.l | 2 +- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/tools/perf/util/parse-events-test.c b/tools/perf/util/parse-events-test.c index 229af6d..50e6a94 100644 --- a/tools/perf/util/parse-events-test.c +++ b/tools/perf/util/parse-events-test.c @@ -181,6 +181,22 @@ static int test__checkevent_breakpoint_w(struct perf_evlist *evlist) return 0; } +static int test__checkevent_breakpoint_rw(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + TEST_ASSERT_VAL("wrong type", + PERF_TYPE_BREAKPOINT == evsel->attr.type); + TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config); + TEST_ASSERT_VAL("wrong bp_type", + (HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type); + TEST_ASSERT_VAL("wrong bp_len", + HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len); + return 0; +} + static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist) { struct perf_evsel *evsel = list_entry(evlist->entries.next, @@ -352,6 +368,19 @@ static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist) return test__checkevent_breakpoint_w(evlist); } +static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + 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); + + return test__checkevent_breakpoint_rw(evlist); +} + static int test__checkevent_pmu(struct perf_evlist *evlist) { @@ -584,6 +613,14 @@ static struct test__event_st test__events[] = { .name = "instructions:H", .check = test__checkevent_exclude_guest_modifier, }, + [26] = { + .name = "mem:0:rw", + .check = test__checkevent_breakpoint_rw, + }, + [27] = { + .name = "mem:0:rw:kp", + .check = test__checkevent_breakpoint_rw_modifier, + }, }; #define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st)) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 0cc27da..7ae76af 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -383,21 +383,31 @@ parse_breakpoint_type(const char *type, struct perf_event_attr *attr) if (!type || !type[i]) break; +#define CHECK_SET_TYPE(bit) \ +do { \ + if (attr->bp_type & bit) \ + return -EINVAL; \ + else \ + attr->bp_type |= bit; \ +} while (0) + switch (type[i]) { case 'r': - attr->bp_type |= HW_BREAKPOINT_R; + CHECK_SET_TYPE(HW_BREAKPOINT_R); break; case 'w': - attr->bp_type |= HW_BREAKPOINT_W; + CHECK_SET_TYPE(HW_BREAKPOINT_W); break; case 'x': - attr->bp_type |= HW_BREAKPOINT_X; + CHECK_SET_TYPE(HW_BREAKPOINT_X); break; default: return -EINVAL; } } +#undef CHECK_SET_TYPE + if (!attr->bp_type) /* Default */ attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 488362e..a066894 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -76,7 +76,7 @@ num_hex 0x[a-fA-F0-9]+ num_raw_hex [a-fA-F0-9]+ name [a-zA-Z_*?][a-zA-Z0-9_*?]* modifier_event [ukhpGH]{1,8} -modifier_bp [rwx] +modifier_bp [rwx]{1,3} %% -- 1.7.7.6 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [tip:perf/core] perf tools: Fix hw breakpoint' s type modifier parsing 2012-06-29 7:22 ` [PATCHv2 " Jiri Olsa @ 2012-07-06 10:57 ` tip-bot for Jiri Olsa 0 siblings, 0 replies; 18+ messages in thread From: tip-bot for Jiri Olsa @ 2012-07-06 10:57 UTC (permalink / raw) To: linux-tip-commits Cc: acme, linux-kernel, paulus, hpa, mingo, a.p.zijlstra, namhyung, bookjovi, jolsa, tglx Commit-ID: 7582732f57e547929d4c65ad8e38f3446e0538d8 Gitweb: http://git.kernel.org/tip/7582732f57e547929d4c65ad8e38f3446e0538d8 Author: Jiri Olsa <jolsa@redhat.com> AuthorDate: Fri, 29 Jun 2012 09:22:54 +0200 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Fri, 29 Jun 2012 13:28:13 -0300 perf tools: Fix hw breakpoint's type modifier parsing Fixing the hw breakpoint's type modifier parsing to allow all possible combinations of 'rwx' characters. Adding automated tests to the parsing test suite. Reported-by: Jovi Zhang <bookjovi@gmail.com> Original-patch-by: Namhyung Kim <namhyung@kernel.org> Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: Jovi Zhang <bookjovi@gmail.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/20120629072254.GA940@krava.brq.redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/parse-events-test.c | 37 +++++++++++++++++++++++++++++++++++ tools/perf/util/parse-events.c | 16 ++++++++++++-- tools/perf/util/parse-events.l | 2 +- 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/tools/perf/util/parse-events-test.c b/tools/perf/util/parse-events-test.c index a0f61a2..de81fe1 100644 --- a/tools/perf/util/parse-events-test.c +++ b/tools/perf/util/parse-events-test.c @@ -181,6 +181,22 @@ static int test__checkevent_breakpoint_w(struct perf_evlist *evlist) return 0; } +static int test__checkevent_breakpoint_rw(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); + TEST_ASSERT_VAL("wrong type", + PERF_TYPE_BREAKPOINT == evsel->attr.type); + TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config); + TEST_ASSERT_VAL("wrong bp_type", + (HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type); + TEST_ASSERT_VAL("wrong bp_len", + HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len); + return 0; +} + static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist) { struct perf_evsel *evsel = list_entry(evlist->entries.next, @@ -352,6 +368,19 @@ static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist) return test__checkevent_breakpoint_w(evlist); } +static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist) +{ + struct perf_evsel *evsel = list_entry(evlist->entries.next, + struct perf_evsel, node); + + 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); + + return test__checkevent_breakpoint_rw(evlist); +} + static int test__checkevent_pmu(struct perf_evlist *evlist) { @@ -585,6 +614,14 @@ static struct test__event_st test__events[] = { .name = "instructions:H", .check = test__checkevent_exclude_guest_modifier, }, + [26] = { + .name = "mem:0:rw", + .check = test__checkevent_breakpoint_rw, + }, + [27] = { + .name = "mem:0:rw:kp", + .check = test__checkevent_breakpoint_rw_modifier, + }, }; #define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st)) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 0cc27da..7ae76af 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -383,21 +383,31 @@ parse_breakpoint_type(const char *type, struct perf_event_attr *attr) if (!type || !type[i]) break; +#define CHECK_SET_TYPE(bit) \ +do { \ + if (attr->bp_type & bit) \ + return -EINVAL; \ + else \ + attr->bp_type |= bit; \ +} while (0) + switch (type[i]) { case 'r': - attr->bp_type |= HW_BREAKPOINT_R; + CHECK_SET_TYPE(HW_BREAKPOINT_R); break; case 'w': - attr->bp_type |= HW_BREAKPOINT_W; + CHECK_SET_TYPE(HW_BREAKPOINT_W); break; case 'x': - attr->bp_type |= HW_BREAKPOINT_X; + CHECK_SET_TYPE(HW_BREAKPOINT_X); break; default: return -EINVAL; } } +#undef CHECK_SET_TYPE + if (!attr->bp_type) /* Default */ attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W; diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 488362e..a066894 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -76,7 +76,7 @@ num_hex 0x[a-fA-F0-9]+ num_raw_hex [a-fA-F0-9]+ name [a-zA-Z_*?][a-zA-Z0-9_*?]* modifier_event [ukhpGH]{1,8} -modifier_bp [rwx] +modifier_bp [rwx]{1,3} %% ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 2/2] perf, tool: Handle hw breakpoints event names via perf_evsel__name 2012-06-28 21:18 ` [PATCH 0/2] perf, tool: Hw breakpoint events parsing fixes Jiri Olsa 2012-06-28 21:18 ` [PATCH 1/2] perf, tool: Fix hw breakpoint's type modifier parsing Jiri Olsa @ 2012-06-28 21:18 ` Jiri Olsa 2012-07-06 10:58 ` [tip:perf/core] perf evsel: Handle hw breakpoints event names in perf_evsel__name() tip-bot for Jiri Olsa 1 sibling, 1 reply; 18+ messages in thread From: Jiri Olsa @ 2012-06-28 21:18 UTC (permalink / raw) To: namhyung, bookjovi, acme, a.p.zijlstra, mingo, paulus Cc: linux-kernel, Jiri Olsa Adding hw breakpoint events hook to the perf_evsel__name function, to display event names properly all over the perf. Updating hw breakpoints events tests. Signed-off-by: Jiri Olsa <jolsa@redhat.com> --- tools/perf/util/evsel.c | 30 ++++++++++++++++++++++++++++++ tools/perf/util/parse-events-test.c | 10 ++++++++++ tools/perf/util/parse-events.c | 4 +--- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 876f639..9a46487 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -16,6 +16,7 @@ #include "thread_map.h" #include "target.h" #include "../../include/linux/perf_event.h" +#include "../../../include/linux/hw_breakpoint.h" #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) #define GROUP_FD(group_fd, cpu) (*(int *)xyarray__entry(group_fd, cpu, 0)) @@ -153,6 +154,31 @@ static int perf_evsel__sw_name(struct perf_evsel *evsel, char *bf, size_t size) return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); } +static int __perf_evsel__bp_name(char *bf, size_t size, u64 addr, u64 type) +{ + int r; + + r = snprintf(bf, size, "mem:0x%" PRIx64 ":", addr); + + if (type & HW_BREAKPOINT_R) + r += snprintf(bf + r, size - r, "r"); + + if (type & HW_BREAKPOINT_W) + r += snprintf(bf + r, size - r, "w"); + + if (type & HW_BREAKPOINT_X) + r += snprintf(bf + r, size - r, "x"); + + return r; +} + +static int perf_evsel__bp_name(struct perf_evsel *evsel, char *bf, size_t size) +{ + struct perf_event_attr *attr = &evsel->attr; + int r = __perf_evsel__bp_name(bf, size, attr->bp_addr, attr->bp_type); + return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); +} + const char *perf_evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX] [PERF_EVSEL__MAX_ALIASES] = { { "L1-dcache", "l1-d", "l1d", "L1-data", }, @@ -286,6 +312,10 @@ const char *perf_evsel__name(struct perf_evsel *evsel) scnprintf(bf, sizeof(bf), "%s", "unknown tracepoint"); break; + case PERF_TYPE_BREAKPOINT: + perf_evsel__bp_name(evsel, bf, sizeof(bf)); + break; + default: scnprintf(bf, sizeof(bf), "%s", "unknown attr type"); break; diff --git a/tools/perf/util/parse-events-test.c b/tools/perf/util/parse-events-test.c index 50e6a94..5cefbec 100644 --- a/tools/perf/util/parse-events-test.c +++ b/tools/perf/util/parse-events-test.c @@ -325,6 +325,8 @@ static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist) 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 name", + !strcmp(perf_evsel__name(evsel), "mem:0x0:rw:u")); return test__checkevent_breakpoint(evlist); } @@ -338,6 +340,8 @@ static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist) 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 name", + !strcmp(perf_evsel__name(evsel), "mem:0x0:x:k")); return test__checkevent_breakpoint_x(evlist); } @@ -351,6 +355,8 @@ static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist) 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 name", + !strcmp(perf_evsel__name(evsel), "mem:0x0:r:hp")); return test__checkevent_breakpoint_r(evlist); } @@ -364,6 +370,8 @@ static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist) 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 name", + !strcmp(perf_evsel__name(evsel), "mem:0x0:w:up")); return test__checkevent_breakpoint_w(evlist); } @@ -377,6 +385,8 @@ static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist) 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 name", + !strcmp(perf_evsel__name(evsel), "mem:0x0:rw:kp")); return test__checkevent_breakpoint_rw(evlist); } diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 7ae76af..1dc44dc 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -418,7 +418,6 @@ int parse_events_add_breakpoint(struct list_head **list, int *idx, void *ptr, char *type) { struct perf_event_attr attr; - char name[MAX_NAME_LEN]; memset(&attr, 0, sizeof(attr)); attr.bp_addr = (unsigned long) ptr; @@ -437,8 +436,7 @@ int parse_events_add_breakpoint(struct list_head **list, int *idx, attr.type = PERF_TYPE_BREAKPOINT; - snprintf(name, MAX_NAME_LEN, "mem:%p:%s", ptr, type ? type : "rw"); - return add_event(list, idx, &attr, name); + return add_event(list, idx, &attr, NULL); } static int config_term(struct perf_event_attr *attr, -- 1.7.7.6 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* [tip:perf/core] perf evsel: Handle hw breakpoints event names in perf_evsel__name() 2012-06-28 21:18 ` [PATCH 2/2] perf, tool: Handle hw breakpoints event names via perf_evsel__name Jiri Olsa @ 2012-07-06 10:58 ` tip-bot for Jiri Olsa 0 siblings, 0 replies; 18+ messages in thread From: tip-bot for Jiri Olsa @ 2012-07-06 10:58 UTC (permalink / raw) To: linux-tip-commits Cc: acme, linux-kernel, paulus, hpa, mingo, a.p.zijlstra, namhyung, bookjovi, jolsa, tglx Commit-ID: 287e74aa3db097469bdca401f33f00ef20dc710d Gitweb: http://git.kernel.org/tip/287e74aa3db097469bdca401f33f00ef20dc710d Author: Jiri Olsa <jolsa@redhat.com> AuthorDate: Thu, 28 Jun 2012 23:18:49 +0200 Committer: Arnaldo Carvalho de Melo <acme@redhat.com> CommitDate: Fri, 29 Jun 2012 13:28:13 -0300 perf evsel: Handle hw breakpoints event names in perf_evsel__name() Adding hw breakpoint events hook in the perf_evsel__name function, to display event names properly all over the perf tools. Updated hw breakpoints events tests. Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: Jovi Zhang <bookjovi@gmail.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1340918329-3012-3-git-send-email-jolsa@redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> --- tools/perf/util/evsel.c | 30 ++++++++++++++++++++++++++++++ tools/perf/util/parse-events-test.c | 10 ++++++++++ tools/perf/util/parse-events.c | 4 +--- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 3d1f696..e817713 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -15,6 +15,7 @@ #include "cpumap.h" #include "thread_map.h" #include "target.h" +#include "../../../include/linux/hw_breakpoint.h" #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) #define GROUP_FD(group_fd, cpu) (*(int *)xyarray__entry(group_fd, cpu, 0)) @@ -152,6 +153,31 @@ static int perf_evsel__sw_name(struct perf_evsel *evsel, char *bf, size_t size) return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); } +static int __perf_evsel__bp_name(char *bf, size_t size, u64 addr, u64 type) +{ + int r; + + r = scnprintf(bf, size, "mem:0x%" PRIx64 ":", addr); + + if (type & HW_BREAKPOINT_R) + r += scnprintf(bf + r, size - r, "r"); + + if (type & HW_BREAKPOINT_W) + r += scnprintf(bf + r, size - r, "w"); + + if (type & HW_BREAKPOINT_X) + r += scnprintf(bf + r, size - r, "x"); + + return r; +} + +static int perf_evsel__bp_name(struct perf_evsel *evsel, char *bf, size_t size) +{ + struct perf_event_attr *attr = &evsel->attr; + int r = __perf_evsel__bp_name(bf, size, attr->bp_addr, attr->bp_type); + return r + perf_evsel__add_modifiers(evsel, bf + r, size - r); +} + const char *perf_evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX] [PERF_EVSEL__MAX_ALIASES] = { { "L1-dcache", "l1-d", "l1d", "L1-data", }, @@ -285,6 +311,10 @@ const char *perf_evsel__name(struct perf_evsel *evsel) scnprintf(bf, sizeof(bf), "%s", "unknown tracepoint"); break; + case PERF_TYPE_BREAKPOINT: + perf_evsel__bp_name(evsel, bf, sizeof(bf)); + break; + default: scnprintf(bf, sizeof(bf), "%s", "unknown attr type"); break; diff --git a/tools/perf/util/parse-events-test.c b/tools/perf/util/parse-events-test.c index de81fe1..dd0c306 100644 --- a/tools/perf/util/parse-events-test.c +++ b/tools/perf/util/parse-events-test.c @@ -325,6 +325,8 @@ static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist) 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 name", + !strcmp(perf_evsel__name(evsel), "mem:0x0:rw:u")); return test__checkevent_breakpoint(evlist); } @@ -338,6 +340,8 @@ static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist) 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 name", + !strcmp(perf_evsel__name(evsel), "mem:0x0:x:k")); return test__checkevent_breakpoint_x(evlist); } @@ -351,6 +355,8 @@ static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist) 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 name", + !strcmp(perf_evsel__name(evsel), "mem:0x0:r:hp")); return test__checkevent_breakpoint_r(evlist); } @@ -364,6 +370,8 @@ static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist) 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 name", + !strcmp(perf_evsel__name(evsel), "mem:0x0:w:up")); return test__checkevent_breakpoint_w(evlist); } @@ -377,6 +385,8 @@ static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist) 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 name", + !strcmp(perf_evsel__name(evsel), "mem:0x0:rw:kp")); return test__checkevent_breakpoint_rw(evlist); } diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 7ae76af..1dc44dc 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -418,7 +418,6 @@ int parse_events_add_breakpoint(struct list_head **list, int *idx, void *ptr, char *type) { struct perf_event_attr attr; - char name[MAX_NAME_LEN]; memset(&attr, 0, sizeof(attr)); attr.bp_addr = (unsigned long) ptr; @@ -437,8 +436,7 @@ int parse_events_add_breakpoint(struct list_head **list, int *idx, attr.type = PERF_TYPE_BREAKPOINT; - snprintf(name, MAX_NAME_LEN, "mem:%p:%s", ptr, type ? type : "rw"); - return add_event(list, idx, &attr, name); + return add_event(list, idx, &attr, NULL); } static int config_term(struct perf_event_attr *attr, ^ permalink raw reply related [flat|nested] 18+ messages in thread
end of thread, other threads:[~2012-07-06 10:58 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-06-27 8:39 [PATCH] perf: fix wrong hw_breakpoint documentation Jovi Zhang 2012-06-27 8:59 ` Namhyung Kim 2012-06-27 13:40 ` Jovi Zhang 2012-06-27 16:15 ` Arnaldo Carvalho de Melo 2012-06-27 19:07 ` Jiri Olsa 2012-06-27 19:58 ` Peter Zijlstra 2012-06-27 20:19 ` Jiri Olsa 2012-06-28 1:30 ` Namhyung Kim 2012-06-28 10:32 ` Jiri Olsa 2012-06-28 21:18 ` [PATCH 0/2] perf, tool: Hw breakpoint events parsing fixes Jiri Olsa 2012-06-28 21:18 ` [PATCH 1/2] perf, tool: Fix hw breakpoint's type modifier parsing Jiri Olsa 2012-06-29 0:40 ` Namhyung Kim 2012-06-29 1:01 ` Jovi Zhang 2012-06-29 1:34 ` Namhyung Kim 2012-06-29 7:22 ` [PATCHv2 " Jiri Olsa 2012-07-06 10:57 ` [tip:perf/core] perf tools: Fix hw breakpoint' s " tip-bot for Jiri Olsa 2012-06-28 21:18 ` [PATCH 2/2] perf, tool: Handle hw breakpoints event names via perf_evsel__name Jiri Olsa 2012-07-06 10:58 ` [tip:perf/core] perf evsel: Handle hw breakpoints event names in perf_evsel__name() tip-bot for Jiri Olsa
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.