libperf evlist: Allow mixing per-thread and per-cpu mmaps
mmap_per_evsel() will skip events that do not match the CPU, so all CPUs can be iterated in any case. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Acked-by: Ian Rogers <irogers@google.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Leo Yan <leo.yan@linaro.org> Link: https://lore.kernel.org/r/20220524075436.29144-11-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
7be1fedd2a
commit
ae4f8ae16a
1 changed files with 7 additions and 29 deletions
|
@ -512,29 +512,6 @@ mmap_per_evsel(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
mmap_per_thread(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops,
|
|
||||||
struct perf_mmap_param *mp)
|
|
||||||
{
|
|
||||||
int thread;
|
|
||||||
int nr_threads = perf_thread_map__nr(evlist->threads);
|
|
||||||
|
|
||||||
for (thread = 0; thread < nr_threads; thread++) {
|
|
||||||
int output = -1;
|
|
||||||
int output_overwrite = -1;
|
|
||||||
|
|
||||||
if (mmap_per_evsel(evlist, ops, thread, mp, 0, thread,
|
|
||||||
&output, &output_overwrite))
|
|
||||||
goto out_unmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
out_unmap:
|
|
||||||
perf_evlist__munmap(evlist);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mmap_per_cpu(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops,
|
mmap_per_cpu(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops,
|
||||||
struct perf_mmap_param *mp)
|
struct perf_mmap_param *mp)
|
||||||
|
@ -565,9 +542,14 @@ static int perf_evlist__nr_mmaps(struct perf_evlist *evlist)
|
||||||
{
|
{
|
||||||
int nr_mmaps;
|
int nr_mmaps;
|
||||||
|
|
||||||
|
/* One for each CPU */
|
||||||
nr_mmaps = perf_cpu_map__nr(evlist->all_cpus);
|
nr_mmaps = perf_cpu_map__nr(evlist->all_cpus);
|
||||||
if (perf_cpu_map__empty(evlist->all_cpus))
|
if (perf_cpu_map__empty(evlist->all_cpus)) {
|
||||||
nr_mmaps = perf_thread_map__nr(evlist->threads);
|
/* Plus one for each thread */
|
||||||
|
nr_mmaps += perf_thread_map__nr(evlist->threads);
|
||||||
|
/* Minus the per-thread CPU (-1) */
|
||||||
|
nr_mmaps -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
return nr_mmaps;
|
return nr_mmaps;
|
||||||
}
|
}
|
||||||
|
@ -577,7 +559,6 @@ int perf_evlist__mmap_ops(struct perf_evlist *evlist,
|
||||||
struct perf_mmap_param *mp)
|
struct perf_mmap_param *mp)
|
||||||
{
|
{
|
||||||
struct perf_evsel *evsel;
|
struct perf_evsel *evsel;
|
||||||
const struct perf_cpu_map *cpus = evlist->all_cpus;
|
|
||||||
|
|
||||||
if (!ops || !ops->get || !ops->mmap)
|
if (!ops || !ops->get || !ops->mmap)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -596,9 +577,6 @@ int perf_evlist__mmap_ops(struct perf_evlist *evlist,
|
||||||
if (evlist->pollfd.entries == NULL && perf_evlist__alloc_pollfd(evlist) < 0)
|
if (evlist->pollfd.entries == NULL && perf_evlist__alloc_pollfd(evlist) < 0)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
if (perf_cpu_map__empty(cpus))
|
|
||||||
return mmap_per_thread(evlist, ops, mp);
|
|
||||||
|
|
||||||
return mmap_per_cpu(evlist, ops, mp);
|
return mmap_per_cpu(evlist, ops, mp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue