perf cgroup: Simplify arguments when tracking multiple events
When using -G with one cgroup and -e with multiple events, only the
first event gets the correct cgroup setting, all events from the second
onwards will track system-wide events.
If the user wants to track multiple events for a specific cgroup, the
user must give parameters like the following:
$ perf stat -e e1 -e e2 -e e3 -G test,test,test
This patch simplify this case, just type one cgroup:
$ perf stat -e e1 -e e2 -e e3 -G test
$ mkdir -p /sys/fs/cgroup/perf_event/empty_cgroup
$ perf stat -e cycles -e cache-misses -a -I 1000 -G empty_cgroup
Before:
1.001007226 <not counted> cycles empty_cgroup
1.001007226 7,506 cache-misses
After:
1.000834097 <not counted> cycles empty_cgroup
1.000834097 <not counted> cache-misses empty_cgroup
Signed-off-by: weiping zhang <zhangweiping@didichuxing.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20180129154805.GA6284@localhost.didichuxing.com
[ Improved the doc text a bit, providing an example for cgroup + system wide counting ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
committed by
Arnaldo Carvalho de Melo
parent
42811d509d
commit
25f72f9ed8
@@ -308,7 +308,11 @@ can be provided. Each cgroup is applied to the corresponding event, i.e., first
|
|||||||
to first event, second cgroup to second event and so on. It is possible to provide
|
to first event, second cgroup to second event and so on. It is possible to provide
|
||||||
an empty cgroup (monitor all the time) using, e.g., -G foo,,bar. Cgroups must have
|
an empty cgroup (monitor all the time) using, e.g., -G foo,,bar. Cgroups must have
|
||||||
corresponding events, i.e., they always refer to events defined earlier on the command
|
corresponding events, i.e., they always refer to events defined earlier on the command
|
||||||
line.
|
line. If the user wants to track multiple events for a specific cgroup, the user can
|
||||||
|
use '-e e1 -e e2 -G foo,foo' or just use '-e e1 -e e2 -G foo'.
|
||||||
|
|
||||||
|
If wanting to monitor, say, 'cycles' for a cgroup and also for system wide, this
|
||||||
|
command line can be used: 'perf stat -e cycles -G cgroup_name -a -e cycles'.
|
||||||
|
|
||||||
-b::
|
-b::
|
||||||
--branch-any::
|
--branch-any::
|
||||||
|
|||||||
@@ -118,7 +118,11 @@ can be provided. Each cgroup is applied to the corresponding event, i.e., first
|
|||||||
to first event, second cgroup to second event and so on. It is possible to provide
|
to first event, second cgroup to second event and so on. It is possible to provide
|
||||||
an empty cgroup (monitor all the time) using, e.g., -G foo,,bar. Cgroups must have
|
an empty cgroup (monitor all the time) using, e.g., -G foo,,bar. Cgroups must have
|
||||||
corresponding events, i.e., they always refer to events defined earlier on the command
|
corresponding events, i.e., they always refer to events defined earlier on the command
|
||||||
line.
|
line. If the user wants to track multiple events for a specific cgroup, the user can
|
||||||
|
use '-e e1 -e e2 -G foo,foo' or just use '-e e1 -e e2 -G foo'.
|
||||||
|
|
||||||
|
If wanting to monitor, say, 'cycles' for a cgroup and also for system wide, this
|
||||||
|
command line can be used: 'perf stat -e cycles -G cgroup_name -a -e cycles'.
|
||||||
|
|
||||||
-o file::
|
-o file::
|
||||||
--output file::
|
--output file::
|
||||||
|
|||||||
@@ -157,9 +157,11 @@ int parse_cgroups(const struct option *opt __maybe_unused, const char *str,
|
|||||||
int unset __maybe_unused)
|
int unset __maybe_unused)
|
||||||
{
|
{
|
||||||
struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
|
struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
|
||||||
|
struct perf_evsel *counter;
|
||||||
|
struct cgroup_sel *cgrp = NULL;
|
||||||
const char *p, *e, *eos = str + strlen(str);
|
const char *p, *e, *eos = str + strlen(str);
|
||||||
char *s;
|
char *s;
|
||||||
int ret;
|
int ret, i;
|
||||||
|
|
||||||
if (list_empty(&evlist->entries)) {
|
if (list_empty(&evlist->entries)) {
|
||||||
fprintf(stderr, "must define events before cgroups\n");
|
fprintf(stderr, "must define events before cgroups\n");
|
||||||
@@ -188,5 +190,18 @@ int parse_cgroups(const struct option *opt __maybe_unused, const char *str,
|
|||||||
break;
|
break;
|
||||||
str = p+1;
|
str = p+1;
|
||||||
}
|
}
|
||||||
|
/* for the case one cgroup combine to multiple events */
|
||||||
|
i = 0;
|
||||||
|
if (nr_cgroups == 1) {
|
||||||
|
evlist__for_each_entry(evlist, counter) {
|
||||||
|
if (i == 0)
|
||||||
|
cgrp = counter->cgrp;
|
||||||
|
else {
|
||||||
|
counter->cgrp = cgrp;
|
||||||
|
refcount_inc(&cgrp->refcnt);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user