Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756373AbbGQDuV (ORCPT ); Thu, 16 Jul 2015 23:50:21 -0400 Received: from mga11.intel.com ([192.55.52.93]:62184 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754588AbbGQDsf (ORCPT ); Thu, 16 Jul 2015 23:48:35 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,492,1432623600"; d="scan'208";a="607841830" From: kan.liang@intel.com To: a.p.zijlstra@chello.nl Cc: mingo@redhat.com, acme@kernel.org, eranian@google.com, ak@linux.intel.com, mark.rutland@arm.com, adrian.hunter@intel.com, dsahern@gmail.com, jolsa@kernel.org, namhyung@kernel.org, linux-kernel@vger.kernel.org, Kan Liang Subject: [PATCH 8/9] perf,tools: caculate and save tsc/avg/bzy freq in he_stat Date: Thu, 16 Jul 2015 16:33:50 -0400 Message-Id: <1437078831-10152-9-git-send-email-kan.liang@intel.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1437078831-10152-1-git-send-email-kan.liang@intel.com> References: <1437078831-10152-1-git-send-email-kan.liang@intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 8226 Lines: 242 From: Kan Liang Introduce a new hist_iter ops (hist_iter_freq) to caculate the tsc/avg/bzy freq when processing samples, and save them in hist_entry. Signed-off-by: Kan Liang --- tools/perf/builtin-annotate.c | 2 +- tools/perf/builtin-diff.c | 2 +- tools/perf/tests/hists_link.c | 4 ++-- tools/perf/util/hist.c | 52 ++++++++++++++++++++++++++++++++++++++----- tools/perf/util/hist.h | 2 ++ tools/perf/util/sort.h | 3 +++ tools/perf/util/symbol.h | 6 +++++ 7 files changed, 61 insertions(+), 10 deletions(-) diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 2c1bec3..06e2f87 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -71,7 +71,7 @@ static int perf_evsel__add_sample(struct perf_evsel *evsel, return 0; } - he = __hists__add_entry(hists, al, NULL, NULL, NULL, 1, 1, 0, true); + he = __hists__add_entry(hists, al, NULL, NULL, NULL, 1, 1, 0, NULL, true); if (he == NULL) return -ENOMEM; diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index daaa7dc..2fffcc4 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c @@ -315,7 +315,7 @@ static int hists__add_entry(struct hists *hists, u64 weight, u64 transaction) { if (__hists__add_entry(hists, al, NULL, NULL, NULL, period, weight, - transaction, true) != NULL) + transaction, NULL, true) != NULL) return 0; return -ENOMEM; } diff --git a/tools/perf/tests/hists_link.c b/tools/perf/tests/hists_link.c index 8c102b0..5d9f9e3 100644 --- a/tools/perf/tests/hists_link.c +++ b/tools/perf/tests/hists_link.c @@ -90,7 +90,7 @@ static int add_hist_entries(struct perf_evlist *evlist, struct machine *machine) goto out; he = __hists__add_entry(hists, &al, NULL, - NULL, NULL, 1, 1, 0, true); + NULL, NULL, 1, 1, 0, NULL, true); if (he == NULL) { addr_location__put(&al); goto out; @@ -116,7 +116,7 @@ static int add_hist_entries(struct perf_evlist *evlist, struct machine *machine) goto out; he = __hists__add_entry(hists, &al, NULL, - NULL, NULL, 1, 1, 0, true); + NULL, NULL, 1, 1, 0, NULL, true); if (he == NULL) { addr_location__put(&al); goto out; diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 6f28d53..ce32bd58 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -436,7 +436,9 @@ struct hist_entry *__hists__add_entry(struct hists *hists, struct symbol *sym_parent, struct branch_info *bi, struct mem_info *mi, - u64 period, u64 weight, u64 transaction, + u64 period, u64 weight, + u64 transaction, + struct freq_info *freq, bool sample_self) { struct hist_entry entry = { @@ -454,6 +456,9 @@ struct hist_entry *__hists__add_entry(struct hists *hists, .nr_events = 1, .period = period, .weight = weight, + .tsc_freq = (freq != NULL) ? freq->tsc_freq : 0, + .avg_freq = (freq != NULL) ? freq->avg_freq : 0, + .bzy_freq = (freq != NULL) ? freq->bzy_freq : 0, }, .parent = sym_parent, .filtered = symbol__parent_filter(sym_parent) | al->filtered, @@ -481,6 +486,33 @@ iter_add_next_nop_entry(struct hist_entry_iter *iter __maybe_unused, } static int +iter_add_single_freq_entry(struct hist_entry_iter *iter, struct addr_location *al) +{ + struct perf_evsel *evsel = iter->evsel; + struct perf_sample *sample = iter->sample; + struct hist_entry *he; + struct freq_info freq; + + if (sample->read.time_running > 0) { + freq.tsc_freq = (1000 * sample->tsc) / sample->read.time_running; + freq.avg_freq = (1000 * sample->aperf) / sample->read.time_running; + if (sample->aperf > 0) + freq.bzy_freq = freq.tsc_freq * sample->mperf / sample->aperf; + else + freq.bzy_freq = 0; + } + + he = __hists__add_entry(evsel__hists(evsel), al, iter->parent, NULL, NULL, + sample->period, sample->weight, + sample->transaction, &freq, true); + if (he == NULL) + return -ENOMEM; + + iter->he = he; + return 0; +} + +static int iter_prepare_mem_entry(struct hist_entry_iter *iter, struct addr_location *al) { struct perf_sample *sample = iter->sample; @@ -517,7 +549,7 @@ iter_add_single_mem_entry(struct hist_entry_iter *iter, struct addr_location *al * and the he_stat__add_period() function. */ he = __hists__add_entry(hists, al, iter->parent, NULL, mi, - cost, cost, 0, true); + cost, cost, 0, NULL, true); if (!he) return -ENOMEM; @@ -618,7 +650,7 @@ iter_add_next_branch_entry(struct hist_entry_iter *iter, struct addr_location *a * and not events sampled. Thus we use a pseudo period of 1. */ he = __hists__add_entry(hists, al, iter->parent, &bi[i], NULL, - 1, 1, 0, true); + 1, 1, 0, NULL, true); if (he == NULL) return -ENOMEM; @@ -656,7 +688,7 @@ iter_add_single_normal_entry(struct hist_entry_iter *iter, struct addr_location he = __hists__add_entry(evsel__hists(evsel), al, iter->parent, NULL, NULL, sample->period, sample->weight, - sample->transaction, true); + sample->transaction, NULL, true); if (he == NULL) return -ENOMEM; @@ -718,7 +750,7 @@ iter_add_single_cumulative_entry(struct hist_entry_iter *iter, he = __hists__add_entry(hists, al, iter->parent, NULL, NULL, sample->period, sample->weight, - sample->transaction, true); + sample->transaction, NULL, true); if (he == NULL) return -ENOMEM; @@ -791,7 +823,7 @@ iter_add_next_cumulative_entry(struct hist_entry_iter *iter, he = __hists__add_entry(evsel__hists(evsel), al, iter->parent, NULL, NULL, sample->period, sample->weight, - sample->transaction, false); + sample->transaction, NULL, false); if (he == NULL) return -ENOMEM; @@ -813,6 +845,14 @@ iter_finish_cumulative_entry(struct hist_entry_iter *iter, return 0; } +const struct hist_iter_ops hist_iter_freq = { + .prepare_entry = iter_prepare_normal_entry, + .add_single_entry = iter_add_single_freq_entry, + .next_entry = iter_next_nop_entry, + .add_next_entry = iter_add_next_nop_entry, + .finish_entry = iter_finish_normal_entry, +}; + const struct hist_iter_ops hist_iter_mem = { .prepare_entry = iter_prepare_mem_entry, .add_single_entry = iter_add_single_mem_entry, diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index 5ed8d9c..3601658 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -102,6 +102,7 @@ extern const struct hist_iter_ops hist_iter_normal; extern const struct hist_iter_ops hist_iter_branch; extern const struct hist_iter_ops hist_iter_mem; extern const struct hist_iter_ops hist_iter_cumulative; +extern const struct hist_iter_ops hist_iter_freq; struct hist_entry *__hists__add_entry(struct hists *hists, struct addr_location *al, @@ -109,6 +110,7 @@ struct hist_entry *__hists__add_entry(struct hists *hists, struct branch_info *bi, struct mem_info *mi, u64 period, u64 weight, u64 transaction, + struct freq_info *freq, bool sample_self); int hist_entry_iter__add(struct hist_entry_iter *iter, struct addr_location *al, int max_stack_depth, void *arg); diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h index e97cd47..5720076 100644 --- a/tools/perf/util/sort.h +++ b/tools/perf/util/sort.h @@ -54,6 +54,9 @@ struct he_stat { u64 period_guest_us; u64 weight; u32 nr_events; + u64 tsc_freq; + u64 avg_freq; + u64 bzy_freq; }; struct hist_entry_diff { diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index b98ce51..b71d575 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h @@ -180,6 +180,12 @@ struct mem_info { union perf_mem_data_src data_src; }; +struct freq_info { + u64 tsc_freq; + u64 avg_freq; + u64 bzy_freq; +}; + struct addr_location { struct machine *machine; struct thread *thread; -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/