perf, tools: Move perf_evsel__reset_weak_group into evlist
PATCH 1/2 perf, tools: Move perf_evsel__reset_weak_group into evlist
From: Andi Kleen <[email protected]>
- Move the function from builtin-stat to evlist for reuse
- Rename to evlist to match purpose better
- Pass the evlist as first argument.
- No functional changes
--- tools/perf/builtin-stat.c | 29 ++--------------------------- tools/perf/util/evlist.c | 27 +++++++++++++++++++++++++++ tools/perf/util/evlist.h | 3 +++ 3 files changed, 32 insertions(+), 27 deletions(-)
tools/perf/builtin-stat.c +2 -27
@@ -567,32 +567,6 @@ static bool perf_evsel__should_store_id(struct perf_evsel *counter)return STAT_RECORD || counter->attr.read_format &PERF_FORMAT_ID ; } -static struct perf_evsel *perf_evsel__reset_weak_group (struct perf_evsel *evsel) -{ -struct perf_evsel *c2, *leader; -bool is_open = true; - - leader = evsel->leader; -pr_debug ("Weak group for %s/%d failed\n" , - leader->name, leader->nr_members); - -/* -* for_each_group_member doesn't work here because it doesn't -* include the first entry. -*/ -evlist__for_each_entry (evsel_list, c2) { -if (c2 == evsel) - is_open = false; -if (c2->leader == leader) { -if (is_open) -perf_evsel__close (c2); - c2->leader = c2; - c2->nr_members =0 ; - } - } -return leader; -} -static int __run_perf_stat (int argc,const char **argv,int run_idx) {int interval = stat_config.interval;
@@ -639,7 +613,8 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)if ((errno ==EINVAL || errno ==EBADF ) && counter->leader != counter && counter->weak_group) { - counter =perf_evsel__reset_weak_group (counter); + counter =perf_evlist__reset_weak_group (evsel_list, + counter); goto try_again; }
tools/perf/util/evlist.c +27 -0
@@ -1810,3 +1810,30 @@ void perf_evlist__force_leader(struct perf_evlist *evlist) leader->forced_leader = true; } } + +struct perf_evsel *perf_evlist__reset_weak_group (struct perf_evlist *evsel_list, +struct perf_evsel *evsel) +{ +struct perf_evsel *c2, *leader; +bool is_open = true; + + leader = evsel->leader; +pr_debug ("Weak group for %s/%d failed\n" , + leader->name, leader->nr_members); + +/* +* for_each_group_member doesn't work here because it doesn't +* include the first entry. +*/ +evlist__for_each_entry (evsel_list, c2) { +if (c2 == evsel) + is_open = false; +if (c2->leader == leader) { +if (is_open) +perf_evsel__close (c2); + c2->leader = c2; + c2->nr_members =0 ; + } + } +return leader; +}
tools/perf/util/evlist.h +3 -0
@@ -312,4 +312,7 @@ bool perf_evlist__exclude_kernel(struct perf_evlist *evlist);void perf_evlist__force_leader (struct perf_evlist *evlist); +struct perf_evsel *perf_evlist__reset_weak_group (struct perf_evlist *evlist, +struct perf_evsel *evsel); +#endif /* __PERF_EVLIST_H */
Signature · 1 line
2.17.1
PATCH 2/2 perf record: Support weak groups
From: Andi Kleen <[email protected]>
Implement a weak group fallback for perf record, similar to the existing perf stat support. This allows to use groups that might be longer than the available counters without failing.
Before:
$ perf record -e '{cycles,cache-misses,cache-references,cpu_clk_unhalted.thread,cycles,cycles,cycles}' -a sleep 1
Error:
The sys_perf_event_open() syscall returned with 22 (Invalid argument) for event (cycles).
/bin/dmesg | grep -i perf may provide additional information.After:
$ ./perf record -e '{cycles,cache-misses,cache-references,cpu_clk_unhalted.thread,cycles,cycles,cycles}:W' -a sleep 1
WARNING: No sample_id_all support, falling back to unordered processing
[ perf record: Woken up 3 times to write data ]
[ perf record: Captured and wrote 8.136 MB perf.data (134069 samples) ]--- tools/perf/Documentation/perf-list.txt | 1 - tools/perf/builtin-record.c | 7 ++++++- 2 files changed, 6 insertions(+), 2 deletions(-)
tools/perf/Documentation/perf-list.txt +0 -1
@@ -49,7 +49,6 @@ counted. The following modifiers exist: S - read sample value (PERF_SAMPLE_READ) D - pin the event to the PMU W - group is weak and will fallback to non-group if not schedulable, - only supported in 'perf stat' for now. The 'p' modifier can be used for specifying how precise the instruction address should be. The 'p' modifier can be specified multiple times:
tools/perf/builtin-record.c +6 -1
@@ -388,7 +388,12 @@ static int record__open(struct record *rec)ui__warning ("%s\n" , msg); goto try_again; } - +if ((errno ==EINVAL || errno ==EBADF ) && + pos->leader != pos && + pos->weak_group) { + pos =perf_evlist__reset_weak_group (evlist, pos); + goto try_again; + } rc = -errno;perf_evsel__open_strerror (pos, &opts->target, errno, msg,sizeof (msg));
Signature · 1 line
2.17.1
Re: [PATCH v1 2/2] perf record: Support weak groups
Quoted 13 lines · Andi Kleen
From: Andi Kleen <[email protected]>
Implement a weak group fallback for perf record, similar to the existing perf stat support. This allows to use groups that might be longer than the available counters without failing.
Before:
$ perf record -e '{cycles,cache-misses,cache-references,cpu_clk_unhalted.thread,cycles,cycles,cycles}' -a sleep 1 Error: The sys_perf_event_open() syscall returned with 22 (Invalid argument) for event (cycles). /bin/dmesg | grep -i perf may provide additional information.
Quoted 8 lines
After:
$ ./perf record -e '{cycles,cache-misses,cache-references,cpu_clk_unhalted.thread,cycles,cycles,cycles}:W' -a sleep 1 WARNING: No sample_id_all support, falling back to unordered processing [ perf record: Woken up 3 times to write data ] [ perf record: Captured and wrote 8.136 MB perf.data (134069 samples) ]Signed-off-by Andi Kleen <[email protected]>
thanks,
jirka
tip-bot for Andi Kleen
merge bot[tip:perf/urgent] perf record: Support weak groups
In reply to Andi Kleenperf record: Support weak groups
Commit-ID: cf99ad1424c54fc84b84d3a3deb57a48c340c30a Gitweb: https://git.kernel.org/tip/cf99ad1424c54fc84b84d3a3deb57a48c340c30a Author: Andi Kleen <[email protected]> AuthorDate: Mon, 1 Oct 2018 12:59:27 -0700 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Nov 2018 14:37:10 -0300
perf record: Support weak groups
Implement a weak group fallback for 'perf record', similar to the existing 'perf stat' support. This allows to use groups that might be longer than the available counters without failing.
Before:
$ perf record -e '{cycles,cache-misses,cache-references,cpu_clk_unhalted.thread,cycles,cycles,cycles}' -a sleep 1
Error:
The sys_perf_event_open() syscall returned with 22 (Invalid argument) for event (cycles).
/bin/dmesg | grep -i perf may provide additional information.After:
$ ./perf record -e '{cycles,cache-misses,cache-references,cpu_clk_unhalted.thread,cycles,cycles,cycles}:W' -a sleep 1
WARNING: No sample_id_all support, falling back to unordered processing
[ perf record: Woken up 3 times to write data ]
[ perf record: Captured and wrote 8.136 MB perf.data (134069 samples) ]--- tools/perf/Documentation/perf-list.txt | 1 - tools/perf/builtin-record.c | 7 ++++++- 2 files changed, 6 insertions(+), 2 deletions(-)
tools/perf/Documentation/perf-list.txt +0 -1
@@ -55,7 +55,6 @@ counted. The following modifiers exist: S - read sample value (PERF_SAMPLE_READ) D - pin the event to the PMU W - group is weak and will fallback to non-group if not schedulable, - only supported in 'perf stat' for now. The 'p' modifier can be used for specifying how precise the instruction address should be. The 'p' modifier can be specified multiple times:
tools/perf/builtin-record.c +6 -1
@@ -391,7 +391,12 @@ try_again:ui__warning ("%s\n" , msg); goto try_again; } - +if ((errno ==EINVAL || errno ==EBADF ) && + pos->leader != pos && + pos->weak_group) { + pos =perf_evlist__reset_weak_group (evlist, pos); + goto try_again; + } rc = -errno;perf_evsel__open_strerror (pos, &opts->target, errno, msg,sizeof (msg));
Quoted 8 lines · Andi Kleen
From: Andi Kleen <[email protected]>
- Move the function from builtin-stat to evlist for reuse
- Rename to evlist to match purpose better
- Pass the evlist as first argument.
- No functional changesSigned-off-by Andi Kleen <[email protected]>
thanks,
jirka
Quoted 103 lines
--- tools/perf/builtin-stat.c | 29 ++--------------------------- tools/perf/util/evlist.c | 27 +++++++++++++++++++++++++++ tools/perf/util/evlist.h | 3 +++ 3 files changed, 32 insertions(+), 27 deletions(-)tools/perf/builtin-stat.c +2
-27@@ -567,32 +567,6 @@ static bool perf_evsel__should_store_id(struct perf_evsel *counter)return STAT_RECORD || counter->attr.read_format &PERF_FORMAT_ID ; } -static struct perf_evsel *perf_evsel__reset_weak_group (struct perf_evsel *evsel) -{ -struct perf_evsel *c2, *leader; -bool is_open = true; - - leader = evsel->leader; -pr_debug ("Weak group for %s/%d failed\n" , - leader->name, leader->nr_members); - -/* -* for_each_group_member doesn't work here because it doesn't -* include the first entry. -*/ -evlist__for_each_entry (evsel_list, c2) { -if (c2 == evsel) - is_open = false; -if (c2->leader == leader) { -if (is_open) -perf_evsel__close (c2); - c2->leader = c2; - c2->nr_members =0 ; - } - } -return leader; -} -static int __run_perf_stat (int argc,const char **argv,int run_idx) {int interval = stat_config.interval;@@ -639,7 +613,8 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)if ((errno ==EINVAL || errno ==EBADF ) && counter->leader != counter && counter->weak_group) { - counter =perf_evsel__reset_weak_group (counter); + counter =perf_evlist__reset_weak_group (evsel_list, + counter); goto try_again; }tools/perf/util/evlist.c +27
-0@@ -1810,3 +1810,30 @@ void perf_evlist__force_leader(struct perf_evlist *evlist) leader->forced_leader = true; } } + +struct perf_evsel *perf_evlist__reset_weak_group (struct perf_evlist *evsel_list, +struct perf_evsel *evsel) +{ +struct perf_evsel *c2, *leader; +bool is_open = true; + + leader = evsel->leader; +pr_debug ("Weak group for %s/%d failed\n" , + leader->name, leader->nr_members); + +/* +* for_each_group_member doesn't work here because it doesn't +* include the first entry. +*/ +evlist__for_each_entry (evsel_list, c2) { +if (c2 == evsel) + is_open = false; +if (c2->leader == leader) { +if (is_open) +perf_evsel__close (c2); + c2->leader = c2; + c2->nr_members =0 ; + } + } +return leader; +}tools/perf/util/evlist.h +3
-0@@ -312,4 +312,7 @@ bool perf_evlist__exclude_kernel(struct perf_evlist *evlist);void perf_evlist__force_leader (struct perf_evlist *evlist); +struct perf_evsel *perf_evlist__reset_weak_group (struct perf_evlist *evlist, +struct perf_evsel *evsel); +#endif /* __PERF_EVLIST_H */ Signature · 1 line
2.17.1
tip-bot for Andi Kleen
merge bot[tip:perf/urgent] perf evlist: Move perf_evsel__reset_weak_group into evlist
In reply to Andi Kleenperf evlist: Move perf_evsel__reset_weak_group into evlist
Commit-ID: c3537fc251503af18085b8f84126d13743663970 Gitweb: https://git.kernel.org/tip/c3537fc251503af18085b8f84126d13743663970 Author: Andi Kleen <[email protected]> AuthorDate: Mon, 1 Oct 2018 12:59:26 -0700 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 5 Nov 2018 14:37:09 -0300
perf evlist: Move perf_evsel__reset_weak_group into evlist
- Move the function from builtin-stat to evlist for reuse
- Rename to evlist to match purpose better
- Pass the evlist as first argument.
- No functional changes
--- tools/perf/builtin-stat.c | 28 +--------------------------- tools/perf/util/evlist.c | 27 +++++++++++++++++++++++++++ tools/perf/util/evlist.h | 3 +++ 3 files changed, 31 insertions(+), 27 deletions(-)
tools/perf/builtin-stat.c +1 -27
@@ -383,32 +383,6 @@ static bool perf_evsel__should_store_id(struct perf_evsel *counter)return STAT_RECORD || counter->attr.read_format &PERF_FORMAT_ID ; } -static struct perf_evsel *perf_evsel__reset_weak_group (struct perf_evsel *evsel) -{ -struct perf_evsel *c2, *leader; -bool is_open = true; - - leader = evsel->leader; -pr_debug ("Weak group for %s/%d failed\n" , - leader->name, leader->nr_members); - -/* -* for_each_group_member doesn't work here because it doesn't -* include the first entry. -*/ -evlist__for_each_entry (evsel_list, c2) { -if (c2 == evsel) - is_open = false; -if (c2->leader == leader) { -if (is_open) -perf_evsel__close (c2); - c2->leader = c2; - c2->nr_members =0 ; - } - } -return leader; -} -static bool is_target_alive (struct target *_target,struct thread_map *threads) {
@@ -477,7 +451,7 @@ try_again:if ((errno ==EINVAL || errno ==EBADF ) && counter->leader != counter && counter->weak_group) { - counter =perf_evsel__reset_weak_group (counter); + counter =perf_evlist__reset_weak_group (evsel_list, counter); goto try_again; }
tools/perf/util/evlist.c +27 -0
@@ -1810,3 +1810,30 @@ void perf_evlist__force_leader(struct perf_evlist *evlist) leader->forced_leader = true; } } + +struct perf_evsel *perf_evlist__reset_weak_group (struct perf_evlist *evsel_list, +struct perf_evsel *evsel) +{ +struct perf_evsel *c2, *leader; +bool is_open = true; + + leader = evsel->leader; +pr_debug ("Weak group for %s/%d failed\n" , + leader->name, leader->nr_members); + +/* +* for_each_group_member doesn't work here because it doesn't +* include the first entry. +*/ +evlist__for_each_entry (evsel_list, c2) { +if (c2 == evsel) + is_open = false; +if (c2->leader == leader) { +if (is_open) +perf_evsel__close (c2); + c2->leader = c2; + c2->nr_members =0 ; + } + } +return leader; +}
tools/perf/util/evlist.h +3 -0
@@ -312,4 +312,7 @@ bool perf_evlist__exclude_kernel(struct perf_evlist *evlist);void perf_evlist__force_leader (struct perf_evlist *evlist); +struct perf_evsel *perf_evlist__reset_weak_group (struct perf_evlist *evlist, +struct perf_evsel *evsel); +#endif /* __PERF_EVLIST_H */