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

Commit ed279da2 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

perf diff: Add -F option to display formula for computation



Adding -F option to display the formula for specified computation.

This is mainly to facilitate debugging, but can be useful anyway.

Signed-off-by: default avatarJiri Olsa <jolsa@redhat.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1349448287-18919-7-git-send-email-jolsa@redhat.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 61949b21
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -87,6 +87,10 @@ OPTIONS
--period::
        Show period values for both compared hist entries.

-F::
--formula::
        Show formula for given computation.

COMPARISON METHODS
------------------
delta
+66 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ static char diff__default_sort_order[] = "dso,symbol";
static bool  force;
static bool show_displacement;
static bool show_period;
static bool show_formula;
static bool show_baseline_only;
static bool sort_compute;

@@ -190,6 +191,62 @@ s64 perf_diff__compute_wdiff(struct hist_entry *he)
	return he->diff.wdiff;
}

static int formula_delta(struct hist_entry *he, char *buf, size_t size)
{
	struct hist_entry *pair = he->pair;

	if (!pair)
		return -1;

	return scnprintf(buf, size,
			 "(%" PRIu64 " * 100 / %" PRIu64 ") - "
			 "(%" PRIu64 " * 100 / %" PRIu64 ")",
			  he->stat.period, he->hists->stats.total_period,
			  pair->stat.period, pair->hists->stats.total_period);
}

static int formula_ratio(struct hist_entry *he, char *buf, size_t size)
{
	struct hist_entry *pair = he->pair;
	double new_period = he->stat.period;
	double old_period = pair ? pair->stat.period : 0;

	if (!pair)
		return -1;

	return scnprintf(buf, size, "%.0F / %.0F", new_period, old_period);
}

static int formula_wdiff(struct hist_entry *he, char *buf, size_t size)
{
	struct hist_entry *pair = he->pair;
	u64 new_period = he->stat.period;
	u64 old_period = pair ? pair->stat.period : 0;

	if (!pair)
		return -1;

	return scnprintf(buf, size,
		  "(%" PRIu64 " * " "%" PRId64 ") - (%" PRIu64 " * " "%" PRId64 ")",
		  new_period, compute_wdiff_w2, old_period, compute_wdiff_w1);
}

int perf_diff__formula(char *buf, size_t size, struct hist_entry *he)
{
	switch (compute) {
	case COMPUTE_DELTA:
		return formula_delta(he, buf, size);
	case COMPUTE_RATIO:
		return formula_ratio(he, buf, size);
	case COMPUTE_WEIGHTED_DIFF:
		return formula_wdiff(he, buf, size);
	default:
		BUG_ON(1);
	}

	return -1;
}

static int hists__add_entry(struct hists *self,
			    struct addr_location *al, u64 period)
{
@@ -543,6 +600,8 @@ static const struct option options[] = {
		     setup_compute),
	OPT_BOOLEAN('p', "period", &show_period,
		    "Show period values."),
	OPT_BOOLEAN('F', "formula", &show_formula,
		    "Show formula."),
	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
		    "dump raw trace in ASCII"),
	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
@@ -571,7 +630,10 @@ static void ui_init(void)
	/* No overhead column. */
	perf_hpp__column_enable(PERF_HPP__OVERHEAD, false);

	/* Display baseline/delta/ratio/displacement/periods columns. */
	/*
	 * Display baseline/delta/ratio/displacement/
	 * formula/periods columns.
	 */
	perf_hpp__column_enable(PERF_HPP__BASELINE, true);

	switch (compute) {
@@ -591,6 +653,9 @@ static void ui_init(void)
	if (show_displacement)
		perf_hpp__column_enable(PERF_HPP__DISPL, true);

	if (show_formula)
		perf_hpp__column_enable(PERF_HPP__FORMULA, true);

	if (show_period) {
		perf_hpp__column_enable(PERF_HPP__PERIOD, true);
		perf_hpp__column_enable(PERF_HPP__PERIOD_BASELINE, true);
+23 −1
Original line number Diff line number Diff line
@@ -359,6 +359,27 @@ static int hpp__entry_displ(struct perf_hpp *hpp,
	return scnprintf(hpp->buf, hpp->size, fmt, buf);
}

static int hpp__header_formula(struct perf_hpp *hpp)
{
	const char *fmt = symbol_conf.field_sep ? "%s" : "%70s";

	return scnprintf(hpp->buf, hpp->size, fmt, "Formula");
}

static int hpp__width_formula(struct perf_hpp *hpp __maybe_unused)
{
	return 70;
}

static int hpp__entry_formula(struct perf_hpp *hpp, struct hist_entry *he)
{
	const char *fmt = symbol_conf.field_sep ? "%s" : "%-70s";
	char buf[96] = " ";

	perf_diff__formula(buf, sizeof(buf), he);
	return scnprintf(hpp->buf, hpp->size, fmt, buf);
}

#define HPP__COLOR_PRINT_FNS(_name)		\
	.header	= hpp__header_ ## _name,		\
	.width	= hpp__width_ ## _name,		\
@@ -383,7 +404,8 @@ struct perf_hpp_fmt perf_hpp__format[] = {
	{ .cond = false, HPP__PRINT_FNS(delta) },
	{ .cond = false, HPP__PRINT_FNS(ratio) },
	{ .cond = false, HPP__PRINT_FNS(wdiff) },
	{ .cond = false, HPP__PRINT_FNS(displ) }
	{ .cond = false, HPP__PRINT_FNS(displ) },
	{ .cond = false, HPP__PRINT_FNS(formula) }
};

#undef HPP__COLOR_PRINT_FNS
+1 −1
Original line number Diff line number Diff line
@@ -342,7 +342,7 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
	const char *sep = symbol_conf.field_sep;
	const char *col_width = symbol_conf.col_width_list_str;
	int idx, nr_rows = 0;
	char bf[64];
	char bf[96];
	struct perf_hpp dummy_hpp = {
		.buf	= bf,
		.size	= sizeof(bf),
+2 −0
Original line number Diff line number Diff line
@@ -145,6 +145,7 @@ enum {
	PERF_HPP__RATIO,
	PERF_HPP__WEIGHTED_DIFF,
	PERF_HPP__DISPL,
	PERF_HPP__FORMULA,

	PERF_HPP__MAX_INDEX
};
@@ -210,4 +211,5 @@ unsigned int hists__sort_list_width(struct hists *self);
double perf_diff__compute_delta(struct hist_entry *he);
double perf_diff__compute_ratio(struct hist_entry *he);
s64 perf_diff__compute_wdiff(struct hist_entry *he);
int perf_diff__formula(char *buf, size_t size, struct hist_entry *he);
#endif	/* __PERF_HIST_H */