Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f8f4aaea authored by Andi Kleen's avatar Andi Kleen Committed by Arnaldo Carvalho de Melo
Browse files

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: default avatarAndi 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 30e863bb
Loading
Loading
Loading
Loading
+40 −17
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@ struct disasm_line_samples {
	u64		nr;
};

#define IPC_WIDTH 6
#define CYCLES_WIDTH 6

struct browser_disasm_line {
	struct rb_node			rb_node;
	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);
}

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)
{
	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 &&
					         !browser->navkeypressed)));
	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;
	char bf[256];

@@ -117,6 +129,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
	}

	if (dl->offset != -1 && percent_max != 0.0) {
		if (percent_max != 0.0) {
			for (i = 0; i < ab->nr_events; i++) {
				ui_browser__set_percent_color(browser,
							bdl->samples[i].percent,
@@ -127,9 +140,23 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
				else
					slsmg_printf("%6.2f ", bdl->samples[i].percent);
			}
		} else {
			slsmg_write_nstring(" ", 7 * ab->nr_events);
		}
	} else {
		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(' ');
@@ -232,7 +259,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
	unsigned int from, to;
	struct map_symbol *ms = ab->b.priv;
	struct symbol *sym = ms->sym;
	u8 pcnt_width = 7;
	u8 pcnt_width = annotate_browser__pcnt_width(ab);

	/* PLT symbols contain external offsets */
	if (strstr(sym->name, "@plt"))
@@ -256,8 +283,6 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
		to = (u64)btarget->idx;
	}

	pcnt_width *= ab->nr_events;

	ui_browser__set_color(browser, HE_COLORSET_CODE);
	__ui_browser__line_arrow(browser, pcnt_width + 2 + ab->addr_width,
				 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);
	int ret = ui_browser__list_head_refresh(browser);
	int pcnt_width;

	pcnt_width = 7 * ab->nr_events;
	int pcnt_width = annotate_browser__pcnt_width(ab);

	if (annotate_browser__opts.jump_arrows)
		annotate_browser__draw_current_jump(browser);