perf annotate: Display the branch counter histogram

Display the branch counter histogram in the annotation view.

Press 'B' to display the branch counter's abbreviation list as well.

  Samples: 1M of events 'anon group { branch-instructions:ppp, branch-misses }',
  4000 Hz, Event count (approx.):
  f3  /home/sdp/test/tchain_edit [Percent: local period]
  Percent       │ IPC Cycle       Branch Counter (Average IPC: 1.39, IPC Coverage: 29.4%)
                │                                     0000000000401755 <f3>:
    0.00   0.00 │                                       endbr64
                │                                       push    %rbp
                │                                       mov     %rsp,%rbp
                │                                       movl    $0x0,-0x4(%rbp)
    0.00   0.00 │1.33     3          |A   |-   |      ↓ jmp     25
   11.03  11.03 │                                 11:   mov     -0x4(%rbp),%eax
                │                                       and     $0x1,%eax
                │                                       test    %eax,%eax
   17.13  17.13 │2.41     1          |A   |-   |      ↓ je      21
                │                                       addl    $0x1,-0x4(%rbp)
   21.84  21.84 │2.22     2          |AA  |-   |      ↓ jmp     25
   17.13  17.13 │                                 21:   addl    $0x1,-0x4(%rbp)
   21.84  21.84 │                                 25:   cmpl    $0x270f,-0x4(%rbp)
   11.03  11.03 │0.61     3          |A   |-   |      ↑ jle     11
                │                                       nop
                │                                       pop     %rbp
    0.00   0.00 │0.24    20          |AA  |B   |      ← ret

Originally-by: Tinghao Zhang <tinghao.zhang@intel.com>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: https://lore.kernel.org/r/20240813160208.2493643-8-kan.liang@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Kan Liang
2024-08-13 09:02:06 -07:00
committed by Arnaldo Carvalho de Melo
parent 20d6f55528
commit e6952dcec8
6 changed files with 74 additions and 9 deletions

View File

@@ -501,8 +501,10 @@ static void annotation__count_and_fill(struct annotation *notes, u64 start, u64
}
}
static int annotation__compute_ipc(struct annotation *notes, size_t size)
static int annotation__compute_ipc(struct annotation *notes, size_t size,
struct evsel *evsel)
{
unsigned int br_cntr_nr = evsel->evlist->nr_br_cntr;
int err = 0;
s64 offset;
@@ -537,6 +539,20 @@ static int annotation__compute_ipc(struct annotation *notes, size_t size)
al->cycles->max = ch->cycles_max;
al->cycles->min = ch->cycles_min;
}
if (al && notes->branch->br_cntr) {
if (!al->br_cntr) {
al->br_cntr = calloc(br_cntr_nr, sizeof(u64));
if (!al->br_cntr) {
err = ENOMEM;
break;
}
}
al->num_aggr = ch->num_aggr;
al->br_cntr_nr = br_cntr_nr;
al->evsel = evsel;
memcpy(al->br_cntr, &notes->branch->br_cntr[offset * br_cntr_nr],
br_cntr_nr * sizeof(u64));
}
}
}
@@ -548,8 +564,10 @@ static int annotation__compute_ipc(struct annotation *notes, size_t size)
struct annotation_line *al;
al = annotated_source__get_line(notes->src, offset);
if (al)
if (al) {
zfree(&al->cycles);
zfree(&al->br_cntr);
}
}
}
}
@@ -1960,6 +1978,22 @@ static void __annotation_line__write(struct annotation_line *al, struct annotati
"Cycle(min/max)");
}
if (annotate_opts.show_br_cntr) {
if (show_title) {
obj__printf(obj, "%*s ",
ANNOTATION__BR_CNTR_WIDTH,
"Branch Counter");
} else {
char *buf;
if (!annotation_br_cntr_entry(&buf, al->br_cntr_nr, al->br_cntr,
al->num_aggr, al->evsel)) {
obj__printf(obj, "%*s ", ANNOTATION__BR_CNTR_WIDTH, buf);
free(buf);
}
}
}
if (show_title && !*al->line) {
ipc_coverage_string(bf, sizeof(bf), notes);
obj__printf(obj, "%*s", ANNOTATION__AVG_IPC_WIDTH, bf);
@@ -2056,7 +2090,7 @@ int symbol__annotate2(struct map_symbol *ms, struct evsel *evsel,
annotation__set_index(notes);
annotation__mark_jump_targets(notes, sym);
err = annotation__compute_ipc(notes, size);
err = annotation__compute_ipc(notes, size, evsel);
if (err)
return err;