Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752261AbdGMNLt (ORCPT ); Thu, 13 Jul 2017 09:11:49 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:34085 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751244AbdGMNLs (ORCPT ); Thu, 13 Jul 2017 09:11:48 -0400 Subject: Re: [PATCH 3/4] perf annotate: Support --show-nr-samples option To: Arnaldo Carvalho de Melo Cc: linux-kernel@vger.kernel.org, Namhyung Kim , Milian Wolff , Jiri Olsa References: <1499811254-9354-1-git-send-email-treeze.taeung@gmail.com> <20170712201345.GS27350@kernel.org> From: Taeung Song Message-ID: <7f17b980-6188-785e-f67e-ce92426207c4@gmail.com> Date: Thu, 13 Jul 2017 22:11:44 +0900 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: <20170712201345.GS27350@kernel.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 8448 Lines: 214 Arnaldo, Additionally I think we need to calculate the percentage with the sample period, not number of samples like perf-report. What do you think about it ? For examples, perf-annotate figure out the percentage with number of samples like below ui/gtk/annotate.c: 23 static int perf_gtk__get_percent(char *buf, size_t size, struct symbol *sym, 24 struct disasm_line *dl, int evidx) 25 { ... 36 symhist = annotation__histogram(symbol__annotation(sym), evidx); 37 if (!symbol_conf.event_group && !symhist->addr[dl->offset]) 38 return 0; 39 40 percent = 100.0 * symhist->addr[dl->offset] / symhist->sum; But perf-report do it with the sample period like below. ui/hist.c: 363 HPP_PERCENT_FNS(overhead, period) 364 HPP_PERCENT_FNS(overhead_sys, period_sys) 365 HPP_PERCENT_FNS(overhead_us, period_us) 366 HPP_PERCENT_FNS(overhead_guest_sys, period_guest_sys) 367 HPP_PERCENT_FNS(overhead_guest_us, period_guest_us) 368 HPP_PERCENT_ACC_FNS(overhead_acc, period) Thanks, Taeung On 07/13/2017 05:13 AM, Arnaldo Carvalho de Melo wrote: > Em Wed, Jul 12, 2017 at 07:14:14AM +0900, Taeung Song escreveu: >> Add --show-nr-samples option to perf-annotate >> so that it corresponds with perf-report. >> Additionally h->sum is properly renamed h->nr_samples. > > Please first do a patch renaming ->sum to ->nr_samples, then a patch > supportign --show-nr-samples. > > We can have this new --show-nr-samples option, but perhaps the best way > would be to have a hotkey (I guess we have for period, right) for this? > > At some point would be good to have some 'S' or other hotkey to save the > current set of output modifiers (nr-samples column, period column, etc) > in the .perfconfig file. > > - Arnaldo > >> Cc: Namhyung Kim >> Cc: Milian Wolff >> Cc: Jiri Olsa >> Signed-off-by: Taeung Song >> --- >> tools/perf/builtin-annotate.c | 2 ++ >> tools/perf/ui/gtk/annotate.c | 2 +- >> tools/perf/util/annotate.c | 30 +++++++++++++++++------------- >> tools/perf/util/annotate.h | 2 +- >> 4 files changed, 21 insertions(+), 15 deletions(-) >> >> diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c >> index f314661..3cb0223 100644 >> --- a/tools/perf/builtin-annotate.c >> +++ b/tools/perf/builtin-annotate.c >> @@ -444,6 +444,8 @@ int cmd_annotate(int argc, const char **argv) >> "Show event group information together"), >> OPT_BOOLEAN(0, "show-total-period", &symbol_conf.show_total_period, >> "Show a column with the sum of periods"), >> + OPT_BOOLEAN('n', "show-nr-samples", &symbol_conf.show_nr_samples, >> + "Show a column with the number of samples"), >> OPT_CALLBACK_DEFAULT(0, "stdio-color", NULL, "mode", >> "'always' (default), 'never' or 'auto' only applicable to --stdio mode", >> stdio__config_color, "always"), >> diff --git a/tools/perf/ui/gtk/annotate.c b/tools/perf/ui/gtk/annotate.c >> index d736fd5..0217619 100644 >> --- a/tools/perf/ui/gtk/annotate.c >> +++ b/tools/perf/ui/gtk/annotate.c >> @@ -37,7 +37,7 @@ static int perf_gtk__get_percent(char *buf, size_t size, struct symbol *sym, >> if (!symbol_conf.event_group && !symhist->addr[dl->offset].nr_samples) >> return 0; >> >> - percent = 100.0 * symhist->addr[dl->offset].nr_samples / symhist->sum; >> + percent = 100.0 * symhist->addr[dl->offset].nr_samples / symhist->nr_samples; >> >> markup = perf_gtk__get_percent_color(percent); >> if (markup) >> diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c >> index f7aeb5f..b19e734 100644 >> --- a/tools/perf/util/annotate.c >> +++ b/tools/perf/util/annotate.c >> @@ -713,7 +713,7 @@ static int __symbol__inc_addr_samples(struct symbol *sym, struct map *map, >> >> offset = addr - sym->start; >> h = annotation__histogram(notes, evidx); >> - h->sum++; >> + h->nr_samples++; >> h->addr[offset].nr_samples++; >> >> pr_debug3("%#" PRIx64 " %s: period++ [addr: %#" PRIx64 ", %#" PRIx64 >> @@ -837,7 +837,7 @@ int hist_entry__inc_addr_samples(struct hist_entry *he, struct perf_sample *samp >> >> offset = addr - sym->start; >> h = annotation__histogram(notes, evidx); >> - h->sum++; >> + h->nr_samples++; >> h->addr[offset].nr_samples++; >> h->total_period += sample->period; >> h->addr[offset].period += sample->period; >> @@ -985,10 +985,10 @@ double disasm__calc_percent(struct annotation *notes, int evidx, s64 offset, >> p += h->addr[offset++].period; >> } >> >> - if (h->sum) { >> + if (h->nr_samples) { >> *nr_samples = hits; >> *period = p; >> - percent = 100.0 * hits / h->sum; >> + percent = 100.0 * hits / h->nr_samples; >> } >> } >> >> @@ -1165,6 +1165,9 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st >> if (symbol_conf.show_total_period) >> color_fprintf(stdout, color, " %11" PRIu64, >> period); >> + else if (symbol_conf.show_nr_samples) >> + color_fprintf(stdout, color, " %7" PRIu64, >> + nr_samples); >> else >> color_fprintf(stdout, color, " %7.2f", percent); >> } >> @@ -1711,13 +1714,13 @@ static int symbol__get_source_line(struct symbol *sym, struct map *map, >> struct sym_hist *h = annotation__histogram(notes, evidx); >> struct rb_root tmp_root = RB_ROOT; >> int nr_pcnt = 1; >> - u64 h_sum = h->sum; >> + u64 h_sum = h->nr_samples; >> size_t sizeof_src_line = sizeof(struct source_line); >> >> if (perf_evsel__is_group_event(evsel)) { >> for (i = 1; i < evsel->nr_members; i++) { >> h = annotation__histogram(notes, evidx + i); >> - h_sum += h->sum; >> + h_sum += h->nr_samples; >> } >> nr_pcnt = evsel->nr_members; >> sizeof_src_line += (nr_pcnt - 1) * sizeof(src_line->samples); >> @@ -1743,8 +1746,8 @@ static int symbol__get_source_line(struct symbol *sym, struct map *map, >> >> h = annotation__histogram(notes, evidx + k); >> nr_samples = h->addr[i].nr_samples; >> - if (h->sum) >> - percent = 100.0 * nr_samples / h->sum; >> + if (h->nr_samples) >> + percent = 100.0 * nr_samples / h->nr_samples; >> >> if (percent > percent_max) >> percent_max = percent; >> @@ -1816,7 +1819,7 @@ static void symbol__annotate_hits(struct symbol *sym, struct perf_evsel *evsel) >> if (h->addr[offset].nr_samples != 0) >> printf("%*" PRIx64 ": %" PRIu64 "\n", BITS_PER_LONG / 2, >> sym->start + offset, h->addr[offset].nr_samples); >> - printf("%*s: %" PRIu64 "\n", BITS_PER_LONG / 2, "h->sum", h->sum); >> + printf("%*s: %" PRIu64 "\n", BITS_PER_LONG / 2, "h->nr_samples", h->nr_samples); >> } >> >> int symbol__annotate_printf(struct symbol *sym, struct map *map, >> @@ -1857,9 +1860,10 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map, >> >> graph_dotted_len = printf(" %-*.*s| Source code & Disassembly of %s for %s (%" PRIu64 " %s)\n", >> width, width, >> - symbol_conf.show_total_period ? "Event count" : "Percent", >> + symbol_conf.show_total_period ? "Event count" : >> + symbol_conf.show_nr_samples ? "Samples" : "Percent", >> d_filename, evsel_name, >> - symbol_conf.show_total_period ? h->total_period : h->sum, >> + symbol_conf.show_total_period ? h->total_period : h->nr_samples, >> symbol_conf.show_total_period ? "event count" : "samples"); >> >> printf("%-*.*s----\n", >> @@ -1924,10 +1928,10 @@ void symbol__annotate_decay_histogram(struct symbol *sym, int evidx) >> struct sym_hist *h = annotation__histogram(notes, evidx); >> int len = symbol__size(sym), offset; >> >> - h->sum = 0; >> + h->nr_samples = 0; >> for (offset = 0; offset < len; ++offset) { >> h->addr[offset].nr_samples = h->addr[offset].nr_samples * 7 / 8; >> - h->sum += h->addr[offset].nr_samples; >> + h->nr_samples += h->addr[offset].nr_samples; >> } >> } >> >> diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h >> index 6b2e645..e4d444a 100644 >> --- a/tools/perf/util/annotate.h >> +++ b/tools/perf/util/annotate.h >> @@ -86,7 +86,7 @@ struct sym_sample { >> }; >> >> struct sym_hist { >> - u64 sum; >> + u64 nr_samples; >> u64 total_period; >> struct sym_sample addr[0]; >> }; >> -- >> 2.7.4