* [PATCH v1 1/2] perf, tools: Move perf_evsel__reset_weak_group into evlist
@ 2018-10-01 19:59 Andi Kleen
2018-10-01 19:59 ` [PATCH v1 2/2] perf record: Support weak groups Andi Kleen
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Andi Kleen @ 2018-10-01 19:59 UTC (permalink / raw)
To: acme; +Cc: jolsa, linux-kernel, Andi Kleen
From: Andi Kleen <ak@linux.intel.com>
- 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
Signed-off-by: Andi Kleen <ak@linux.intel.com>
---
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(-)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 08a1e64078ca..e60f6991dbb8 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -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;
}
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index e7a4b31a84fb..de90f9097e97 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -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;
+}
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index dc66436add98..9919eed6d15b 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -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 */
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v1 2/2] perf record: Support weak groups
2018-10-01 19:59 [PATCH v1 1/2] perf, tools: Move perf_evsel__reset_weak_group into evlist Andi Kleen
@ 2018-10-01 19:59 ` Andi Kleen
2018-10-02 15:42 ` Jiri Olsa
2018-11-06 19:13 ` [tip:perf/urgent] " tip-bot for Andi Kleen
2018-10-02 15:41 ` [PATCH v1 1/2] perf, tools: Move perf_evsel__reset_weak_group into evlist Jiri Olsa
2018-11-06 19:12 ` [tip:perf/urgent] perf evlist: " tip-bot for Andi Kleen
2 siblings, 2 replies; 6+ messages in thread
From: Andi Kleen @ 2018-10-01 19:59 UTC (permalink / raw)
To: acme; +Cc: jolsa, linux-kernel, Andi Kleen
From: Andi Kleen <ak@linux.intel.com>
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) ]
Signed-off-by: Andi Kleen <ak@linux.intel.com>
---
tools/perf/Documentation/perf-list.txt | 1 -
tools/perf/builtin-record.c | 7 ++++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/tools/perf/Documentation/perf-list.txt b/tools/perf/Documentation/perf-list.txt
index 11300dbe35c5..c50ed1177984 100644
--- a/tools/perf/Documentation/perf-list.txt
+++ b/tools/perf/Documentation/perf-list.txt
@@ -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:
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 22ebeb92ac51..504d89d67b3a 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -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));
--
2.17.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v1 1/2] perf, tools: Move perf_evsel__reset_weak_group into evlist
2018-10-01 19:59 [PATCH v1 1/2] perf, tools: Move perf_evsel__reset_weak_group into evlist Andi Kleen
2018-10-01 19:59 ` [PATCH v1 2/2] perf record: Support weak groups Andi Kleen
@ 2018-10-02 15:41 ` Jiri Olsa
2018-11-06 19:12 ` [tip:perf/urgent] perf evlist: " tip-bot for Andi Kleen
2 siblings, 0 replies; 6+ messages in thread
From: Jiri Olsa @ 2018-10-02 15:41 UTC (permalink / raw)
To: Andi Kleen; +Cc: acme, jolsa, linux-kernel, Andi Kleen
On Mon, Oct 01, 2018 at 12:59:26PM -0700, Andi Kleen wrote:
> From: Andi Kleen <ak@linux.intel.com>
>
> - 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
>
> Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
thanks,
jirka
> ---
> 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(-)
>
> diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
> index 08a1e64078ca..e60f6991dbb8 100644
> --- a/tools/perf/builtin-stat.c
> +++ b/tools/perf/builtin-stat.c
> @@ -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;
> }
>
> diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
> index e7a4b31a84fb..de90f9097e97 100644
> --- a/tools/perf/util/evlist.c
> +++ b/tools/perf/util/evlist.c
> @@ -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;
> +}
> diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
> index dc66436add98..9919eed6d15b 100644
> --- a/tools/perf/util/evlist.h
> +++ b/tools/perf/util/evlist.h
> @@ -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 */
> --
> 2.17.1
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 2/2] perf record: Support weak groups
2018-10-01 19:59 ` [PATCH v1 2/2] perf record: Support weak groups Andi Kleen
@ 2018-10-02 15:42 ` Jiri Olsa
2018-11-06 19:13 ` [tip:perf/urgent] " tip-bot for Andi Kleen
1 sibling, 0 replies; 6+ messages in thread
From: Jiri Olsa @ 2018-10-02 15:42 UTC (permalink / raw)
To: Andi Kleen; +Cc: acme, jolsa, linux-kernel, Andi Kleen
On Mon, Oct 01, 2018 at 12:59:27PM -0700, Andi Kleen wrote:
> From: Andi Kleen <ak@linux.intel.com>
>
> 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) ]
>
> Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
thanks,
jirka
^ permalink raw reply [flat|nested] 6+ messages in thread
* [tip:perf/urgent] perf evlist: Move perf_evsel__reset_weak_group into evlist
2018-10-01 19:59 [PATCH v1 1/2] perf, tools: Move perf_evsel__reset_weak_group into evlist Andi Kleen
2018-10-01 19:59 ` [PATCH v1 2/2] perf record: Support weak groups Andi Kleen
2018-10-02 15:41 ` [PATCH v1 1/2] perf, tools: Move perf_evsel__reset_weak_group into evlist Jiri Olsa
@ 2018-11-06 19:12 ` tip-bot for Andi Kleen
2 siblings, 0 replies; 6+ messages in thread
From: tip-bot for Andi Kleen @ 2018-11-06 19:12 UTC (permalink / raw)
To: linux-tip-commits; +Cc: hpa, mingo, linux-kernel, acme, tglx, jolsa, ak
Commit-ID: c3537fc251503af18085b8f84126d13743663970
Gitweb: https://git.kernel.org/tip/c3537fc251503af18085b8f84126d13743663970
Author: Andi Kleen <ak@linux.intel.com>
AuthorDate: Mon, 1 Oct 2018 12:59:26 -0700
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
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
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20181001195927.14211-1-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
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(-)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index d1028d7755bb..a635abfa77b6 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -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;
}
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index e88e6f9b1463..668d2a9ef0f4 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -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;
+}
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index dc66436add98..9919eed6d15b 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -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 */
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [tip:perf/urgent] perf record: Support weak groups
2018-10-01 19:59 ` [PATCH v1 2/2] perf record: Support weak groups Andi Kleen
2018-10-02 15:42 ` Jiri Olsa
@ 2018-11-06 19:13 ` tip-bot for Andi Kleen
1 sibling, 0 replies; 6+ messages in thread
From: tip-bot for Andi Kleen @ 2018-11-06 19:13 UTC (permalink / raw)
To: linux-tip-commits; +Cc: tglx, mingo, jolsa, ak, linux-kernel, acme, hpa
Commit-ID: cf99ad1424c54fc84b84d3a3deb57a48c340c30a
Gitweb: https://git.kernel.org/tip/cf99ad1424c54fc84b84d3a3deb57a48c340c30a
Author: Andi Kleen <ak@linux.intel.com>
AuthorDate: Mon, 1 Oct 2018 12:59:27 -0700
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
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) ]
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20181001195927.14211-2-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/Documentation/perf-list.txt | 1 -
tools/perf/builtin-record.c | 7 ++++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/tools/perf/Documentation/perf-list.txt b/tools/perf/Documentation/perf-list.txt
index 236b9b97dfdb..667c14e56031 100644
--- a/tools/perf/Documentation/perf-list.txt
+++ b/tools/perf/Documentation/perf-list.txt
@@ -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:
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 10cf889c6d75..488779bc4c8d 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -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));
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-11-06 19:13 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-01 19:59 [PATCH v1 1/2] perf, tools: Move perf_evsel__reset_weak_group into evlist Andi Kleen
2018-10-01 19:59 ` [PATCH v1 2/2] perf record: Support weak groups Andi Kleen
2018-10-02 15:42 ` Jiri Olsa
2018-11-06 19:13 ` [tip:perf/urgent] " tip-bot for Andi Kleen
2018-10-02 15:41 ` [PATCH v1 1/2] perf, tools: Move perf_evsel__reset_weak_group into evlist Jiri Olsa
2018-11-06 19:12 ` [tip:perf/urgent] perf evlist: " tip-bot for Andi Kleen
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).