perf evsel: Fix use of inherit
perf stat doesn't mmap and its perfectly fine for it to use task-bound counters with inheritance. So set the attr.inherit on the caller and leave the syscall itself to validate it. When the mmap fails perf_evlist__mmap will just emit a warning if this is the failure reason. Reported-by: Peter Zijlstra <peterz@infradead.org> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Tom Zanussi <tzanussi@gmail.com> Link: http://lkml.kernel.org/r/20110414170121.GC3229@ghostprotocols.net Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
@@ -175,7 +175,7 @@ int __perf_evsel__read(struct perf_evsel *evsel,
|
||||
}
|
||||
|
||||
static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
|
||||
struct thread_map *threads, bool group, bool inherit)
|
||||
struct thread_map *threads, bool group)
|
||||
{
|
||||
int cpu, thread;
|
||||
unsigned long flags = 0;
|
||||
@@ -192,19 +192,6 @@ static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
|
||||
|
||||
for (cpu = 0; cpu < cpus->nr; cpu++) {
|
||||
int group_fd = -1;
|
||||
/*
|
||||
* Don't allow mmap() of inherited per-task counters. This
|
||||
* would create a performance issue due to all children writing
|
||||
* to the same buffer.
|
||||
*
|
||||
* FIXME:
|
||||
* Proper fix is not to pass 'inherit' to perf_evsel__open*,
|
||||
* but a 'flags' parameter, with 'group' folded there as well,
|
||||
* then introduce a PERF_O_{MMAP,GROUP,INHERIT} enum, and if
|
||||
* O_MMAP is set, emit a warning if cpu < 0 and O_INHERIT is
|
||||
* set. Lets go for the minimal fix first tho.
|
||||
*/
|
||||
evsel->attr.inherit = (cpus->map[cpu] >= 0) && inherit;
|
||||
|
||||
for (thread = 0; thread < threads->nr; thread++) {
|
||||
|
||||
@@ -253,7 +240,7 @@ static struct {
|
||||
};
|
||||
|
||||
int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
|
||||
struct thread_map *threads, bool group, bool inherit)
|
||||
struct thread_map *threads, bool group)
|
||||
{
|
||||
if (cpus == NULL) {
|
||||
/* Work around old compiler warnings about strict aliasing */
|
||||
@@ -263,19 +250,19 @@ int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
|
||||
if (threads == NULL)
|
||||
threads = &empty_thread_map.map;
|
||||
|
||||
return __perf_evsel__open(evsel, cpus, threads, group, inherit);
|
||||
return __perf_evsel__open(evsel, cpus, threads, group);
|
||||
}
|
||||
|
||||
int perf_evsel__open_per_cpu(struct perf_evsel *evsel,
|
||||
struct cpu_map *cpus, bool group, bool inherit)
|
||||
struct cpu_map *cpus, bool group)
|
||||
{
|
||||
return __perf_evsel__open(evsel, cpus, &empty_thread_map.map, group, inherit);
|
||||
return __perf_evsel__open(evsel, cpus, &empty_thread_map.map, group);
|
||||
}
|
||||
|
||||
int perf_evsel__open_per_thread(struct perf_evsel *evsel,
|
||||
struct thread_map *threads, bool group, bool inherit)
|
||||
struct thread_map *threads, bool group)
|
||||
{
|
||||
return __perf_evsel__open(evsel, &empty_cpu_map.map, threads, group, inherit);
|
||||
return __perf_evsel__open(evsel, &empty_cpu_map.map, threads, group);
|
||||
}
|
||||
|
||||
static int perf_event__parse_id_sample(const union perf_event *event, u64 type,
|
||||
|
Reference in New Issue
Block a user