From: Raphael Gault <raphael.gault@arm.com>
To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org
Cc: mingo@redhat.com, peterz@infradead.org, catalin.marinas@arm.com,
will.deacon@arm.com, acme@kernel.org, mark.rutland@arm.com,
Raphael Gault <raphael.gault@arm.com>
Subject: [PATCH 4/7] arm64: pmu: Add function implementation to update event index in userpage.
Date: Tue, 11 Jun 2019 13:53:12 +0100 [thread overview]
Message-ID: <20190611125315.18736-5-raphael.gault@arm.com> (raw)
In-Reply-To: <20190611125315.18736-1-raphael.gault@arm.com>
In order to be able to access the counter directly for userspace,
we need to provide the index of the counter using the userpage.
We thus need to override the event_idx function to retrieve and
convert the perf_event index to armv8 hardware index.
Since the arm_pmu driver can be used by any implementation, even
if not armv8, two components play a role into making sure the
behaviour is correct and consistent with the PMU capabilities:
* the ARMPMU_EL0_RD_CNTR flag which denotes the capability to access
counter from userspace.
* the event_idx call back, which is implemented and initialized by
the PMU implementation: if no callback is provided, the default
behaviour applies, returning 0 as index value.
Signed-off-by: Raphael Gault <raphael.gault@arm.com>
---
arch/arm64/kernel/perf_event.c | 21 +++++++++++++++++++++
include/linux/perf/arm_pmu.h | 2 ++
2 files changed, 23 insertions(+)
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
index 348d12eec566..293e4c365a53 100644
--- a/arch/arm64/kernel/perf_event.c
+++ b/arch/arm64/kernel/perf_event.c
@@ -829,6 +829,22 @@ static void armv8pmu_clear_event_idx(struct pmu_hw_events *cpuc,
clear_bit(idx - 1, cpuc->used_mask);
}
+static int armv8pmu_access_event_idx(struct perf_event *event)
+{
+ if (!(event->hw.flags & ARMPMU_EL0_RD_CNTR))
+ return 0;
+
+ /*
+ * We remap the cycle counter index to 32 to
+ * match the offset applied to the rest of
+ * the counter indeces.
+ */
+ if (event->hw.idx == ARMV8_IDX_CYCLE_COUNTER)
+ return 32;
+
+ return event->hw.idx;
+}
+
/*
* Add an event filter to a given event.
*/
@@ -922,6 +938,8 @@ static int __armv8_pmuv3_map_event(struct perf_event *event,
if (armv8pmu_event_is_64bit(event))
event->hw.flags |= ARMPMU_EVT_64BIT;
+ event->hw.flags |= ARMPMU_EL0_RD_CNTR;
+
/* Only expose micro/arch events supported by this PMU */
if ((hw_event_id > 0) && (hw_event_id < ARMV8_PMUV3_MAX_COMMON_EVENTS)
&& test_bit(hw_event_id, armpmu->pmceid_bitmap)) {
@@ -1042,6 +1060,8 @@ static int armv8_pmu_init(struct arm_pmu *cpu_pmu)
cpu_pmu->set_event_filter = armv8pmu_set_event_filter;
cpu_pmu->filter_match = armv8pmu_filter_match;
+ cpu_pmu->pmu.event_idx = armv8pmu_access_event_idx;
+
return 0;
}
@@ -1220,6 +1240,7 @@ void arch_perf_update_userpage(struct perf_event *event,
*/
freq = arch_timer_get_rate();
userpg->cap_user_time = 1;
+ userpg->cap_user_rdpmc = !!(event->hw.flags & ARMPMU_EL0_RD_CNTR);
clocks_calc_mult_shift(&userpg->time_mult, &shift, freq,
NSEC_PER_SEC, 0);
diff --git a/include/linux/perf/arm_pmu.h b/include/linux/perf/arm_pmu.h
index 4641e850b204..3bef390c1069 100644
--- a/include/linux/perf/arm_pmu.h
+++ b/include/linux/perf/arm_pmu.h
@@ -30,6 +30,8 @@
*/
/* Event uses a 64bit counter */
#define ARMPMU_EVT_64BIT 1
+/* Allow access to hardware counter from userspace */
+#define ARMPMU_EL0_RD_CNTR 2
#define HW_OP_UNSUPPORTED 0xFFFF
#define C(_x) PERF_COUNT_HW_CACHE_##_x
--
2.17.1
next prev parent reply other threads:[~2019-06-11 12:53 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-11 12:53 [PATCH 0/7] arm64: Enable access to pmu registers by user-space Raphael Gault
2019-06-11 12:53 ` [PATCH 1/7] perf: arm64: Compile tests unconditionally Raphael Gault
2019-06-11 14:09 ` Mark Rutland
2019-06-11 14:23 ` Arnaldo Carvalho de Melo
2019-06-11 17:01 ` Mark Rutland
2019-06-22 6:34 ` [tip:perf/core] perf tests " tip-bot for Raphael Gault
2019-06-11 12:53 ` [PATCH 2/7] perf: arm64: Add test to check userspace access to hardware counters Raphael Gault
2019-06-11 12:53 ` [PATCH 3/7] perf: arm64: Use rseq to test userspace access to pmu counters Raphael Gault
2019-06-11 14:33 ` Arnaldo Carvalho de Melo
2019-06-11 16:57 ` Mark Rutland
2019-06-11 19:33 ` Mathieu Desnoyers
2019-06-13 7:10 ` Raphael Gault
2019-06-13 8:27 ` Mathieu Desnoyers
2019-06-13 11:02 ` Raphael Gault
2019-06-25 13:20 ` Raphael Gault
2019-06-25 13:29 ` Raphael Gault
2019-06-25 13:41 ` Will Deacon
2019-06-11 12:53 ` Raphael Gault [this message]
2019-06-11 12:53 ` [PATCH 5/7] arm64: pmu: Add hook to handle pmu-related undefined instructions Raphael Gault
2019-06-11 12:53 ` [PATCH 6/7] arm64: perf: Enable pmu counter direct access for perf event on armv8 Raphael Gault
2019-06-11 12:53 ` [PATCH 7/7] Documentation: arm64: Document PMU counters access from userspace Raphael Gault
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190611125315.18736-5-raphael.gault@arm.com \
--to=raphael.gault@arm.com \
--cc=acme@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).