Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp4955272ybv; Tue, 11 Feb 2020 06:31:00 -0800 (PST) X-Google-Smtp-Source: APXvYqwxXLQ0lh1eI6sG2/LFbz1RsyC1UNnd7EVHZVkkPVIVENjS6TyYV9kFjBKdeK/oLSTv6IxF X-Received: by 2002:a05:6808:30d:: with SMTP id i13mr2930111oie.144.1581431460231; Tue, 11 Feb 2020 06:31:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1581431460; cv=none; d=google.com; s=arc-20160816; b=LZE53squNDUE0656uu6GaT+ub9KiIw4Sjw4Qeod/Mf4UIhdGAuoTMzGKFp1q04uA4t Oc7sjwcxgHr2SuBn/JxDRA9apEY8F0XA+mxE9njDLBqTj8Z7Io77hJ0MIP3dL5jytItk zz+Is1CXkLGHFyFrLwMJX6aVUB7iQQfr8O46/44Sov548KsVsnss9FA3JvM9XOx2JWZP kQZwWVrHHP5RqpXIp9hq1qqp7q4n2P1WtEVkKMFgz5LCoLB4wq49G4zQdOl7YnjW4oUA L4RdcICgplXhvw1CRHrQozgOuAN3YfjxfW7P7CNgIE6ZKvrjrvH4TKMgUui/sMPsHvjm B4fQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=xC8PbSfizwXeTGE+lT15jZRP7b4xXEW+T0HZAVBliMw=; b=LCq0nPKLnQ4bJh7NSURCrbcBuhXCyyxU6J60hchHFfzFVgJNa0t4xaGX4avAg6hF4V x/fH5Qdwf1pr8Wj4f5nG2ObkHBLXD3qeXpmxSF5q5J6c8wVxzzvI/HQ+RomMy3AYAK8m scG4U35/v3I5/LXl3skso+8i8mBck+INKhgPWseHzc0ewsLlgtGzwum9AoAJwNHc8yVt yHx25uyyYLUHLnZqm4/yJb2rsxzD+lDCR164tcmiUzPnNefLNGaYCKxBUlSY5JFwbB0O bLEPep6m5GKPjB4OLOnjpo2Fq6I8XFY5ML54Af+DXc4nvIsVZa/YbsX6lMkFHOWflb5F mJPQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k13si1689194oij.118.2020.02.11.06.30.47; Tue, 11 Feb 2020 06:31:00 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729815AbgBKOFL (ORCPT + 99 others); Tue, 11 Feb 2020 09:05:11 -0500 Received: from foss.arm.com ([217.140.110.172]:46764 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729640AbgBKOFL (ORCPT ); Tue, 11 Feb 2020 09:05:11 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 539F31063; Tue, 11 Feb 2020 06:05:10 -0800 (PST) Received: from e121896.warwick.arm.com (e121896.warwick.arm.com [10.32.36.33]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 6CB103F68F; Tue, 11 Feb 2020 06:05:07 -0800 (PST) From: James Clark To: jolsa@redhat.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: nd@arm.com, Tan Xiaojun , James Clark , Will Deacon , Mark Rutland , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Alexander Shishkin , Al Grant , Namhyung Kim Subject: [PATCH v4 4/4] perf tools: Support "branch-misses:pp" on arm64 Date: Tue, 11 Feb 2020 14:04:45 +0000 Message-Id: <20200211140445.21986-5-james.clark@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200211140445.21986-1-james.clark@arm.com> References: <20200210122509.GA2005279@krava> <20200211140445.21986-1-james.clark@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Tan Xiaojun At the suggestion of James Clark, use spe to support the precise ip of some events. Currently its support event is: branch-misses. Example usage: $ ./perf record -e branch-misses:pp dd if=/dev/zero of=/dev/null count=10000 (:p/pp/ppp is same for this case.) $ ./perf report --stdio ("--stdio is not necessary") -------------------------------------------------------------------- ... # Samples: 14 of event 'branch-misses:pp' # Event count (approx.): 14 # # Children Self Command Shared Object Symbol # ........ ........ ....... ................. .......................... # 14.29% 14.29% dd [kernel.kallsyms] [k] __arch_copy_from_user 14.29% 14.29% dd libc-2.28.so [.] _dl_addr 7.14% 7.14% dd [kernel.kallsyms] [k] __free_pages 7.14% 7.14% dd [kernel.kallsyms] [k] __pi_memcpy 7.14% 7.14% dd [kernel.kallsyms] [k] pagecache_get_page 7.14% 7.14% dd [kernel.kallsyms] [k] unmap_single_vma 7.14% 7.14% dd dd [.] 0x00000000000025ec 7.14% 7.14% dd ld-2.28.so [.] _dl_lookup_symbol_x 7.14% 7.14% dd ld-2.28.so [.] check_match 7.14% 7.14% dd libc-2.28.so [.] __mpn_rshift 7.14% 7.14% dd libc-2.28.so [.] _nl_intern_locale_data 7.14% 7.14% dd libc-2.28.so [.] read_alias_file ... -------------------------------------------------------------------- Signed-off-by: Tan Xiaojun Suggested-by: James Clark Tested-by: Qi Liu Signed-off-by: James Clark Cc: Will Deacon Cc: Mark Rutland Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Arnaldo Carvalho de Melo Cc: Alexander Shishkin Cc: Jiri Olsa Cc: Tan Xiaojun Cc: Al Grant Cc: Namhyung Kim --- tools/perf/arch/arm/util/auxtrace.c | 38 +++++++++++++++++++++++++++++ tools/perf/builtin-record.c | 5 ++++ tools/perf/util/arm-spe.c | 9 +++++++ tools/perf/util/arm-spe.h | 3 +++ tools/perf/util/auxtrace.h | 6 +++++ 5 files changed, 61 insertions(+) diff --git a/tools/perf/arch/arm/util/auxtrace.c b/tools/perf/arch/arm/util/auxtrace.c index 0a6e75b8777a..18f0ea7556e7 100644 --- a/tools/perf/arch/arm/util/auxtrace.c +++ b/tools/perf/arch/arm/util/auxtrace.c @@ -10,11 +10,25 @@ #include "../../util/auxtrace.h" #include "../../util/debug.h" +#include "../../util/env.h" #include "../../util/evlist.h" #include "../../util/pmu.h" #include "cs-etm.h" #include "arm-spe.h" +#define SPE_ATTR_TS_ENABLE BIT(0) +#define SPE_ATTR_PA_ENABLE BIT(1) +#define SPE_ATTR_PCT_ENABLE BIT(2) +#define SPE_ATTR_JITTER BIT(16) +#define SPE_ATTR_BRANCH_FILTER BIT(32) +#define SPE_ATTR_LOAD_FILTER BIT(33) +#define SPE_ATTR_STORE_FILTER BIT(34) + +#define SPE_ATTR_EV_RETIRED BIT(1) +#define SPE_ATTR_EV_CACHE BIT(3) +#define SPE_ATTR_EV_TLB BIT(5) +#define SPE_ATTR_EV_BRANCH BIT(7) + static struct perf_pmu **find_all_arm_spe_pmus(int *nr_spes, int *err) { struct perf_pmu **arm_spe_pmus = NULL; @@ -108,3 +122,27 @@ struct auxtrace_record *err = 0; return NULL; } + +void auxtrace__preprocess_evlist(struct evlist *evlist) +{ + struct evsel *evsel; + struct perf_pmu *pmu; + + evlist__for_each_entry(evlist, evsel) { + /* Currently only supports precise_ip for branch-misses on arm64 */ + if (!strcmp(perf_env__arch(evlist->env), "arm64") + && evsel->core.attr.config == PERF_COUNT_HW_BRANCH_MISSES + && evsel->core.attr.precise_ip) + { + pmu = perf_pmu__find("arm_spe_0"); + if (pmu) { + evsel->pmu_name = pmu->name; + evsel->core.attr.type = pmu->type; + evsel->core.attr.config = SPE_ATTR_TS_ENABLE + | SPE_ATTR_BRANCH_FILTER; + evsel->core.attr.config1 = SPE_ATTR_EV_BRANCH; + evsel->core.attr.precise_ip = 0; + } + } + } +} \ No newline at end of file diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 4c301466101b..3bc61f03d572 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -2451,6 +2451,11 @@ int cmd_record(int argc, const char **argv) argc = parse_options(argc, argv, record_options, record_usage, PARSE_OPT_STOP_AT_NON_OPTION); + + if (auxtrace__preprocess_evlist) { + auxtrace__preprocess_evlist(rec->evlist); + } + if (quiet) perf_quiet_option(); diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c index 4ef22a0775a9..b21806c97dd8 100644 --- a/tools/perf/util/arm-spe.c +++ b/tools/perf/util/arm-spe.c @@ -778,6 +778,15 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session) attr.sample_id_all = evsel->core.attr.sample_id_all; attr.read_format = evsel->core.attr.read_format; + /* If it is in the precise ip mode, there is no need to + * synthesize new events. */ + if (!strncmp(evsel->name, "branch-misses", 13)) { + spe->sample_branch_miss = true; + spe->branch_miss_id = evsel->core.id[0]; + + return 0; + } + /* create new id val to be a fixed offset from evsel id */ id = evsel->core.id[0] + 1000000000; diff --git a/tools/perf/util/arm-spe.h b/tools/perf/util/arm-spe.h index 98d3235781c3..8b1fb191d03a 100644 --- a/tools/perf/util/arm-spe.h +++ b/tools/perf/util/arm-spe.h @@ -20,6 +20,8 @@ enum { union perf_event; struct perf_session; struct perf_pmu; +struct evlist; +struct evsel; struct auxtrace_record *arm_spe_recording_init(int *err, struct perf_pmu *arm_spe_pmu); @@ -28,4 +30,5 @@ int arm_spe_process_auxtrace_info(union perf_event *event, struct perf_session *session); struct perf_event_attr *arm_spe_pmu_default_config(struct perf_pmu *arm_spe_pmu); +void arm_spe_precise_ip_support(struct evlist *evlist, struct evsel *evsel); #endif diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h index 80617b0d044d..4f89a3a31ab2 100644 --- a/tools/perf/util/auxtrace.h +++ b/tools/perf/util/auxtrace.h @@ -584,6 +584,7 @@ void auxtrace__dump_auxtrace_sample(struct perf_session *session, int auxtrace__flush_events(struct perf_session *session, struct perf_tool *tool); void auxtrace__free_events(struct perf_session *session); void auxtrace__free(struct perf_session *session); +void auxtrace__preprocess_evlist(struct evlist *evlist) __attribute__((weak)); #define ITRACE_HELP \ " i: synthesize instructions events\n" \ @@ -728,6 +729,11 @@ void auxtrace__free(struct perf_session *session __maybe_unused) { } +static inline +void auxtrace__preprocess_evlist(struct evlist *evlist __maybe_unused) +{ +} + static inline int auxtrace_index__write(int fd __maybe_unused, struct list_head *head __maybe_unused) -- 2.17.1