Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932446AbdCTSQQ (ORCPT ); Mon, 20 Mar 2017 14:16:16 -0400 Received: from mail.kernel.org ([198.145.29.136]:43888 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755504AbdCTSQK (ORCPT ); Mon, 20 Mar 2017 14:16:10 -0400 Date: Mon, 20 Mar 2017 15:15:59 -0300 From: Arnaldo Carvalho de Melo To: Taeung Song Cc: linux-kernel@vger.kernel.org, Jiri Olsa , Namhyung Kim , Ingo Molnar , Peter Zijlstra , Wang Nan , Masami Hiramatsu , Jiri Olsa Subject: Re: [PATCH 2/4] perf annotate: Avoid division by zero when calculating percent Message-ID: <20170320181559.GD27647@kernel.org> References: <1489978617-31396-1-git-send-email-treeze.taeung@gmail.com> <1489978617-31396-3-git-send-email-treeze.taeung@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1489978617-31396-3-git-send-email-treeze.taeung@gmail.com> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.8.0 (2017-02-23) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3502 Lines: 102 Em Mon, Mar 20, 2017 at 11:56:55AM +0900, Taeung Song escreveu: > Currently perf-annotate with --print-line can print > -nan(0x8000000000000) because of division by zero > when calculating percent. > > So if a sum of samples is zero, skip calculating percent. Tried to reproduce it here, couldn't, syswide record: [root@jouet ~]# perf evlist -v cycles: size: 112, { sample_period, sample_freq }: 4000, sample_type: IP|TID|TIME|CPU|PERIOD, disabled: 1, inherit: 1, mmap: 1, comm: 1, freq: 1, task: 1, sample_id_all: 1, exclude_guest: 1, mmap2: 1, comm_exec: 1 [root@jouet ~]# perf annotate --stdio -l 2> /dev/null | grep -i nan [root@jouet ~]# Can you please send me a perf.data file with this problem? I have to go thru the code to see how this can take place... - Arnaldo > Before: > > $ perf annotate --stdio -l > > Sorted summary for file /home/taeung/workspace/a.out > ---------------------------------------------- > > 32.89 -nan 7.04 a.c:38 > 25.14 -nan 0.00 a.c:34 > 16.26 -nan 56.34 a.c:31 > 15.88 -nan 1.41 a.c:37 > 5.67 -nan 0.00 a.c:39 > 1.13 -nan 35.21 a.c:26 > 0.95 -nan 0.00 a.c:44 > 0.57 -nan 0.00 a.c:32 > Percent | Source code & Disassembly of a.out for cycles (529 samples) > ----------------------------------------------------------------------------------------- > : > ... > > a.c:26 0.57 -nan 4.23 : 40081a: mov %edi,-0x24(%rbp) > a.c:26 0.00 -nan 9.86 : 40081d: mov %rsi,-0x30(%rbp) > > ... > > After: > > $ perf annotate --stdio -l > > Sorted summary for file /home/taeung/workspace/a.out > ---------------------------------------------- > > 32.89 0.00 7.04 a.c:38 > 25.14 0.00 0.00 a.c:34 > 16.26 0.00 56.34 a.c:31 > 15.88 0.00 1.41 a.c:37 > 5.67 0.00 0.00 a.c:39 > 1.13 0.00 35.21 a.c:26 > 0.95 0.00 0.00 a.c:44 > 0.57 0.00 0.00 a.c:32 > Percent | Source code & Disassembly of old for cycles (529 samples) > ----------------------------------------------------------------------------------------- > : > ... > > a.c:26 0.57 0.00 4.23 : 40081a: mov %edi,-0x24(%rbp) > a.c:26 0.00 0.00 9.86 : 40081d: mov %rsi,-0x30(%rbp) > > ... > > Cc: Namhyung Kim > Cc: Jiri Olsa > Signed-off-by: Taeung Song > --- > tools/perf/util/annotate.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c > index fc91c6b..9bb43cd 100644 > --- a/tools/perf/util/annotate.c > +++ b/tools/perf/util/annotate.c > @@ -1665,11 +1665,15 @@ static int symbol__get_source_line(struct symbol *sym, struct map *map, > src_line->nr_pcnt = nr_pcnt; > > for (k = 0; k < nr_pcnt; k++) { > + double percent = 0.0; > + > h = annotation__histogram(notes, evidx + k); > - src_line->samples[k].percent = 100.0 * h->addr[i] / h->sum; > + if (h->sum) > + percent = 100.0 * h->addr[i] / h->sum; > > - if (src_line->samples[k].percent > percent_max) > - percent_max = src_line->samples[k].percent; > + if (percent > percent_max) > + percent_max = percent; > + src_line->samples[k].percent = percent; > } > > if (percent_max <= 0.5) > -- > 2.7.4