Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp725178ybv; Fri, 7 Feb 2020 07:25:25 -0800 (PST) X-Google-Smtp-Source: APXvYqy5c0ebYuhM4uj0ZbPfZqrv/URyX1Y4UrEDVMRxXO/ya1oCnJlChmkFxn2zoZm0bI/PZCrk X-Received: by 2002:a05:6808:319:: with SMTP id i25mr2455184oie.128.1581089125422; Fri, 07 Feb 2020 07:25:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1581089125; cv=none; d=google.com; s=arc-20160816; b=F3RziL93QFLJo+xRPz9pPvNdKaNDb3EXxEW/EvuRYg7eMZ5PmFenH9M0z/56X6RZLR Cx9RiJ57T3Rs8ID5OMhfkgVdKdMzQi+Go00IDAcj/uzesfSXOUJHqm9hoLJpFlXsus9s 1UOAcEvO3DAgeC3V4ElczW8cbfaEF9H8TDTN/qe04rhq5Rr1+qis8VQsDUXto2XJv8LH IDH0dPTX/AnGxM3k3JLBrdURzXDoJwA2+6XYeoH+QQIzJQsaavrdlJK/bKHUqPg4vE/B 485XGDFsV7B7Ev/E1vj0u6mKsbWOY64oTpmfnbRHGmPkMghoBRfppFHY7Z4rc5AeKOX/ 77Ew== 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=a6t5V3neBGS2QbSraG5jAhffgGLBY0vqem9tZv3EWzw=; b=HttxAM0QzqGKcLUJEQgR9NwKa1PPz8Jx5W2aDoyxnwveSh8PhO/rgtiUrNqQzVq80T uVO/IaN3aYHNoUK1vHX4U5Cdf7BcrwD41yEiEjz7g1pM7fxgLml1HWSOxwbhmZmk1Ppi 2Myw++Vrk6SwCDgki7W1nXjBLXlNkwh6LtSeLqoXWU0oB374Ybhc2q4tjb69ar3hhKvp /hwkDyHlTfaTVOwW/CGYbS79Lr6sXPrlMflt1hHh4xSDVVUTxkEmhBGILwHarUrfpRmj fTewhSo32nV2Pn1vA99CDGU/yG7uZeOalQMQYDMOcdiUAgDo7SbXu8ne7Ngbb2+8E/KY iTPQ== 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 b10si2150092otq.183.2020.02.07.07.25.12; Fri, 07 Feb 2020 07:25:25 -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 S1727496AbgBGPXJ (ORCPT + 99 others); Fri, 7 Feb 2020 10:23:09 -0500 Received: from foss.arm.com ([217.140.110.172]:41164 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727114AbgBGPXJ (ORCPT ); Fri, 7 Feb 2020 10:23:09 -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 9675A106F; Fri, 7 Feb 2020 07:23:08 -0800 (PST) Received: from e121896.default (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id B8B083F6CF; Fri, 7 Feb 2020 07:23:05 -0800 (PST) From: James Clark To: jolsa@redhat.com, liwei391@huawei.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 v3 4/4] perf tools: Support "branch-misses:pp" on arm64 Date: Fri, 7 Feb 2020 15:21:42 +0000 Message-Id: <20200207152142.28662-5-james.clark@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200207152142.28662-1-james.clark@arm.com> References: <20200127123108.GC1114818@krava> <20200207152142.28662-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 +++++ tools/perf/util/evlist.c | 1 + tools/perf/util/evsel.h | 1 - 7 files changed, 62 insertions(+), 1 deletion(-) 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) diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 1548237b6558..84136d0adb29 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -9,6 +9,7 @@ #include #include #include +#include "arm-spe.h" #include "cpumap.h" #include "util/mmap.h" #include "thread_map.h" diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index dc14f4a823cd..c212e2eeeeb2 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -174,7 +174,6 @@ void perf_evsel__exit(struct evsel *evsel); void evsel__delete(struct evsel *evsel); struct callchain_param; - void perf_evsel__config(struct evsel *evsel, struct record_opts *opts, struct callchain_param *callchain); -- 2.17.1