Skip to content

Commit

Permalink
perf annotate: Check availability of annotate when processing samples
Browse files Browse the repository at this point in the history
The TUI of perf report and top support annotation, but stdio and GTK
don't.  So it should be checked before calling hist_entry__inc_addr_
samples() to avoid wasting resources that will never be used.

perf annotate need it regardless of UI and sort keys, so the check
of whether to allocate resources should be on the tools that have
annotate as an option in the TUI, 'report' and 'top', not on the
function called by all of them.

It caused perf annotate on ppc64 to produce zero output, since the
buckets were not being allocated.

Reported-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Anton Blanchard <anton@samba.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Namhyung Kim <namhyung.kim@lge.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1392859976-32760-1-git-send-email-namhyung@kernel.org
[ Renamed (report,top)__needs_annotate() to ui__has_annotation() ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Namhyung Kim authored and Arnaldo Carvalho de Melo committed Feb 24, 2014
1 parent a9d3f94 commit 48c65bd
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 19 deletions.
40 changes: 24 additions & 16 deletions tools/perf/builtin-report.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,14 +113,16 @@ static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_locati
if (!he)
return -ENOMEM;

err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
if (err)
goto out;
if (ui__has_annotation()) {
err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
if (err)
goto out;

mx = he->mem_info;
err = addr_map_symbol__inc_samples(&mx->daddr, evsel->idx);
if (err)
goto out;
mx = he->mem_info;
err = addr_map_symbol__inc_samples(&mx->daddr, evsel->idx);
if (err)
goto out;
}

evsel->hists.stats.total_period += cost;
hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
Expand Down Expand Up @@ -164,14 +166,18 @@ static int report__add_branch_hist_entry(struct perf_tool *tool, struct addr_loc
he = __hists__add_entry(&evsel->hists, al, parent, &bi[i], NULL,
1, 1, 0);
if (he) {
bx = he->branch_info;
err = addr_map_symbol__inc_samples(&bx->from, evsel->idx);
if (err)
goto out;

err = addr_map_symbol__inc_samples(&bx->to, evsel->idx);
if (err)
goto out;
if (ui__has_annotation()) {
bx = he->branch_info;
err = addr_map_symbol__inc_samples(&bx->from,
evsel->idx);
if (err)
goto out;

err = addr_map_symbol__inc_samples(&bx->to,
evsel->idx);
if (err)
goto out;
}

evsel->hists.stats.total_period += 1;
hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
Expand Down Expand Up @@ -205,7 +211,9 @@ static int report__add_hist_entry(struct perf_tool *tool, struct perf_evsel *evs
if (err)
goto out;

err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
if (ui__has_annotation())
err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);

evsel->hists.stats.total_period += sample->period;
hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
out:
Expand Down
6 changes: 4 additions & 2 deletions tools/perf/builtin-top.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ static void perf_top__record_precise_ip(struct perf_top *top,
{
struct annotation *notes;
struct symbol *sym;
int err;
int err = 0;

if (he == NULL || he->ms.sym == NULL ||
((top->sym_filter_entry == NULL ||
Expand All @@ -190,7 +190,9 @@ static void perf_top__record_precise_ip(struct perf_top *top,
return;

ip = he->ms.map->map_ip(he->ms.map, ip);
err = hist_entry__inc_addr_samples(he, counter, ip);

if (ui__has_annotation())
err = hist_entry__inc_addr_samples(he, counter, ip);

pthread_mutex_unlock(&notes->lock);

Expand Down
9 changes: 8 additions & 1 deletion tools/perf/util/annotate.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
*/

#include "util.h"
#include "ui/ui.h"
#include "sort.h"
#include "build-id.h"
#include "color.h"
#include "cache.h"
Expand Down Expand Up @@ -489,7 +491,7 @@ static int symbol__inc_addr_samples(struct symbol *sym, struct map *map,
{
struct annotation *notes;

if (sym == NULL || use_browser != 1 || !sort__has_sym)
if (sym == NULL)
return 0;

notes = symbol__annotation(sym);
Expand Down Expand Up @@ -1399,3 +1401,8 @@ int hist_entry__annotate(struct hist_entry *he, size_t privsize)
{
return symbol__annotate(he->ms.sym, he->ms.map, privsize);
}

bool ui__has_annotation(void)
{
return use_browser == 1 && sort__has_sym;
}
2 changes: 2 additions & 0 deletions tools/perf/util/annotate.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@ void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);
void symbol__annotate_decay_histogram(struct symbol *sym, int evidx);
void disasm__purge(struct list_head *head);

bool ui__has_annotation(void);

int symbol__tty_annotate(struct symbol *sym, struct map *map,
struct perf_evsel *evsel, bool print_lines,
bool full_paths, int min_pcnt, int max_lines);
Expand Down

0 comments on commit 48c65bd

Please sign in to comment.