[PATCH v22 0/5] arm64/perf: Enable branch stack sampling

Rob Herring (Arm) posted 5 patches 7 months ago
There is a newer version of this series
Documentation/arch/arm64/booting.rst |  21 +
arch/arm64/include/asm/el2_setup.h   |  81 +++-
arch/arm64/include/asm/kvm_host.h    |   2 +
arch/arm64/include/asm/sysreg.h      |  17 +-
arch/arm64/kvm/debug.c               |   4 +
arch/arm64/kvm/hyp/nvhe/debug-sr.c   |  32 ++
arch/arm64/kvm/hyp/nvhe/switch.c     |   2 +-
arch/arm64/tools/sysreg              | 132 ++++++
drivers/perf/Kconfig                 |  11 +
drivers/perf/Makefile                |   1 +
drivers/perf/arm_brbe.c              | 802 +++++++++++++++++++++++++++++++++++
drivers/perf/arm_brbe.h              |  47 ++
drivers/perf/arm_pmu.c               |  16 +-
drivers/perf/arm_pmuv3.c             | 125 +++++-
include/linux/perf/arm_pmu.h         |   8 +
15 files changed, 1276 insertions(+), 25 deletions(-)
[PATCH v22 0/5] arm64/perf: Enable branch stack sampling
Posted by Rob Herring (Arm) 7 months ago
This series enables perf branch stack sampling support on arm64 via a 
v9.2 arch feature called Branch Record Buffer Extension (BRBE). Details 
on BRBE can be found in the Arm ARM[1] chapter D18.

I've picked up this series from Anshuman. v19 and later versions have 
been reworked quite a bit by Mark and myself. The bulk of those changes 
are in patch 5.

A git branch is here[2].

[1] https://developer.arm.com/documentation/ddi0487/latest/
[2] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git arm/brbe-v22

Changes in v22:
 - New patch reworking the labels in el2_setup.h
 - Move branch stack disabling after armpmu_stop() in armpmu_del()
 - Fix branch_records_alloc() to work on heterogeneous systems
 - Make setting .sched_task function ptr conditional on BRBE support
 - Reword booting.rst section name (s/feature/the/) and move next to
   other PMU related features instead of in the middle of SME features.
 - Drop setting SYS_BRBCR_EL1
 - Drop CONFIG_ARM64_BRBE ifdef
 - Rework initialization of HFGITR_EL2

v21:
 - https://lore.kernel.org/r/20250407-arm-brbe-v19-v21-0-ff187ff6c928@kernel.org
 - Drop clean-up patches 1-7 already applied
 - Rebase on v6.15-rc1

v20:
 - https://lore.kernel.org/r/20250218-arm-brbe-v19-v20-0-4e9922fc2e8e@kernel.org
 - Added back some of the arm64 specific exception types. The x86 IRQ 
   branches also include other exceptions like page faults. On arm64, we 
   can distinguish the exception types, so we do. Also, to better 
   align with x86, we convert 'call' branches which are user to kernel 
   to 'syscall'.
 - Only enable exceptions and exception returns if recording kernel
   branches (matching x86)
 - Drop requiring event and branch privileges to match
 - Add "branches" caps sysfs attribute like x86
 - Reword comment about FZP and MDCR_EL2.HPMN interaction
 - Rework BRBE invalidation to avoid invalidating in interrupt handler
   when no handled events capture the branch stack (i.e. when there are 
   multiple users).
 - Also clear BRBCR_ELx bits in brbe_disable(). This is for KVM nVHE 
   checks if BRBE is enabled.
 - Document that MDCR_EL3.SBRBE can be 0b01 also

v19:
 - https://lore.kernel.org/all/20250202-arm-brbe-v19-v19-0-1c1300802385@kernel.org/
 - Drop saving of branch records when task scheduled out (Mark). Make 
   sched_task() callback actually get called. Enabling requires a call 
   to perf_sched_cb_inc(). So the saving of branch records never 
   happened.
 - Got rid of added armpmu ops. All BRBE support is contained within 
   pmuv3 code.
 - Fix freeze on overflow for VHE
 - The cycle counter doesn't freeze BRBE on overflow, so avoid assigning
   it when BRBE is enabled.
 - Drop all the Arm specific exception branches. Not a clear need for
   them.
 - Fix handling of branch 'cycles' reading. CC field is
   mantissa/exponent, not an integer.
 - Rework s/w filtering to better match h/w filtering
 - Reject events with disjoint event filter and branch filter or with 
   exclude_host set
 - Dropped perf test patch which has been applied for 6.14
 - Dropped patch "KVM: arm64: Explicitly handle BRBE traps as UNDEFINED"
   which has been applied for 6.14

v18:
 - https://lore.kernel.org/all/20240613061731.3109448-1-anshuman.khandual@arm.com/

For v1-v17, see the above link. Not going to duplicate it all here...

Signed-off-by: "Rob Herring (Arm)" <robh@kernel.org>
---
---
Anshuman Khandual (4):
      arm64/sysreg: Add BRBE registers and fields
      arm64: el2_setup.h: Make __init_el2_fgt labels consistent, again
      arm64: Handle BRBE booting requirements
      KVM: arm64: nvhe: Disable branch generation in nVHE guests

Rob Herring (Arm) (1):
      perf: arm_pmuv3: Add support for the Branch Record Buffer Extension (BRBE)

 Documentation/arch/arm64/booting.rst |  21 +
 arch/arm64/include/asm/el2_setup.h   |  81 +++-
 arch/arm64/include/asm/kvm_host.h    |   2 +
 arch/arm64/include/asm/sysreg.h      |  17 +-
 arch/arm64/kvm/debug.c               |   4 +
 arch/arm64/kvm/hyp/nvhe/debug-sr.c   |  32 ++
 arch/arm64/kvm/hyp/nvhe/switch.c     |   2 +-
 arch/arm64/tools/sysreg              | 132 ++++++
 drivers/perf/Kconfig                 |  11 +
 drivers/perf/Makefile                |   1 +
 drivers/perf/arm_brbe.c              | 802 +++++++++++++++++++++++++++++++++++
 drivers/perf/arm_brbe.h              |  47 ++
 drivers/perf/arm_pmu.c               |  16 +-
 drivers/perf/arm_pmuv3.c             | 125 +++++-
 include/linux/perf/arm_pmu.h         |   8 +
 15 files changed, 1276 insertions(+), 25 deletions(-)
---
base-commit: 0af2f6be1b4281385b618cb86ad946eded089ac8
change-id: 20250129-arm-brbe-v19-24d5d9e5e623

Best regards,
-- 
Rob Herring (Arm) <robh@kernel.org>
Re: [PATCH v22 0/5] arm64/perf: Enable branch stack sampling
Posted by Will Deacon 7 months ago
On Tue, 20 May 2025 17:27:35 -0500, Rob Herring (Arm) wrote:
> This series enables perf branch stack sampling support on arm64 via a
> v9.2 arch feature called Branch Record Buffer Extension (BRBE). Details
> on BRBE can be found in the Arm ARM[1] chapter D18.
> 
> I've picked up this series from Anshuman. v19 and later versions have
> been reworked quite a bit by Mark and myself. The bulk of those changes
> are in patch 5.
> 
> [...]

Applied the '__init_el2_fgt' label cleanup to arm64 (for-next/entry), thanks!

[2/5] arm64: el2_setup.h: Make __init_el2_fgt labels consistent, again
      https://git.kernel.org/arm64/c/54b8070548c6

Cheers,
-- 
Will

https://fixes.arm64.dev
https://next.arm64.dev
https://will.arm64.dev
Re: [PATCH v22 0/5] arm64/perf: Enable branch stack sampling
Posted by James Clark 6 months, 3 weeks ago

On 20/05/2025 11:27 pm, Rob Herring (Arm) wrote:
> This series enables perf branch stack sampling support on arm64 via a
> v9.2 arch feature called Branch Record Buffer Extension (BRBE). Details
> on BRBE can be found in the Arm ARM[1] chapter D18.
> 
> I've picked up this series from Anshuman. v19 and later versions have
> been reworked quite a bit by Mark and myself. The bulk of those changes
> are in patch 5.
> 
> A git branch is here[2].
> 
> [1] https://developer.arm.com/documentation/ddi0487/latest/
> [2] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git arm/brbe-v22
> 
> Changes in v22:
>   - New patch reworking the labels in el2_setup.h
>   - Move branch stack disabling after armpmu_stop() in armpmu_del()
>   - Fix branch_records_alloc() to work on heterogeneous systems
>   - Make setting .sched_task function ptr conditional on BRBE support
>   - Reword booting.rst section name (s/feature/the/) and move next to
>     other PMU related features instead of in the middle of SME features.
>   - Drop setting SYS_BRBCR_EL1
>   - Drop CONFIG_ARM64_BRBE ifdef
>   - Rework initialization of HFGITR_EL2
> 
> v21:
>   - https://lore.kernel.org/r/20250407-arm-brbe-v19-v21-0-ff187ff6c928@kernel.org
>   - Drop clean-up patches 1-7 already applied
>   - Rebase on v6.15-rc1
> 
> v20:
>   - https://lore.kernel.org/r/20250218-arm-brbe-v19-v20-0-4e9922fc2e8e@kernel.org
>   - Added back some of the arm64 specific exception types. The x86 IRQ
>     branches also include other exceptions like page faults. On arm64, we
>     can distinguish the exception types, so we do. Also, to better
>     align with x86, we convert 'call' branches which are user to kernel
>     to 'syscall'.
>   - Only enable exceptions and exception returns if recording kernel
>     branches (matching x86)
>   - Drop requiring event and branch privileges to match
>   - Add "branches" caps sysfs attribute like x86
>   - Reword comment about FZP and MDCR_EL2.HPMN interaction
>   - Rework BRBE invalidation to avoid invalidating in interrupt handler
>     when no handled events capture the branch stack (i.e. when there are
>     multiple users).
>   - Also clear BRBCR_ELx bits in brbe_disable(). This is for KVM nVHE
>     checks if BRBE is enabled.
>   - Document that MDCR_EL3.SBRBE can be 0b01 also
> 
> v19:
>   - https://lore.kernel.org/all/20250202-arm-brbe-v19-v19-0-1c1300802385@kernel.org/
>   - Drop saving of branch records when task scheduled out (Mark). Make
>     sched_task() callback actually get called. Enabling requires a call
>     to perf_sched_cb_inc(). So the saving of branch records never
>     happened.
>   - Got rid of added armpmu ops. All BRBE support is contained within
>     pmuv3 code.
>   - Fix freeze on overflow for VHE
>   - The cycle counter doesn't freeze BRBE on overflow, so avoid assigning
>     it when BRBE is enabled.
>   - Drop all the Arm specific exception branches. Not a clear need for
>     them.
>   - Fix handling of branch 'cycles' reading. CC field is
>     mantissa/exponent, not an integer.
>   - Rework s/w filtering to better match h/w filtering
>   - Reject events with disjoint event filter and branch filter or with
>     exclude_host set
>   - Dropped perf test patch which has been applied for 6.14
>   - Dropped patch "KVM: arm64: Explicitly handle BRBE traps as UNDEFINED"
>     which has been applied for 6.14
> 
> v18:
>   - https://lore.kernel.org/all/20240613061731.3109448-1-anshuman.khandual@arm.com/
> 
> For v1-v17, see the above link. Not going to duplicate it all here...
> 
> Signed-off-by: "Rob Herring (Arm)" <robh@kernel.org>
> ---
> ---
> Anshuman Khandual (4):
>        arm64/sysreg: Add BRBE registers and fields
>        arm64: el2_setup.h: Make __init_el2_fgt labels consistent, again
>        arm64: Handle BRBE booting requirements
>        KVM: arm64: nvhe: Disable branch generation in nVHE guests
> 
> Rob Herring (Arm) (1):
>        perf: arm_pmuv3: Add support for the Branch Record Buffer Extension (BRBE)
> 
>   Documentation/arch/arm64/booting.rst |  21 +
>   arch/arm64/include/asm/el2_setup.h   |  81 +++-
>   arch/arm64/include/asm/kvm_host.h    |   2 +
>   arch/arm64/include/asm/sysreg.h      |  17 +-
>   arch/arm64/kvm/debug.c               |   4 +
>   arch/arm64/kvm/hyp/nvhe/debug-sr.c   |  32 ++
>   arch/arm64/kvm/hyp/nvhe/switch.c     |   2 +-
>   arch/arm64/tools/sysreg              | 132 ++++++
>   drivers/perf/Kconfig                 |  11 +
>   drivers/perf/Makefile                |   1 +
>   drivers/perf/arm_brbe.c              | 802 +++++++++++++++++++++++++++++++++++
>   drivers/perf/arm_brbe.h              |  47 ++
>   drivers/perf/arm_pmu.c               |  16 +-
>   drivers/perf/arm_pmuv3.c             | 125 +++++-
>   include/linux/perf/arm_pmu.h         |   8 +
>   15 files changed, 1276 insertions(+), 25 deletions(-)
> ---
> base-commit: 0af2f6be1b4281385b618cb86ad946eded089ac8
> change-id: 20250129-arm-brbe-v19-24d5d9e5e623
> 
> Best regards,

Tested-by: James Clark <james.clark@linaro.org>