Messages in this thread | | | Date | Mon, 27 Sep 2021 09:42:44 -0300 | From | Arnaldo Carvalho de Melo <> | Subject | Re: [PATCH 2/2] perf iostat: Fix Segmentation fault from NULL 'struct perf_counts_values *' |
| |
Em Mon, Sep 27, 2021 at 04:11:15PM +0800, Like Xu escreveu: > From: Like Xu <likexu@tencent.com> > > If the perf-iostat user specifies two or more iio_root_ports and > also specifies the cpu(s) by -C which is not *connected to all* > the above iio ports, the iostat_print_metric() will run into trouble: > > For example: > > $ perf iostat list > S0-uncore_iio_0<0000:16> > S1-uncore_iio_0<0000:97> # <--- CPU 1 is located in the socket S0 > > $ perf iostat 0000:16,0000:97 -C 1 -- ls > port Inbound Read(MB) Inbound Write(MB) Outbound Read(MB) Outbound > Write(MB) ../perf-iostat: line 12: 104418 Segmentation fault > (core dumped) perf stat --iostat$DELIMITER$* > > The core-dump stack says, in the above corner case, the returned > (struct perf_counts_values *) count will be NULL, and the caller > iostat_print_metric() apparently doesn't not handle this case. > > 433 struct perf_counts_values *count = perf_counts(evsel->counts, die, 0); > 434 > 435 if (count->run && count->ena) { > (gdb) p count > $1 = (struct perf_counts_values *) 0x0 > > The deeper reason is that there are actually no statistics from the user > specified pair "iostat 0000:X, -C (disconnected) Y ", but let's fix it with > minimum cost by adding a NULL check in the user space.
Added:
Fixes: f9ed693e8bc0e7de ("perf stat: Enable iostat mode for x86 platforms")
Please do that next time,
- Arnaldo
> Signed-off-by: Like Xu <likexu@tencent.com> > --- > tools/perf/arch/x86/util/iostat.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/tools/perf/arch/x86/util/iostat.c b/tools/perf/arch/x86/util/iostat.c > index eeafe97b8105..792cd75ade33 100644 > --- a/tools/perf/arch/x86/util/iostat.c > +++ b/tools/perf/arch/x86/util/iostat.c > @@ -432,7 +432,7 @@ void iostat_print_metric(struct perf_stat_config *config, struct evsel *evsel, > u8 die = ((struct iio_root_port *)evsel->priv)->die; > struct perf_counts_values *count = perf_counts(evsel->counts, die, 0); > > - if (count->run && count->ena) { > + if (count && count->run && count->ena) { > if (evsel->prev_raw_counts && !out->force_header) { > struct perf_counts_values *prev_count = > perf_counts(evsel->prev_raw_counts, die, 0); > -- > 2.32.0
--
- Arnaldo
| |