From: Anshuman Khandual <anshuman.khandual@arm.com>
To: linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, will@kernel.org,
catalin.marinas@arm.com, mark.rutland@arm.com
Cc: Anshuman Khandual <anshuman.khandual@arm.com>,
Mark Brown <broonie@kernel.org>,
James Clark <james.clark@arm.com>, Rob Herring <robh@kernel.org>,
Marc Zyngier <maz@kernel.org>,
Suzuki Poulose <suzuki.poulose@arm.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
linux-perf-users@vger.kernel.org
Subject: [PATCH V9 07/10] arm64/perf: Add PERF_ATTACH_TASK_DATA to events with has_branch_stack()
Date: Wed, 15 Mar 2023 10:44:41 +0530 [thread overview]
Message-ID: <20230315051444.1683170-8-anshuman.khandual@arm.com> (raw)
In-Reply-To: <20230315051444.1683170-1-anshuman.khandual@arm.com>
Short running processes i.e those getting very small cpu run time each time
when they get scheduled on, might not accumulate much branch records before
a PMU IRQ really happens. This increases possibility, for such processes to
loose much of its branch records, while being scheduled in-out of various
cpus on the system.
There is a need to save all occurred branch records during the cpu run time
while the process gets scheduled out. It requires an event context specific
buffer for such storage.
This adds PERF_ATTACH_TASK_DATA flag unconditionally, for all branch stack
sampling events, which would allocate task_ctx_data during its event init.
This also creates a platform specific task_ctx_data kmem cache which will
serve such allocation requests.
This adds a new structure 'arm64_perf_task_context' which encapsulates brbe
register set for maximum possible BRBE entries on the HW along with a valid
records tracking element.
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
arch/arm64/kernel/brbe.c | 13 +++++++++++++
arch/arm64/kernel/brbe.h | 13 +++++++++++++
arch/arm64/kernel/perf_event.c | 8 ++++++--
3 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/kernel/brbe.c b/arch/arm64/kernel/brbe.c
index c37118983751..a8b4f89b5d00 100644
--- a/arch/arm64/kernel/brbe.c
+++ b/arch/arm64/kernel/brbe.c
@@ -109,20 +109,33 @@ bool armv8pmu_branch_valid(struct perf_event *event)
return true;
}
+static inline struct kmem_cache *
+arm64_create_brbe_task_ctx_kmem_cache(size_t size)
+{
+ return kmem_cache_create("arm64_brbe_task_ctx", size, 0, 0, NULL);
+}
+
int armv8pmu_private_alloc(struct arm_pmu *arm_pmu)
{
struct brbe_hw_attr *brbe_attr = kzalloc(sizeof(struct brbe_hw_attr), GFP_KERNEL);
+ size_t size = sizeof(struct arm64_perf_task_context);
if (!brbe_attr)
return -ENOMEM;
arm_pmu->private = brbe_attr;
+ arm_pmu->pmu.task_ctx_cache = arm64_create_brbe_task_ctx_kmem_cache(size);
+ if (!arm_pmu->pmu.task_ctx_cache) {
+ kfree(arm_pmu->private);
+ return -ENOMEM;
+ }
return 0;
}
void armv8pmu_private_free(struct arm_pmu *arm_pmu)
{
kfree(arm_pmu->private);
+ kmem_cache_destroy(arm_pmu->pmu.task_ctx_cache);
}
static int brbe_attributes_probe(struct arm_pmu *armpmu, u32 brbe)
diff --git a/arch/arm64/kernel/brbe.h b/arch/arm64/kernel/brbe.h
index a47480eec070..4a72c2ba7140 100644
--- a/arch/arm64/kernel/brbe.h
+++ b/arch/arm64/kernel/brbe.h
@@ -80,12 +80,25 @@
* --------------------------------- ------
*/
#define BRBE_BANK_MAX_ENTRIES 32
+#define BRBE_MAX_BANK 2
+#define BRBE_MAX_ENTRIES (BRBE_BANK_MAX_ENTRIES * BRBE_MAX_BANK)
#define BRBE_BANK0_IDX_MIN 0
#define BRBE_BANK0_IDX_MAX 31
#define BRBE_BANK1_IDX_MIN 32
#define BRBE_BANK1_IDX_MAX 63
+struct brbe_regset {
+ unsigned long brbsrc;
+ unsigned long brbtgt;
+ unsigned long brbinf;
+};
+
+struct arm64_perf_task_context {
+ struct brbe_regset store[BRBE_MAX_ENTRIES];
+ int nr_brbe_records;
+};
+
struct brbe_hw_attr {
int brbe_version;
int brbe_cc;
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
index b074502835a2..c100731c52a0 100644
--- a/arch/arm64/kernel/perf_event.c
+++ b/arch/arm64/kernel/perf_event.c
@@ -1067,8 +1067,12 @@ static int __armv8_pmuv3_map_event(struct perf_event *event,
&armv8_pmuv3_perf_cache_map,
ARMV8_PMU_EVTYPE_EVENT);
- if (has_branch_stack(event) && !armv8pmu_branch_valid(event))
- return -EOPNOTSUPP;
+ if (has_branch_stack(event)) {
+ if (!armv8pmu_branch_valid(event))
+ return -EOPNOTSUPP;
+
+ event->attach_state |= PERF_ATTACH_TASK_DATA;
+ }
/*
* CHAIN events only work when paired with an adjacent counter, and it
--
2.25.1
next prev parent reply other threads:[~2023-03-15 5:21 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-15 5:14 [PATCH V9 00/10] arm64/perf: Enable branch stack sampling Anshuman Khandual
2023-03-15 5:14 ` [PATCH V9 01/10] drivers: perf: arm_pmu: Add new sched_task() callback Anshuman Khandual
2023-03-15 5:14 ` [PATCH V9 02/10] arm64/perf: Add BRBE registers and fields Anshuman Khandual
2023-04-12 8:32 ` Yang Shen
2023-05-15 6:22 ` Anshuman Khandual
2023-03-15 5:14 ` [PATCH V9 03/10] arm64/perf: Add branch stack support in struct arm_pmu Anshuman Khandual
2023-03-15 5:14 ` [PATCH V9 04/10] arm64/perf: Add branch stack support in struct pmu_hw_events Anshuman Khandual
2023-03-15 5:14 ` [PATCH V9 05/10] arm64/perf: Add branch stack support in ARMV8 PMU Anshuman Khandual
2023-03-15 5:14 ` [PATCH V9 06/10] arm64/perf: Enable branch stack events via FEAT_BRBE Anshuman Khandual
2023-03-15 5:14 ` Anshuman Khandual [this message]
2023-03-15 5:14 ` [PATCH V9 08/10] arm64/perf: Add struct brbe_regset helper functions Anshuman Khandual
2023-03-15 5:14 ` [PATCH V9 09/10] arm64/perf: Implement branch records save on task sched out Anshuman Khandual
2023-03-15 5:14 ` [PATCH V9 10/10] arm64/perf: Implement branch records save on PMU IRQ Anshuman Khandual
2023-05-23 14:39 ` James Clark
2023-05-23 14:51 ` James Clark
2023-05-24 3:10 ` Anshuman Khandual
2023-03-21 19:02 ` [PATCH V9 00/10] arm64/perf: Enable branch stack sampling Mark Brown
2023-03-23 4:25 ` Anshuman Khandual
2023-03-23 12:54 ` Mark Brown
2023-03-24 3:20 ` Anshuman Khandual
2023-03-24 11:40 ` Mark Brown
2023-04-11 13:03 ` Will Deacon
2023-05-15 6:24 ` Anshuman Khandual
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=20230315051444.1683170-8-anshuman.khandual@arm.com \
--to=anshuman.khandual@arm.com \
--cc=acme@kernel.org \
--cc=broonie@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=james.clark@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=robh@kernel.org \
--cc=suzuki.poulose@arm.com \
--cc=will@kernel.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).