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

Commit 0c841c6c authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo
Browse files

perf hists browser: Fix dump to show correct callchain style



The commit 8c430a34 ("perf hists browser: Support folded
callchains") missed to update hist_browser__dump() so it always shows
graph-style callchains regardless of current setting.

To fix that, factor out callchain printing code and rename the existing
function which prints graph-style callchain.

Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Wang Nan <wangnan0@huawei.com>
Fixes: 8c430a34 ("perf hists browser: Support folded callchains")
Link: http://lkml.kernel.org/r/1453909257-26015-8-git-send-email-namhyung@kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 7ed5d6e2
Loading
Loading
Loading
Loading
+41 −32
Original line number Diff line number Diff line
@@ -844,7 +844,7 @@ static int hist_browser__show_callchain_folded(struct hist_browser *browser,
	return row - first_row;
}

static int hist_browser__show_callchain(struct hist_browser *browser,
static int hist_browser__show_callchain_graph(struct hist_browser *browser,
					struct rb_root *root, int level,
					unsigned short row, u64 total,
					print_callchain_entry_fn print,
@@ -898,7 +898,7 @@ static int hist_browser__show_callchain(struct hist_browser *browser,
			else
				new_total = total;

			row += hist_browser__show_callchain(browser, &child->rb_root,
			row += hist_browser__show_callchain_graph(browser, &child->rb_root,
							    new_level, row, new_total,
							    print, arg, is_output_full);
		}
@@ -910,6 +910,43 @@ static int hist_browser__show_callchain(struct hist_browser *browser,
	return row - first_row;
}

static int hist_browser__show_callchain(struct hist_browser *browser,
					struct hist_entry *entry, int level,
					unsigned short row,
					print_callchain_entry_fn print,
					struct callchain_print_arg *arg,
					check_output_full_fn is_output_full)
{
	u64 total = hists__total_period(entry->hists);
	int printed;

	if (callchain_param.mode == CHAIN_GRAPH_REL) {
		if (symbol_conf.cumulate_callchain)
			total = entry->stat_acc->period;
		else
			total = entry->stat.period;
	}

	if (callchain_param.mode == CHAIN_FLAT) {
		printed = hist_browser__show_callchain_flat(browser,
						&entry->sorted_chain, row, total,
						print, arg, is_output_full);
	} else if (callchain_param.mode == CHAIN_FOLDED) {
		printed = hist_browser__show_callchain_folded(browser,
						&entry->sorted_chain, row, total,
						print, arg, is_output_full);
	} else {
		printed = hist_browser__show_callchain_graph(browser,
						&entry->sorted_chain, level, row, total,
						print, arg, is_output_full);
	}

	if (arg->is_current_entry)
		browser->he_selection = entry;

	return printed;
}

struct hpp_arg {
	struct ui_browser *b;
	char folded_sign;
@@ -1084,38 +1121,14 @@ static int hist_browser__show_entry(struct hist_browser *browser,
		--row_offset;

	if (folded_sign == '-' && row != browser->b.rows) {
		u64 total = hists__total_period(entry->hists);
		struct callchain_print_arg arg = {
			.row_offset = row_offset,
			.is_current_entry = current_entry,
		};

		if (callchain_param.mode == CHAIN_GRAPH_REL) {
			if (symbol_conf.cumulate_callchain)
				total = entry->stat_acc->period;
			else
				total = entry->stat.period;
		}

		if (callchain_param.mode == CHAIN_FLAT) {
			printed += hist_browser__show_callchain_flat(browser,
					&entry->sorted_chain, row, total,
		printed += hist_browser__show_callchain(browser, entry, 1, row,
					hist_browser__show_callchain_entry, &arg,
					hist_browser__check_output_full);
		} else if (callchain_param.mode == CHAIN_FOLDED) {
			printed += hist_browser__show_callchain_folded(browser,
					&entry->sorted_chain, row, total,
					hist_browser__show_callchain_entry, &arg,
					hist_browser__check_output_full);
		} else {
			printed += hist_browser__show_callchain(browser,
					&entry->sorted_chain, 1, row, total,
					hist_browser__show_callchain_entry, &arg,
					hist_browser__check_output_full);
		}

		if (arg.is_current_entry)
			browser->he_selection = entry;
	}

	return printed;
@@ -1380,15 +1393,11 @@ static void ui_browser__hists_seek(struct ui_browser *browser,
static int hist_browser__fprintf_callchain(struct hist_browser *browser,
					   struct hist_entry *he, FILE *fp)
{
	u64 total = hists__total_period(he->hists);
	struct callchain_print_arg arg  = {
		.fp = fp,
	};

	if (symbol_conf.cumulate_callchain)
		total = he->stat_acc->period;

	hist_browser__show_callchain(browser, &he->sorted_chain, 1, 0, total,
	hist_browser__show_callchain(browser, he, 1, 0,
				     hist_browser__fprintf_callchain_entry, &arg,
				     hist_browser__check_dump_full);
	return arg.printed;