perf evsel: Fix max perf_event_attr.precise_ip detection
tip-bot for Jiri Olsa
merge botCommit-ID: 4e8a5c1551370ebc0fbdb8f5c33dad13e45bdc99 Gitweb: https://git.kernel.org/tip/4e8a5c1551370ebc0fbdb8f5c33dad13e45bdc99 Author: Jiri Olsa <[email protected]> AuthorDate: Thu, 14 Mar 2019 15:00:10 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 28 Mar 2019 14:31:56 -0300
perf evsel: Fix max perf_event_attr.precise_ip detection
After a discussion with Andi, move the perf_event_attr.precise_ip detection for maximum precise config (via :P modifier or for default cycles event) to perf_evsel__open().
The current detection in perf_event_attr__set_max_precise_ip() is tricky, because precise_ip config is specific for given event and it currently checks only hw cycles.
We now check for valid precise_ip value right after failing sys_perf_event_open() for specific event, before any of the perf_event_attr fallback code gets executed.
This way we get the proper config in perf_event_attr together with allowed precise_ip settings.
We can see that code activity with -vv, like:
$ perf record -vv ls
...
------------------------------------------------------------
perf_event_attr:
size 112
{ sample_period, sample_freq } 4000
...
precise_ip 3
sample_id_all 1
exclude_guest 1
mmap2 1
comm_exec 1
ksymbol 1
------------------------------------------------------------
sys_perf_event_open: pid 9926 cpu 0 group_fd -1 flags 0x8
sys_perf_event_open failed, error -95
decreasing precise_ip by one (2)
------------------------------------------------------------
perf_event_attr:
size 112
{ sample_period, sample_freq } 4000
...
precise_ip 2
sample_id_all 1
exclude_guest 1
mmap2 1
comm_exec 1
ksymbol 1
------------------------------------------------------------
sys_perf_event_open: pid 9926 cpu 0 group_fd -1 flags 0x8 = 4
...Suggested-by Andi Kleen <[email protected]>
Signed-off-by Jiri Olsa <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/evlist.c | 29 ------------------- tools/perf/util/evlist.h | 2 -- tools/perf/util/evsel.c | 72 +++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 59 insertions(+), 44 deletions(-)
tools/perf/util/evlist.c +0 -29
@@ -231,35 +231,6 @@ void perf_evlist__set_leader(struct perf_evlist *evlist) } } -void perf_event_attr__set_max_precise_ip (struct perf_event_attr *pattr) -{ -struct perf_event_attr attr = { - .type =PERF_TYPE_HARDWARE , - .config =PERF_COUNT_HW_CPU_CYCLES , - .exclude_kernel =1 , - .precise_ip =3 , - }; - -event_attr_init (&attr); - -/* -* Unnamed union member, not supported as struct member named -* initializer in older compilers such as gcc 4.4.7 -*/ - attr.sample_period =1 ; - -while (attr.precise_ip !=0 ) { -int fd =sys_perf_event_open (&attr,0 ,-1 ,-1 ,0 ); -if (fd !=-1 ) { -close (fd); -break ; - } - --attr.precise_ip; - } - - pattr->precise_ip = attr.precise_ip; -} -int __perf_evlist__add_default (struct perf_evlist *evlist,bool precise) {struct perf_evsel *evsel =perf_evsel__new_cycles (precise);
tools/perf/util/evlist.h +0 -2
@@ -315,8 +315,6 @@ void perf_evlist__to_front(struct perf_evlist *evlist,void perf_evlist__set_tracking_event (struct perf_evlist *evlist,struct perf_evsel *tracking_evsel); -void perf_event_attr__set_max_precise_ip (struct perf_event_attr *attr); -struct perf_evsel *perf_evlist__find_evsel_by_str (struct perf_evlist *evlist,const char *str);
tools/perf/util/evsel.c +59 -13
110 lines not on this page · raw message