perf evlist: Avoid iteration for empty evlist.
As seen with 'perf stat --null ..' and reported in:
https://lore.kernel.org/lkml/YjCLcpcX2peeQVCH@kernel.org/
v2. Avoids setting evsel in the empty list case as suggested by Jiri Olsa.
Committer testing:
Before:
$ perf stat --null sleep 1
Segmentation fault (core dumped)
$
After:
$ perf stat --null sleep 1
Performance counter stats for 'sleep 1':
1.010340646 seconds time elapsed
0.001420000 seconds user
0.000000000 seconds sys
$
Fixes: 472832d2c0
("perf evlist: Refactor evlist__for_each_cpu()")
Reported-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20220317231643.550902-1-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
3cf6a32f3f
commit
8b464eac97
|
@ -346,7 +346,7 @@ struct evlist_cpu_iterator evlist__cpu_begin(struct evlist *evlist, struct affin
|
|||
{
|
||||
struct evlist_cpu_iterator itr = {
|
||||
.container = evlist,
|
||||
.evsel = evlist__first(evlist),
|
||||
.evsel = NULL,
|
||||
.cpu_map_idx = 0,
|
||||
.evlist_cpu_map_idx = 0,
|
||||
.evlist_cpu_map_nr = perf_cpu_map__nr(evlist->core.all_cpus),
|
||||
|
@ -354,16 +354,22 @@ struct evlist_cpu_iterator evlist__cpu_begin(struct evlist *evlist, struct affin
|
|||
.affinity = affinity,
|
||||
};
|
||||
|
||||
if (itr.affinity) {
|
||||
itr.cpu = perf_cpu_map__cpu(evlist->core.all_cpus, 0);
|
||||
affinity__set(itr.affinity, itr.cpu.cpu);
|
||||
itr.cpu_map_idx = perf_cpu_map__idx(itr.evsel->core.cpus, itr.cpu);
|
||||
/*
|
||||
* If this CPU isn't in the evsel's cpu map then advance through
|
||||
* the list.
|
||||
*/
|
||||
if (itr.cpu_map_idx == -1)
|
||||
evlist_cpu_iterator__next(&itr);
|
||||
if (evlist__empty(evlist)) {
|
||||
/* Ensure the empty list doesn't iterate. */
|
||||
itr.evlist_cpu_map_idx = itr.evlist_cpu_map_nr;
|
||||
} else {
|
||||
itr.evsel = evlist__first(evlist);
|
||||
if (itr.affinity) {
|
||||
itr.cpu = perf_cpu_map__cpu(evlist->core.all_cpus, 0);
|
||||
affinity__set(itr.affinity, itr.cpu.cpu);
|
||||
itr.cpu_map_idx = perf_cpu_map__idx(itr.evsel->core.cpus, itr.cpu);
|
||||
/*
|
||||
* If this CPU isn't in the evsel's cpu map then advance
|
||||
* through the list.
|
||||
*/
|
||||
if (itr.cpu_map_idx == -1)
|
||||
evlist_cpu_iterator__next(&itr);
|
||||
}
|
||||
}
|
||||
return itr;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue