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:
@ -12,6 +12,7 @@
|
||||
#include "evlist.h"
|
||||
#include "evsel.h"
|
||||
#include "util.h"
|
||||
#include "debug.h"
|
||||
|
||||
#include <sys/mman.h>
|
||||
|
||||
@ -250,15 +251,19 @@ int perf_evlist__alloc_mmap(struct perf_evlist *evlist)
|
||||
return evlist->mmap != NULL ? 0 : -ENOMEM;
|
||||
}
|
||||
|
||||
static int __perf_evlist__mmap(struct perf_evlist *evlist, int cpu, int prot,
|
||||
int mask, int fd)
|
||||
static int __perf_evlist__mmap(struct perf_evlist *evlist, struct perf_evsel *evsel,
|
||||
int cpu, int prot, int mask, int fd)
|
||||
{
|
||||
evlist->mmap[cpu].prev = 0;
|
||||
evlist->mmap[cpu].mask = mask;
|
||||
evlist->mmap[cpu].base = mmap(NULL, evlist->mmap_len, prot,
|
||||
MAP_SHARED, fd, 0);
|
||||
if (evlist->mmap[cpu].base == MAP_FAILED)
|
||||
if (evlist->mmap[cpu].base == MAP_FAILED) {
|
||||
if (evlist->cpus->map[cpu] == -1 && evsel->attr.inherit)
|
||||
ui__warning("Inherit is not allowed on per-task "
|
||||
"events using mmap.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
perf_evlist__add_pollfd(evlist, fd);
|
||||
return 0;
|
||||
@ -312,7 +317,8 @@ int perf_evlist__mmap(struct perf_evlist *evlist, int pages, bool overwrite)
|
||||
if (ioctl(fd, PERF_EVENT_IOC_SET_OUTPUT,
|
||||
FD(first_evsel, cpu, 0)) != 0)
|
||||
goto out_unmap;
|
||||
} else if (__perf_evlist__mmap(evlist, cpu, prot, mask, fd) < 0)
|
||||
} else if (__perf_evlist__mmap(evlist, evsel, cpu,
|
||||
prot, mask, fd) < 0)
|
||||
goto out_unmap;
|
||||
|
||||
if ((evsel->attr.read_format & PERF_FORMAT_ID) &&
|
||||
|
Reference in New Issue
Block a user