From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932336AbcDDUoA (ORCPT ); Mon, 4 Apr 2016 16:44:00 -0400 Received: from mga02.intel.com ([134.134.136.20]:2018 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756413AbcDDUmF (ORCPT ); Mon, 4 Apr 2016 16:42:05 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,442,1455004800"; d="scan'208";a="925283478" From: Andi Kleen To: peterz@infradead.org, acme@kernel.org Cc: jolsa@kernel.org, linux-kernel@vger.kernel.org, mingo@kernel.org, Andi Kleen Subject: [PATCH 05/11] perf, tools: Parse an .aggr-per-core event attribute Date: Mon, 4 Apr 2016 13:41:48 -0700 Message-Id: <1459802514-31501-6-git-send-email-andi@firstfloor.org> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1459802514-31501-1-git-send-email-andi@firstfloor.org> References: <1459802514-31501-1-git-send-email-andi@firstfloor.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Andi Kleen Add the basic code to parse an .aggr-per-core event attribute. The attribute means that the event needs to be measured in per core mode. v2: Support integer values for aggr-per-core Signed-off-by: Andi Kleen --- tools/perf/util/evsel.h | 1 + tools/perf/util/parse-events.c | 1 + tools/perf/util/pmu.c | 24 ++++++++++++++++++++++++ tools/perf/util/pmu.h | 2 ++ 4 files changed, 28 insertions(+) diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 501ea6e565f1..8a746d2df152 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -112,6 +112,7 @@ struct perf_evsel { bool tracking; bool per_pkg; bool precise_max; + int aggr_per_core; /* parse modifier helper */ int exclude_GH; int nr_members; diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 4c19d5e79d8c..efa77179195c 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1213,6 +1213,7 @@ int parse_events_add_pmu(struct parse_events_evlist *data, evsel->unit = info.unit; evsel->scale = info.scale; evsel->per_pkg = info.per_pkg; + evsel->aggr_per_core = info.aggr_per_core; evsel->snapshot = info.snapshot; } diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index adef23b1352e..38f4d13dfca0 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -202,6 +202,24 @@ perf_pmu__parse_per_pkg(struct perf_pmu_alias *alias, char *dir, char *name) return 0; } +static void +perf_pmu__parse_aggr_per_core(struct perf_pmu_alias *alias, char *dir, char *name) +{ + char path[PATH_MAX]; + FILE *f; + int flag; + + snprintf(path, PATH_MAX, "%s/%s.aggr-per-core", dir, name); + + f = fopen(path, "r"); + if (f) { + if (fscanf(f, "%d", &flag) == 1) + alias->aggr_per_core = flag; + fclose(f); + } +} + + static int perf_pmu__parse_snapshot(struct perf_pmu_alias *alias, char *dir, char *name) { @@ -251,6 +269,7 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name, perf_pmu__parse_scale(alias, dir, name); perf_pmu__parse_per_pkg(alias, dir, name); perf_pmu__parse_snapshot(alias, dir, name); + perf_pmu__parse_aggr_per_core(alias, dir, name); } list_add_tail(&alias->list, list); @@ -285,6 +304,8 @@ static inline bool pmu_alias_info_file(char *name) return true; if (len > 9 && !strcmp(name + len - 9, ".snapshot")) return true; + if (len > 14 && !strcmp(name + len - 14, ".aggr-per-core")) + return true; return false; } @@ -864,6 +885,7 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms, int ret; info->per_pkg = false; + info->aggr_per_core = 0; /* * Mark unit and scale as not set @@ -887,6 +909,8 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms, if (alias->per_pkg) info->per_pkg = true; + if (alias->aggr_per_core) + info->aggr_per_core = alias->aggr_per_core; list_del(&term->list); free(term); diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index 5d7e84466bee..95e9e64f9e76 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h @@ -32,6 +32,7 @@ struct perf_pmu_info { double scale; bool per_pkg; bool snapshot; + int aggr_per_core; }; #define UNIT_MAX_LEN 31 /* max length for event unit name */ @@ -44,6 +45,7 @@ struct perf_pmu_alias { double scale; bool per_pkg; bool snapshot; + bool aggr_per_core; }; struct perf_pmu *perf_pmu__find(const char *name); -- 2.5.5