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 Original line 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 void hist_browser__update_nr_entries(struct hist_browser *hb);


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


static bool hist_browser__has_filter(struct hist_browser *hb)
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;
	struct hists *hists = browser->hists;


	for (nd = rb_first(&hists->entries);
	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)) {
	     nd = rb_next(nd)) {
		struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
		struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
		hist_entry__set_folding(he, unfold);
		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)) {
	for (nd = browser->top; nd; nd = rb_next(nd)) {
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		u64 total = hists__total_period(h->hists);
		float percent;
		float percent = 0.0;


		if (h->filtered)
		if (h->filtered)
			continue;
			continue;


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

		if (percent < hb->min_pcnt)
		if (percent < hb->min_pcnt)
			continue;
			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,
static struct rb_node *hists__filter_entries(struct rb_node *nd,
					     struct hists *hists,
					     float min_pcnt)
					     float min_pcnt)
{
{
	while (nd != NULL) {
	while (nd != NULL) {
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		u64 total = hists__total_period(hists);
		float percent = hist_entry__get_percent_limit(h);
		float percent = 0.0;

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


		if (!h->filtered && percent >= min_pcnt)
		if (!h->filtered && percent >= min_pcnt)
			return nd;
			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,
static struct rb_node *hists__filter_prev_entries(struct rb_node *nd,
						  struct hists *hists,
						  float min_pcnt)
						  float min_pcnt)
{
{
	while (nd != NULL) {
	while (nd != NULL) {
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		u64 total = hists__total_period(hists);
		float percent = hist_entry__get_percent_limit(h);
		float percent = 0.0;

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


		if (!h->filtered && percent >= min_pcnt)
		if (!h->filtered && percent >= min_pcnt)
			return nd;
			return nd;
@@ -888,14 +874,14 @@ static void ui_browser__hists_seek(struct ui_browser *browser,
	switch (whence) {
	switch (whence) {
	case SEEK_SET:
	case SEEK_SET:
		nd = hists__filter_entries(rb_first(browser->entries),
		nd = hists__filter_entries(rb_first(browser->entries),
					   hb->hists, hb->min_pcnt);
					   hb->min_pcnt);
		break;
		break;
	case SEEK_CUR:
	case SEEK_CUR:
		nd = browser->top;
		nd = browser->top;
		goto do_offset;
		goto do_offset;
	case SEEK_END:
	case SEEK_END:
		nd = hists__filter_prev_entries(rb_last(browser->entries),
		nd = hists__filter_prev_entries(rb_last(browser->entries),
						hb->hists, hb->min_pcnt);
						hb->min_pcnt);
		first = false;
		first = false;
		break;
		break;
	default:
	default:
@@ -938,8 +924,7 @@ static void ui_browser__hists_seek(struct ui_browser *browser,
					break;
					break;
				}
				}
			}
			}
			nd = hists__filter_entries(rb_next(nd), hb->hists,
			nd = hists__filter_entries(rb_next(nd), hb->min_pcnt);
						   hb->min_pcnt);
			if (nd == NULL)
			if (nd == NULL)
				break;
				break;
			--offset;
			--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);
							hb->min_pcnt);
			if (nd == NULL)
			if (nd == NULL)
				break;
				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)
static int hist_browser__fprintf(struct hist_browser *browser, FILE *fp)
{
{
	struct rb_node *nd = hists__filter_entries(rb_first(browser->b.entries),
	struct rb_node *nd = hists__filter_entries(rb_first(browser->b.entries),
						   browser->hists,
						   browser->min_pcnt);
						   browser->min_pcnt);
	int printed = 0;
	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);
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);


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


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


	while ((nd = hists__filter_entries(nd, hb->hists,
	while ((nd = hists__filter_entries(nd, hb->min_pcnt)) != NULL) {
					   hb->min_pcnt)) != NULL) {
		nr_entries++;
		nr_entries++;
		nd = rb_next(nd);
		nd = rb_next(nd);
	}
	}
+2 −4
Original line number Original line 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);
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		GtkTreeIter iter;
		GtkTreeIter iter;
		u64 total = hists__total_period(h->hists);
		u64 total = hists__total_period(h->hists);
		float percent = 0.0;
		float percent;


		if (h->filtered)
		if (h->filtered)
			continue;
			continue;


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

		if (percent < min_pcnt)
		if (percent < min_pcnt)
			continue;
			continue;


+2 −2
Original line number Original line 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)) {
	for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		float percent = h->stat.period * 100.0 /
		float percent;
					hists->stats.total_period;


		if (h->filtered)
		if (h->filtered)
			continue;
			continue;


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


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


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

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


extern regex_t parent_regex;
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);
	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 {
enum sort_mode {
	SORT_MODE__NORMAL,
	SORT_MODE__NORMAL,
	SORT_MODE__BRANCH,
	SORT_MODE__BRANCH,