From: mark.rutland@arm.com (Mark Rutland)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 4/7] arm: perf: filter unschedulable events
Date: Wed, 13 May 2015 17:12:26 +0100 [thread overview]
Message-ID: <1431533549-27715-5-git-send-email-mark.rutland@arm.com> (raw)
In-Reply-To: <1431533549-27715-1-git-send-email-mark.rutland@arm.com>
Different CPU microarchitectures implement different PMU events, and
thus events which can be scheduled on one microarchitecture cannot be
scheduled on another, and vice-versa. Some archicted events behave
differently across microarchitectures, and thus cannot be meaningfully
summed. Due to this, we reject the scheduling of an event on a CPU of a
different microarchitecture to that the event targets.
When the core perf code is scheduling events and encounters an event
which cannot be scheduled, it stops attempting to schedule events. As
the perf core periodically rotates the list of events, for some
proportion of the time events which are unschedulable will block events
which are schedulable, resulting in low utilisation of the hardware
counters.
This patch implements a pmu::filter_match callback such that we can
detect and skip such events while scheduling early, before they can
block the schedulable events. This prevents the low HW counter
utilisation issue.
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Will Deacon <will.deacon@arm.com>
---
arch/arm/kernel/perf_event.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c
index 9b536be..df02807 100644
--- a/arch/arm/kernel/perf_event.c
+++ b/arch/arm/kernel/perf_event.c
@@ -524,6 +524,18 @@ static void armpmu_disable(struct pmu *pmu)
armpmu->stop(armpmu);
}
+/*
+ * In heterogeneous systems, events are specific to a particular
+ * microarchitecture, and aren't suitable for another. Thus, only match CPUs of
+ * the same microarchitecture.
+ */
+static int armpmu_filter_match(struct perf_event *event)
+{
+ struct arm_pmu *armpmu = to_arm_pmu(event->pmu);
+ unsigned int cpu = smp_processor_id();
+ return cpumask_test_cpu(cpu, &armpmu->supported_cpus);
+}
+
#ifdef CONFIG_PM
static int armpmu_runtime_resume(struct device *dev)
{
@@ -564,6 +576,7 @@ static void armpmu_init(struct arm_pmu *armpmu)
.start = armpmu_start,
.stop = armpmu_stop,
.read = armpmu_read,
+ .filter_match = armpmu_filter_match,
};
}
--
1.9.1
next prev parent reply other threads:[~2015-05-13 16:12 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-13 16:12 [PATCH 0/7] ARM: perf: heterogeneous PMU support Mark Rutland
2015-05-13 16:12 ` [PATCH 1/7] perf: allow for PMU-specific event filtering Mark Rutland
2015-05-22 14:08 ` Will Deacon
2015-05-27 8:51 ` Peter Zijlstra
2015-05-13 16:12 ` [PATCH 2/7] arm: perf: make of_pmu_irq_cfg take arm_pmu Mark Rutland
2015-05-13 16:12 ` [PATCH 3/7] arm: perf: treat PMUs as CPU affine Mark Rutland
2015-05-13 16:12 ` Mark Rutland [this message]
2015-05-13 16:12 ` [PATCH 5/7] arm: perf: probe number of counters on affine CPUs Mark Rutland
2015-05-13 16:12 ` [PATCH 6/7] arm: perf: remove singleton PMU restriction Mark Rutland
2015-05-13 16:12 ` [PATCH 7/7] arm: dts: vexpress: describe all PMUs in TC2 dts Mark Rutland
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=1431533549-27715-5-git-send-email-mark.rutland@arm.com \
--to=mark.rutland@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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).