Commit fc705fec authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf evlist: Fix id index for heterogeneous systems

perf_evlist__set_sid_idx() updates perf_sample_id with the evlist map
index, CPU number and TID. It is passed indexes to the evsel's cpu and
thread maps, but references the evlist's maps instead. That results in
using incorrect CPU numbers on heterogeneous systems. Fix it by using
evsel maps.

The id index (PERF_RECORD_ID_INDEX) is used by AUX area tracing when in
sampling mode. Having an incorrect CPU number causes the trace data to
be attributed to the wrong CPU, and can result in decoder errors because
the trace data is then associated with the wrong process.

Committer notes:

Keep the class prefix convention in the function name, switching from
perf_evlist__set_sid_idx() to perf_evsel__set_sid_idx().

Fixes: 3c659eed ("perf tools: Add id index")
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lore.kernel.org/lkml/20210121125446.11287-1-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 9f29bd8b
...@@ -367,21 +367,13 @@ static struct perf_mmap* perf_evlist__alloc_mmap(struct perf_evlist *evlist, boo ...@@ -367,21 +367,13 @@ static struct perf_mmap* perf_evlist__alloc_mmap(struct perf_evlist *evlist, boo
return map; return map;
} }
static void perf_evlist__set_sid_idx(struct perf_evlist *evlist, static void perf_evsel__set_sid_idx(struct perf_evsel *evsel, int idx, int cpu, int thread)
struct perf_evsel *evsel, int idx, int cpu,
int thread)
{ {
struct perf_sample_id *sid = SID(evsel, cpu, thread); struct perf_sample_id *sid = SID(evsel, cpu, thread);
sid->idx = idx; sid->idx = idx;
if (evlist->cpus && cpu >= 0) sid->cpu = perf_cpu_map__cpu(evsel->cpus, cpu);
sid->cpu = evlist->cpus->map[cpu]; sid->tid = perf_thread_map__pid(evsel->threads, thread);
else
sid->cpu = -1;
if (!evsel->system_wide && evlist->threads && thread >= 0)
sid->tid = perf_thread_map__pid(evlist->threads, thread);
else
sid->tid = -1;
} }
static struct perf_mmap* static struct perf_mmap*
...@@ -500,8 +492,7 @@ mmap_per_evsel(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops, ...@@ -500,8 +492,7 @@ mmap_per_evsel(struct perf_evlist *evlist, struct perf_evlist_mmap_ops *ops,
if (perf_evlist__id_add_fd(evlist, evsel, cpu, thread, if (perf_evlist__id_add_fd(evlist, evsel, cpu, thread,
fd) < 0) fd) < 0)
return -1; return -1;
perf_evlist__set_sid_idx(evlist, evsel, idx, cpu, perf_evsel__set_sid_idx(evsel, idx, cpu, thread);
thread);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment