perf evsel: Auto allocate resources needed for some methods
Commit-ID: 4eed11d5e24540dc133003b6e8f904cb747ac4bb Gitweb: http://git.kernel.org/tip/4eed11d5e24540dc133003b6e8f904cb747ac4bb Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Tue, 4 Jan 2011 00:13:17 -0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 4 Jan 2011 00:31:32 -0200
perf evsel: Auto allocate resources needed for some methods
While writing the first user of the routines created from the ad-hoc routines in the existing builtins I noticed that the resulting set of calls was too long, reduce it by doing some best effort allocations.
Tools that need to operate on multiple threads and cpus should pre-allocate enough resources by explicitely calling the perf_evsel__alloc_{fd,counters} methods.
Cc: Frederic Weisbecker <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Mike Galbraith <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Stephane Eranian <[email protected]>
Cc: Tom Zanussi <[email protected]>
LKML-Reference: <new-submission>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/evsel.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-)
tools/perf/util/evsel.c +9 -0
@@ -66,6 +66,9 @@ int __perf_evsel__read_on_cpu(struct perf_evsel *evsel,if (FD (evsel, cpu, thread) <0 )return -EINVAL ; +if (evsel->counts ==NULL &&perf_evsel__alloc_counts (evsel, cpu +1 ) <0 ) +return -ENOMEM ; +if (readn (FD (evsel, cpu, thread), &count, nv *sizeof (u64)) <0 )return -errno;
@@ -129,6 +132,9 @@ int perf_evsel__open_per_cpu(struct perf_evsel *evsel, struct cpu_map *cpus) {int cpu; +if (evsel->fd ==NULL &&perf_evsel__alloc_fd (evsel, cpus->nr,1 ) <0 ) +return -1 ; +for (cpu =0 ; cpu < cpus->nr; cpu++) {FD (evsel, cpu,0 ) =sys_perf_event_open (&evsel->attr,-1 , cpus->map[cpu],-1 ,0 );
@@ -150,6 +156,9 @@ int perf_evsel__open_per_thread(struct perf_evsel *evsel, struct thread_map *thr {int thread; +if (evsel->fd ==NULL &&perf_evsel__alloc_fd (evsel,1 , threads->nr)) +return -1 ; +for (thread =0 ; thread < threads->nr; thread++) {FD (evsel,0 , thread) =sys_perf_event_open (&evsel->attr, threads->map[thread],-1 ,-1 ,0 );