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

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

perf hists: Add support for accumulated stat of hist entry



Maintain accumulated stat information in hist_entry->stat_acc if
symbol_conf.cumulate_callchain is set.  Fields in ->stat_acc have same
vaules initially, and will be updated as callchain is processed later.

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-4-git-send-email-namhyung@kernel.org


Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
parent 69bcb019
Loading
Loading
Loading
Loading
+26 −2
Original line number Diff line number Diff line
@@ -232,6 +232,8 @@ static bool hists__decay_entry(struct hists *hists, struct hist_entry *he)
		return true;

	he_stat__decay(&he->stat);
	if (symbol_conf.cumulate_callchain)
		he_stat__decay(he->stat_acc);

	diff = prev_period - he->stat.period;

@@ -279,12 +281,26 @@ void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel)

static struct hist_entry *hist_entry__new(struct hist_entry *template)
{
	size_t callchain_size = symbol_conf.use_callchain ? sizeof(struct callchain_root) : 0;
	struct hist_entry *he = zalloc(sizeof(*he) + callchain_size);
	size_t callchain_size = 0;
	struct hist_entry *he;

	if (symbol_conf.use_callchain || symbol_conf.cumulate_callchain)
		callchain_size = sizeof(struct callchain_root);

	he = zalloc(sizeof(*he) + callchain_size);

	if (he != NULL) {
		*he = *template;

		if (symbol_conf.cumulate_callchain) {
			he->stat_acc = malloc(sizeof(he->stat));
			if (he->stat_acc == NULL) {
				free(he);
				return NULL;
			}
			memcpy(he->stat_acc, &he->stat, sizeof(he->stat));
		}

		if (he->ms.map)
			he->ms.map->referenced = true;

@@ -296,6 +312,7 @@ static struct hist_entry *hist_entry__new(struct hist_entry *template)
			 */
			he->branch_info = malloc(sizeof(*he->branch_info));
			if (he->branch_info == NULL) {
				free(he->stat_acc);
				free(he);
				return NULL;
			}
@@ -359,6 +376,8 @@ static struct hist_entry *add_hist_entry(struct hists *hists,

		if (!cmp) {
			he_stat__add_period(&he->stat, period, weight);
			if (symbol_conf.cumulate_callchain)
				he_stat__add_period(he->stat_acc, period, weight);

			/*
			 * This mem info was allocated from sample__resolve_mem
@@ -394,6 +413,8 @@ static struct hist_entry *add_hist_entry(struct hists *hists,
	rb_insert_color(&he->rb_node_in, hists->entries_in);
out:
	he_stat__add_cpumode_period(&he->stat, al->cpumode, period);
	if (symbol_conf.cumulate_callchain)
		he_stat__add_cpumode_period(he->stat_acc, al->cpumode, period);
	return he;
}

@@ -768,6 +789,7 @@ void hist_entry__free(struct hist_entry *he)
{
	zfree(&he->branch_info);
	zfree(&he->mem_info);
	zfree(&he->stat_acc);
	free_srcline(he->srcline);
	free(he);
}
@@ -793,6 +815,8 @@ static bool hists__collapse_insert_entry(struct hists *hists __maybe_unused,

		if (!cmp) {
			he_stat__add_stat(&iter->stat, &he->stat);
			if (symbol_conf.cumulate_callchain)
				he_stat__add_stat(iter->stat_acc, he->stat_acc);

			if (symbol_conf.use_callchain) {
				callchain_cursor_reset(&callchain_cursor);
+1 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ struct hist_entry {
		struct list_head head;
	} pairs;
	struct he_stat		stat;
	struct he_stat		*stat_acc;
	struct map_symbol	ms;
	struct thread		*thread;
	struct comm		*comm;
+1 −0
Original line number Diff line number Diff line
@@ -109,6 +109,7 @@ struct symbol_conf {
			show_nr_samples,
			show_total_period,
			use_callchain,
			cumulate_callchain,
			exclude_other,
			show_cpu_utilization,
			initialized,