Messages in this thread | | | From | Jiri Olsa <> | Date | Tue, 6 Sep 2022 14:59:46 +0200 | Subject | Re: [PATCH V2] libperf evlist: Fix per-thread mmaps for multi-threaded targets |
| |
On Mon, Sep 05, 2022 at 02:42:09PM +0300, Adrian Hunter wrote:
SNIP
> diff --git a/tools/lib/perf/evlist.c b/tools/lib/perf/evlist.c > index e6c98a6e3908..6b1bafe267a4 100644 > --- a/tools/lib/perf/evlist.c > +++ b/tools/lib/perf/evlist.c > @@ -486,6 +486,7 @@ mmap_per_evsel(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops, > if (ops->idx) > ops->idx(evlist, evsel, mp, idx); > > + pr_debug("idx %d: mmapping fd %d\n", idx, *output); > if (ops->mmap(map, mp, *output, evlist_cpu) < 0) > return -1; > > @@ -494,6 +495,7 @@ mmap_per_evsel(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops, > if (!idx) > perf_evlist__set_mmap_first(evlist, map, overwrite); > } else { > + pr_debug("idx %d: set output fd %d -> %d\n", idx, fd, *output); > if (ioctl(fd, PERF_EVENT_IOC_SET_OUTPUT, *output) != 0) > return -1; > > @@ -519,6 +521,48 @@ mmap_per_evsel(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops, > return 0; > } > > +static int > +mmap_per_thread(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops, > + struct perf_mmap_param *mp) > +{ > + int nr_threads = perf_thread_map__nr(evlist->threads); > + int nr_cpus = perf_cpu_map__nr(evlist->all_cpus); > + int cpu, thread, idx = 0; > + int nr_mmaps = 0; > + > + pr_debug("%s: nr cpu values (may include -1) %d nr threads %d\n", > + __func__, nr_cpus, nr_threads);
-1 as cpu value is only for 'empty' perf_cpu_map, right?
> + > + /* per-thread mmaps */ > + for (thread = 0; thread < nr_threads; thread++, idx++) { > + int output = -1; > + int output_overwrite = -1; > + > + if (mmap_per_evsel(evlist, ops, idx, mp, 0, thread, &output, > + &output_overwrite, &nr_mmaps)) > + goto out_unmap; > + } > + > + /* system-wide mmaps i.e. per-cpu */ > + for (cpu = 1; cpu < nr_cpus; cpu++, idx++) { > + int output = -1; > + int output_overwrite = -1; > + > + if (mmap_per_evsel(evlist, ops, idx, mp, cpu, 0, &output, > + &output_overwrite, &nr_mmaps)) > + goto out_unmap; > + }
will this loop be executed? we are in here because all_cpus is empty, right?
thanks, jirka
> + > + if (nr_mmaps != evlist->nr_mmaps) > + pr_err("Miscounted nr_mmaps %d vs %d\n", nr_mmaps, evlist->nr_mmaps); > + > + return 0; > + > +out_unmap: > + perf_evlist__munmap(evlist); > + return -1; > +}
SNIP
| |