forked from luck/tmp_suning_uos_patched
perf annotate: Finally display IPC and cycle accounting
Add two new columns to the annotate display and display the average cycles and the compute IPC if available. When the LBR was not in any branch mode the IPC computation is automatically disabled. We still display the cycle information. Example output (with made up numbers): The second column is the IPC and third average cycles. │ __attribute__((noinline)) f2() │ { 5.15 0.07 │ push %rbp 0.01 0.07 │ mov %rsp,%rbp │ c = a / b; 9.87 0.07 │ mov a,%eax 0.07 │ mov b,%ecx 0.07 │ cltd 4.92 0.07 123│ idiv %ecx 70.79 0.07 │ mov %eax,__TMC_END__ │ } 9.25 0.07 │ pop %rbp 0.01 0.07 123│ ← retq v2: Fix display problems. Signed-off-by: Andi Kleen <ak@linux.intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Link: http://lkml.kernel.org/r/1437233094-12844-7-git-send-email-andi@firstfloor.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
30e863bb6f
commit
f8f4aaead5
|
@ -16,6 +16,9 @@ struct disasm_line_samples {
|
||||||
u64 nr;
|
u64 nr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define IPC_WIDTH 6
|
||||||
|
#define CYCLES_WIDTH 6
|
||||||
|
|
||||||
struct browser_disasm_line {
|
struct browser_disasm_line {
|
||||||
struct rb_node rb_node;
|
struct rb_node rb_node;
|
||||||
u32 idx;
|
u32 idx;
|
||||||
|
@ -97,6 +100,15 @@ static int annotate_browser__set_jumps_percent_color(struct annotate_browser *br
|
||||||
return ui_browser__set_color(&browser->b, color);
|
return ui_browser__set_color(&browser->b, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int annotate_browser__pcnt_width(struct annotate_browser *ab)
|
||||||
|
{
|
||||||
|
int w = 7 * ab->nr_events;
|
||||||
|
|
||||||
|
if (ab->have_cycles)
|
||||||
|
w += IPC_WIDTH + CYCLES_WIDTH;
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
static void annotate_browser__write(struct ui_browser *browser, void *entry, int row)
|
static void annotate_browser__write(struct ui_browser *browser, void *entry, int row)
|
||||||
{
|
{
|
||||||
struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
|
struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
|
||||||
|
@ -107,7 +119,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
|
||||||
(!current_entry || (browser->use_navkeypressed &&
|
(!current_entry || (browser->use_navkeypressed &&
|
||||||
!browser->navkeypressed)));
|
!browser->navkeypressed)));
|
||||||
int width = browser->width, printed;
|
int width = browser->width, printed;
|
||||||
int i, pcnt_width = 7 * ab->nr_events;
|
int i, pcnt_width = annotate_browser__pcnt_width(ab);
|
||||||
double percent_max = 0.0;
|
double percent_max = 0.0;
|
||||||
char bf[256];
|
char bf[256];
|
||||||
|
|
||||||
|
@ -117,19 +129,34 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dl->offset != -1 && percent_max != 0.0) {
|
if (dl->offset != -1 && percent_max != 0.0) {
|
||||||
for (i = 0; i < ab->nr_events; i++) {
|
if (percent_max != 0.0) {
|
||||||
ui_browser__set_percent_color(browser,
|
for (i = 0; i < ab->nr_events; i++) {
|
||||||
bdl->samples[i].percent,
|
ui_browser__set_percent_color(browser,
|
||||||
current_entry);
|
bdl->samples[i].percent,
|
||||||
if (annotate_browser__opts.show_total_period)
|
current_entry);
|
||||||
slsmg_printf("%6" PRIu64 " ",
|
if (annotate_browser__opts.show_total_period)
|
||||||
bdl->samples[i].nr);
|
slsmg_printf("%6" PRIu64 " ",
|
||||||
else
|
bdl->samples[i].nr);
|
||||||
slsmg_printf("%6.2f ", bdl->samples[i].percent);
|
else
|
||||||
|
slsmg_printf("%6.2f ", bdl->samples[i].percent);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
slsmg_write_nstring(" ", 7 * ab->nr_events);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ui_browser__set_percent_color(browser, 0, current_entry);
|
ui_browser__set_percent_color(browser, 0, current_entry);
|
||||||
slsmg_write_nstring(" ", pcnt_width);
|
slsmg_write_nstring(" ", 7 * ab->nr_events);
|
||||||
|
}
|
||||||
|
if (ab->have_cycles) {
|
||||||
|
if (dl->ipc)
|
||||||
|
slsmg_printf("%*.2f ", IPC_WIDTH - 1, dl->ipc);
|
||||||
|
else
|
||||||
|
slsmg_write_nstring(" ", IPC_WIDTH);
|
||||||
|
if (dl->cycles)
|
||||||
|
slsmg_printf("%*" PRIu64 " ",
|
||||||
|
CYCLES_WIDTH - 1, dl->cycles);
|
||||||
|
else
|
||||||
|
slsmg_write_nstring(" ", CYCLES_WIDTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
SLsmg_write_char(' ');
|
SLsmg_write_char(' ');
|
||||||
|
@ -232,7 +259,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
|
||||||
unsigned int from, to;
|
unsigned int from, to;
|
||||||
struct map_symbol *ms = ab->b.priv;
|
struct map_symbol *ms = ab->b.priv;
|
||||||
struct symbol *sym = ms->sym;
|
struct symbol *sym = ms->sym;
|
||||||
u8 pcnt_width = 7;
|
u8 pcnt_width = annotate_browser__pcnt_width(ab);
|
||||||
|
|
||||||
/* PLT symbols contain external offsets */
|
/* PLT symbols contain external offsets */
|
||||||
if (strstr(sym->name, "@plt"))
|
if (strstr(sym->name, "@plt"))
|
||||||
|
@ -256,8 +283,6 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
|
||||||
to = (u64)btarget->idx;
|
to = (u64)btarget->idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
pcnt_width *= ab->nr_events;
|
|
||||||
|
|
||||||
ui_browser__set_color(browser, HE_COLORSET_CODE);
|
ui_browser__set_color(browser, HE_COLORSET_CODE);
|
||||||
__ui_browser__line_arrow(browser, pcnt_width + 2 + ab->addr_width,
|
__ui_browser__line_arrow(browser, pcnt_width + 2 + ab->addr_width,
|
||||||
from, to);
|
from, to);
|
||||||
|
@ -267,9 +292,7 @@ static unsigned int annotate_browser__refresh(struct ui_browser *browser)
|
||||||
{
|
{
|
||||||
struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
|
struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
|
||||||
int ret = ui_browser__list_head_refresh(browser);
|
int ret = ui_browser__list_head_refresh(browser);
|
||||||
int pcnt_width;
|
int pcnt_width = annotate_browser__pcnt_width(ab);
|
||||||
|
|
||||||
pcnt_width = 7 * ab->nr_events;
|
|
||||||
|
|
||||||
if (annotate_browser__opts.jump_arrows)
|
if (annotate_browser__opts.jump_arrows)
|
||||||
annotate_browser__draw_current_jump(browser);
|
annotate_browser__draw_current_jump(browser);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user