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

Commit 14135663 authored by Namhyung Kim's avatar Namhyung Kim Committed by Jiri Olsa
Browse files

perf tools: Apply percent-limit to cumulative percentage



If -g cumulative option is given, it needs to show entries which don't
have self overhead.  So apply percent-limit to accumulated overhead
percentage in this case.

Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Tested-by: default avatarArun Sharma <asharma@fb.com>
Tested-by: default avatarRodrigo Campos <rodrigo@sdfg.com.ar>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Link: http://lkml.kernel.org/r/1401335910-16832-14-git-send-email-namhyung@kernel.org


Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
parent b09955b2
Loading
Loading
Loading
Loading
+11 −29
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@ static int hists__browser_title(struct hists *hists, char *bf, size_t size,
static void hist_browser__update_nr_entries(struct hist_browser *hb);

static struct rb_node *hists__filter_entries(struct rb_node *nd,
					     struct hists *hists,
					     float min_pcnt);

static bool hist_browser__has_filter(struct hist_browser *hb)
@@ -319,7 +318,7 @@ __hist_browser__set_folding(struct hist_browser *browser, bool unfold)
	struct hists *hists = browser->hists;

	for (nd = rb_first(&hists->entries);
	     (nd = hists__filter_entries(nd, hists, browser->min_pcnt)) != NULL;
	     (nd = hists__filter_entries(nd, browser->min_pcnt)) != NULL;
	     nd = rb_next(nd)) {
		struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
		hist_entry__set_folding(he, unfold);
@@ -808,15 +807,12 @@ static unsigned int hist_browser__refresh(struct ui_browser *browser)

	for (nd = browser->top; nd; nd = rb_next(nd)) {
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		u64 total = hists__total_period(h->hists);
		float percent = 0.0;
		float percent;

		if (h->filtered)
			continue;

		if (total)
			percent = h->stat.period * 100.0 / total;

		percent = hist_entry__get_percent_limit(h);
		if (percent < hb->min_pcnt)
			continue;

@@ -829,16 +825,11 @@ static unsigned int hist_browser__refresh(struct ui_browser *browser)
}

static struct rb_node *hists__filter_entries(struct rb_node *nd,
					     struct hists *hists,
					     float min_pcnt)
{
	while (nd != NULL) {
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		u64 total = hists__total_period(hists);
		float percent = 0.0;

		if (total)
			percent = h->stat.period * 100.0 / total;
		float percent = hist_entry__get_percent_limit(h);

		if (!h->filtered && percent >= min_pcnt)
			return nd;
@@ -850,16 +841,11 @@ static struct rb_node *hists__filter_entries(struct rb_node *nd,
}

static struct rb_node *hists__filter_prev_entries(struct rb_node *nd,
						  struct hists *hists,
						  float min_pcnt)
{
	while (nd != NULL) {
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		u64 total = hists__total_period(hists);
		float percent = 0.0;

		if (total)
			percent = h->stat.period * 100.0 / total;
		float percent = hist_entry__get_percent_limit(h);

		if (!h->filtered && percent >= min_pcnt)
			return nd;
@@ -888,14 +874,14 @@ static void ui_browser__hists_seek(struct ui_browser *browser,
	switch (whence) {
	case SEEK_SET:
		nd = hists__filter_entries(rb_first(browser->entries),
					   hb->hists, hb->min_pcnt);
					   hb->min_pcnt);
		break;
	case SEEK_CUR:
		nd = browser->top;
		goto do_offset;
	case SEEK_END:
		nd = hists__filter_prev_entries(rb_last(browser->entries),
						hb->hists, hb->min_pcnt);
						hb->min_pcnt);
		first = false;
		break;
	default:
@@ -938,8 +924,7 @@ static void ui_browser__hists_seek(struct ui_browser *browser,
					break;
				}
			}
			nd = hists__filter_entries(rb_next(nd), hb->hists,
						   hb->min_pcnt);
			nd = hists__filter_entries(rb_next(nd), hb->min_pcnt);
			if (nd == NULL)
				break;
			--offset;
@@ -972,7 +957,7 @@ static void ui_browser__hists_seek(struct ui_browser *browser,
				}
			}

			nd = hists__filter_prev_entries(rb_prev(nd), hb->hists,
			nd = hists__filter_prev_entries(rb_prev(nd),
							hb->min_pcnt);
			if (nd == NULL)
				break;
@@ -1151,7 +1136,6 @@ static int hist_browser__fprintf_entry(struct hist_browser *browser,
static int hist_browser__fprintf(struct hist_browser *browser, FILE *fp)
{
	struct rb_node *nd = hists__filter_entries(rb_first(browser->b.entries),
						   browser->hists,
						   browser->min_pcnt);
	int printed = 0;

@@ -1159,8 +1143,7 @@ static int hist_browser__fprintf(struct hist_browser *browser, FILE *fp)
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);

		printed += hist_browser__fprintf_entry(browser, h, fp);
		nd = hists__filter_entries(rb_next(nd), browser->hists,
					   browser->min_pcnt);
		nd = hists__filter_entries(rb_next(nd), browser->min_pcnt);
	}

	return printed;
@@ -1397,8 +1380,7 @@ static void hist_browser__update_nr_entries(struct hist_browser *hb)
		return;
	}

	while ((nd = hists__filter_entries(nd, hb->hists,
					   hb->min_pcnt)) != NULL) {
	while ((nd = hists__filter_entries(nd, hb->min_pcnt)) != NULL) {
		nr_entries++;
		nd = rb_next(nd);
	}
+2 −4
Original line number Diff line number Diff line
@@ -226,14 +226,12 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists,
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		GtkTreeIter iter;
		u64 total = hists__total_period(h->hists);
		float percent = 0.0;
		float percent;

		if (h->filtered)
			continue;

		if (total)
			percent = h->stat.period * 100.0 / total;

		percent = hist_entry__get_percent_limit(h);
		if (percent < min_pcnt)
			continue;

+2 −2
Original line number Diff line number Diff line
@@ -461,12 +461,12 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,

	for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		float percent = h->stat.period * 100.0 /
					hists->stats.total_period;
		float percent;

		if (h->filtered)
			continue;

		percent = hist_entry__get_percent_limit(h);
		if (percent < min_pcnt)
			continue;

+16 −1
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@

#include "parse-options.h"
#include "parse-events.h"

#include "hist.h"
#include "thread.h"

extern regex_t parent_regex;
@@ -131,6 +131,21 @@ static inline void hist_entry__add_pair(struct hist_entry *pair,
	list_add_tail(&pair->pairs.node, &he->pairs.head);
}

static inline float hist_entry__get_percent_limit(struct hist_entry *he)
{
	u64 period = he->stat.period;
	u64 total_period = hists__total_period(he->hists);

	if (unlikely(total_period == 0))
		return 0;

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

	return period * 100.0 / total_period;
}


enum sort_mode {
	SORT_MODE__NORMAL,
	SORT_MODE__BRANCH,