[PATCH V13 03/10] arm64/perf: Add branch stack support in struct arm_pmu

Anshuman Khandual posted 10 patches 2 years, 7 months ago
There is a newer version of this series
[PATCH V13 03/10] arm64/perf: Add branch stack support in struct arm_pmu
Posted by Anshuman Khandual 2 years, 7 months ago
This updates 'struct arm_pmu' for branch stack sampling support being added
later. This adds an element 'reg_trbidr' to capture BRBE attribute details.
These updates here will help in tracking any branch stack sampling support.

This also enables perf branch stack sampling event on all 'struct arm pmu',
supporting the feature but after removing the current gate that blocks such
events unconditionally in armpmu_event_init(). Instead a quick probe can be
initiated via arm_pmu->has_branch_stack to ascertain the support.

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
Tested-by: James Clark <james.clark@arm.com>
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
 drivers/perf/arm_pmu.c       | 3 +--
 include/linux/perf/arm_pmu.h | 9 ++++++++-
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
index aada47e3b126..d9ffe9e56e74 100644
--- a/drivers/perf/arm_pmu.c
+++ b/drivers/perf/arm_pmu.c
@@ -510,8 +510,7 @@ static int armpmu_event_init(struct perf_event *event)
 		!cpumask_test_cpu(event->cpu, &armpmu->supported_cpus))
 		return -ENOENT;
 
-	/* does not support taken branch sampling */
-	if (has_branch_stack(event))
+	if (has_branch_stack(event) && !armpmu->has_branch_stack)
 		return -EOPNOTSUPP;
 
 	return __hw_perf_event_init(event);
diff --git a/include/linux/perf/arm_pmu.h b/include/linux/perf/arm_pmu.h
index f7fbd162ca4c..ba4204bdcebf 100644
--- a/include/linux/perf/arm_pmu.h
+++ b/include/linux/perf/arm_pmu.h
@@ -102,7 +102,9 @@ struct arm_pmu {
 	int		(*map_event)(struct perf_event *event);
 	void		(*sched_task)(struct perf_event_pmu_context *pmu_ctx, bool sched_in);
 	int		num_events;
-	bool		secure_access; /* 32-bit ARM only */
+	unsigned int	secure_access	: 1, /* 32-bit ARM only */
+			has_branch_stack: 1, /* 64-bit ARM only */
+			reserved	: 30;
 #define ARMV8_PMUV3_MAX_COMMON_EVENTS		0x40
 	DECLARE_BITMAP(pmceid_bitmap, ARMV8_PMUV3_MAX_COMMON_EVENTS);
 #define ARMV8_PMUV3_EXT_COMMON_EVENT_BASE	0x4000
@@ -118,6 +120,11 @@ struct arm_pmu {
 
 	/* Only to be used by ACPI probing code */
 	unsigned long acpi_cpuid;
+
+	/* Implementation specific attributes */
+#ifdef CONFIG_ARM64_BRBE
+	u64		reg_brbidr;
+#endif
 };
 
 #define to_arm_pmu(p) (container_of(p, struct arm_pmu, pmu))
-- 
2.25.1
Re: [PATCH V13 03/10] arm64/perf: Add branch stack support in struct arm_pmu
Posted by Namhyung Kim 2 years, 7 months ago
Hello,

On Wed, Jun 21, 2023 at 11:55 PM Anshuman Khandual
<anshuman.khandual@arm.com> wrote:
>
> This updates 'struct arm_pmu' for branch stack sampling support being added
> later. This adds an element 'reg_trbidr' to capture BRBE attribute details.

reg_brbidr, right?

Thanks,
Namhyung


> These updates here will help in tracking any branch stack sampling support.
>
> This also enables perf branch stack sampling event on all 'struct arm pmu',
> supporting the feature but after removing the current gate that blocks such
> events unconditionally in armpmu_event_init(). Instead a quick probe can be
> initiated via arm_pmu->has_branch_stack to ascertain the support.
>
> 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
> Tested-by: James Clark <james.clark@arm.com>
> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
> ---
>  drivers/perf/arm_pmu.c       | 3 +--
>  include/linux/perf/arm_pmu.h | 9 ++++++++-
>  2 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
> index aada47e3b126..d9ffe9e56e74 100644
> --- a/drivers/perf/arm_pmu.c
> +++ b/drivers/perf/arm_pmu.c
> @@ -510,8 +510,7 @@ static int armpmu_event_init(struct perf_event *event)
>                 !cpumask_test_cpu(event->cpu, &armpmu->supported_cpus))
>                 return -ENOENT;
>
> -       /* does not support taken branch sampling */
> -       if (has_branch_stack(event))
> +       if (has_branch_stack(event) && !armpmu->has_branch_stack)
>                 return -EOPNOTSUPP;
>
>         return __hw_perf_event_init(event);
> diff --git a/include/linux/perf/arm_pmu.h b/include/linux/perf/arm_pmu.h
> index f7fbd162ca4c..ba4204bdcebf 100644
> --- a/include/linux/perf/arm_pmu.h
> +++ b/include/linux/perf/arm_pmu.h
> @@ -102,7 +102,9 @@ struct arm_pmu {
>         int             (*map_event)(struct perf_event *event);
>         void            (*sched_task)(struct perf_event_pmu_context *pmu_ctx, bool sched_in);
>         int             num_events;
> -       bool            secure_access; /* 32-bit ARM only */
> +       unsigned int    secure_access   : 1, /* 32-bit ARM only */
> +                       has_branch_stack: 1, /* 64-bit ARM only */
> +                       reserved        : 30;
>  #define ARMV8_PMUV3_MAX_COMMON_EVENTS          0x40
>         DECLARE_BITMAP(pmceid_bitmap, ARMV8_PMUV3_MAX_COMMON_EVENTS);
>  #define ARMV8_PMUV3_EXT_COMMON_EVENT_BASE      0x4000
> @@ -118,6 +120,11 @@ struct arm_pmu {
>
>         /* Only to be used by ACPI probing code */
>         unsigned long acpi_cpuid;
> +
> +       /* Implementation specific attributes */
> +#ifdef CONFIG_ARM64_BRBE
> +       u64             reg_brbidr;
> +#endif
>  };
>
>  #define to_arm_pmu(p) (container_of(p, struct arm_pmu, pmu))
> --
> 2.25.1
>
Re: [PATCH V13 03/10] arm64/perf: Add branch stack support in struct arm_pmu
Posted by Anshuman Khandual 2 years, 7 months ago

On 6/24/23 04:51, Namhyung Kim wrote:
> Hello,
> 
> On Wed, Jun 21, 2023 at 11:55 PM Anshuman Khandual
> <anshuman.khandual@arm.com> wrote:
>> This updates 'struct arm_pmu' for branch stack sampling support being added
>> later. This adds an element 'reg_trbidr' to capture BRBE attribute details.
> reg_brbidr, right?

Yes, it's a typo indeed.