Messages in this thread | | | Date | Thu, 21 Jan 2021 10:19:01 -0300 | From | Arnaldo Carvalho de Melo <> | Subject | Re: [PATCH] perf evlist: Fix id index for heterogeneous systems |
| |
Em Thu, Jan 21, 2021 at 02:54:46PM +0200, Adrian Hunter escreveu: > 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 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.
Can you please provide a Fixes: tag so that the stable@kernel.org guys can apply where appropriate?
Thanks,
- Arnaldo
> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> > --- > tools/lib/perf/evlist.c | 17 ++++------------- > 1 file changed, 4 insertions(+), 13 deletions(-) > > diff --git a/tools/lib/perf/evlist.c b/tools/lib/perf/evlist.c > index cfcdbd7be066..37be8042889f 100644 > --- a/tools/lib/perf/evlist.c > +++ b/tools/lib/perf/evlist.c > @@ -367,21 +367,13 @@ static struct perf_mmap* perf_evlist__alloc_mmap(struct perf_evlist *evlist, boo > return map; > } > > -static void perf_evlist__set_sid_idx(struct perf_evlist *evlist, > - struct perf_evsel *evsel, int idx, int cpu, > - int thread) > +static void set_sid_idx(struct perf_evsel *evsel, int idx, int cpu, int thread) > { > struct perf_sample_id *sid = SID(evsel, cpu, thread); > > sid->idx = idx; > - if (evlist->cpus && cpu >= 0) > - sid->cpu = evlist->cpus->map[cpu]; > - 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; > + sid->cpu = perf_cpu_map__cpu(evsel->cpus, cpu); > + sid->tid = perf_thread_map__pid(evsel->threads, thread); > } > > static struct perf_mmap* > @@ -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, > fd) < 0) > return -1; > - perf_evlist__set_sid_idx(evlist, evsel, idx, cpu, > - thread); > + set_sid_idx(evsel, idx, cpu, thread); > } > } > > -- > 2.17.1 >
--
- Arnaldo
| |