From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935040AbbIVVcG (ORCPT ); Tue, 22 Sep 2015 17:32:06 -0400 Received: from mga11.intel.com ([192.55.52.93]:23374 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934898AbbIVVaJ (ORCPT ); Tue, 22 Sep 2015 17:30:09 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,574,1437462000"; d="scan'208";a="810764275" From: kan.liang@intel.com To: acme@kernel.org Cc: jolsa@kernel.org, a.p.zijlstra@chello.nl, mingo@redhat.com, namhyung@kernel.org, ak@linux.intel.com, linux-kernel@vger.kernel.org, Kan Liang Subject: [PATCH RFC 05/10] perf,tools: record counter statistics during sampling Date: Tue, 22 Sep 2015 10:13:38 -0400 Message-Id: <1442931223-51708-6-git-send-email-kan.liang@intel.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1442931223-51708-1-git-send-email-kan.liang@intel.com> References: <1442931223-51708-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 From: Kan Liang Reading at the start and the end of sampling, and save the counter statistics value to PERF_RECORD_COUNTER_READ. Signed-off-by: Kan Liang --- tools/perf/builtin-record.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 142eeb3..cc8fd08 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -398,6 +398,40 @@ static struct perf_event_header finished_round_event = { .type = PERF_RECORD_FINISHED_ROUND, }; +static void process_counter_read_event(struct record *rec, int id, + struct perf_evsel *pos, + struct perf_counts_values *count) +{ + union perf_event ev; + + memset(&ev, 0, sizeof(ev)); + ev.counter_read.header.type = PERF_RECORD_COUNTER_READ; + ev.counter_read.header.size = sizeof(ev.counter_read); + ev.counter_read.cpu = pos->cpus->map[id]; + ev.counter_read.idx = pos->idx; + memcpy(ev.counter_read.values, count, 3 * sizeof(u64)); + + record__write(rec, &ev, sizeof(ev.counter_read)); +} + +static void perf_read_counter(struct record *rec) +{ + struct perf_evlist *evlist = rec->evlist; + struct perf_counts_values count; + struct perf_evsel *pos; + int cpu; + + evlist__for_each(evlist, pos) { + if (!pos->counter_read) + continue; + + for (cpu = 0; cpu < cpu_map__nr(pos->cpus); cpu++) { + if (!perf_evsel__read(pos, cpu, 0, &count)) + process_counter_read_event(rec, cpu, pos, &count); + } + } +} + static int record__mmap_read_all(struct record *rec) { u64 bytes_written = rec->bytes_written; @@ -644,6 +678,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) perf_evlist__enable(rec->evlist); } + perf_read_counter(rec); auxtrace_snapshot_enabled = 1; for (;;) { int hits = rec->samples; @@ -688,6 +723,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) */ if (done && !disabled && !target__none(&opts->target)) { auxtrace_snapshot_enabled = 0; + perf_read_counter(rec); perf_evlist__disable(rec->evlist); disabled = true; } -- 1.8.3.1