2022-09-29 08:06:41

by Anshuman Khandual

[permalink] [raw]
Subject: [PATCH V3 7/7] arm64/perf: Enable branch stack sampling

Now that all the required pieces are already in place, just enable the perf
branch stack sampling support on arm64 platform, by removing the gate which
blocks it in armpmu_event_init().

Cc: Mark Rutland <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: Catalin Marinas <[email protected]>
Cc: [email protected]
Cc: [email protected]
Signed-off-by: Anshuman Khandual <[email protected]>
---
drivers/perf/arm_pmu.c | 32 +++++++++++++++++++++++++++++---
1 file changed, 29 insertions(+), 3 deletions(-)

diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
index 93b36933124f..2a9b988b53c2 100644
--- a/drivers/perf/arm_pmu.c
+++ b/drivers/perf/arm_pmu.c
@@ -537,9 +537,35 @@ 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))
- return -EOPNOTSUPP;
+ if (has_branch_stack(event)) {
+ /*
+ * BRBE support is absent. Select CONFIG_ARM_BRBE_PMU
+ * in the config, before branch stack sampling events
+ * can be requested.
+ */
+ if (!IS_ENABLED(CONFIG_ARM_BRBE_PMU)) {
+ pr_warn_once("BRBE is disabled, select CONFIG_ARM_BRBE_PMU\n");
+ return -EOPNOTSUPP;
+ }
+
+ if (event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_KERNEL) {
+ if (!perfmon_capable()) {
+ pr_warn_once("does not have permission for kernel branch filter\n");
+ return -EPERM;
+ }
+ }
+
+ /*
+ * Branch stack sampling event can not be supported in
+ * case either the required driver itself is absent or
+ * BRBE buffer, is not supported. Besides checking for
+ * the callback prevents a crash in case it's absent.
+ */
+ if (!armpmu->brbe_supported || !armpmu->brbe_supported(event)) {
+ pr_warn_once("BRBE is not supported\n");
+ return -EOPNOTSUPP;
+ }
+ }

if (armpmu->map_event(event) == -ENOENT)
return -ENOENT;
--
2.25.1


2022-10-10 14:46:24

by James Clark

[permalink] [raw]
Subject: Re: [PATCH V3 7/7] arm64/perf: Enable branch stack sampling



On 29/09/2022 08:58, Anshuman Khandual wrote:
> Now that all the required pieces are already in place, just enable the perf
> branch stack sampling support on arm64 platform, by removing the gate which
> blocks it in armpmu_event_init().
>
> Cc: Mark Rutland <[email protected]>
> Cc: Will Deacon <[email protected]>
> Cc: Catalin Marinas <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Signed-off-by: Anshuman Khandual <[email protected]>
> ---
> drivers/perf/arm_pmu.c | 32 +++++++++++++++++++++++++++++---
> 1 file changed, 29 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
> index 93b36933124f..2a9b988b53c2 100644
> --- a/drivers/perf/arm_pmu.c
> +++ b/drivers/perf/arm_pmu.c
> @@ -537,9 +537,35 @@ 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))
> - return -EOPNOTSUPP;
> + if (has_branch_stack(event)) {
> + /*
> + * BRBE support is absent. Select CONFIG_ARM_BRBE_PMU
> + * in the config, before branch stack sampling events
> + * can be requested.
> + */
> + if (!IS_ENABLED(CONFIG_ARM_BRBE_PMU)) {
> + pr_warn_once("BRBE is disabled, select CONFIG_ARM_BRBE_PMU\n");
> + return -EOPNOTSUPP;
> + }
> +
> + if (event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_KERNEL) {
> + if (!perfmon_capable()) {

I'm still getting different behaviour compared to x86 when using
perf_event_paranoid because of this perfmon_capable() call here.

> + pr_warn_once("does not have permission for kernel branch filter\n");

Also I was under the impression that this should be more like a
KERN_INFO loglevel rather than a KERN_WARNING. It's more like expected
behavior rather than unexpected behavior and as far as I know anyone who
sees something in dmesg might think something has gone wrong and try to
follow it up. It is quite a useful message but I remember getting a
review like this before and it made sense to me.

> + return -EPERM;
> + }
> + }
> +
> + /*
> + * Branch stack sampling event can not be supported in
> + * case either the required driver itself is absent or
> + * BRBE buffer, is not supported. Besides checking for
> + * the callback prevents a crash in case it's absent.
> + */
> + if (!armpmu->brbe_supported || !armpmu->brbe_supported(event)) {
> + pr_warn_once("BRBE is not supported\n");
> + return -EOPNOTSUPP;
> + }
> + }
>
> if (armpmu->map_event(event) == -ENOENT)
> return -ENOENT;

2022-10-10 15:51:22

by Suzuki K Poulose

[permalink] [raw]
Subject: Re: [PATCH V3 7/7] arm64/perf: Enable branch stack sampling

On 10/10/2022 14:55, James Clark wrote:
>
>
> On 29/09/2022 08:58, Anshuman Khandual wrote:
>> Now that all the required pieces are already in place, just enable the perf
>> branch stack sampling support on arm64 platform, by removing the gate which
>> blocks it in armpmu_event_init().
>>
>> Cc: Mark Rutland <[email protected]>
>> Cc: Will Deacon <[email protected]>
>> Cc: Catalin Marinas <[email protected]>
>> Cc: [email protected]
>> Cc: [email protected]
>> Signed-off-by: Anshuman Khandual <[email protected]>
>> ---
>> drivers/perf/arm_pmu.c | 32 +++++++++++++++++++++++++++++---
>> 1 file changed, 29 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
>> index 93b36933124f..2a9b988b53c2 100644
>> --- a/drivers/perf/arm_pmu.c
>> +++ b/drivers/perf/arm_pmu.c
>> @@ -537,9 +537,35 @@ 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))
>> - return -EOPNOTSUPP;
>> + if (has_branch_stack(event)) {
>> + /*
>> + * BRBE support is absent. Select CONFIG_ARM_BRBE_PMU
>> + * in the config, before branch stack sampling events
>> + * can be requested.
>> + */
>> + if (!IS_ENABLED(CONFIG_ARM_BRBE_PMU)) {
>> + pr_warn_once("BRBE is disabled, select CONFIG_ARM_BRBE_PMU\n");
>> + return -EOPNOTSUPP;
>> + }
>> +
>> + if (event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_KERNEL) {
>> + if (!perfmon_capable()) {
>
> I'm still getting different behaviour compared to x86 when using
> perf_event_paranoid because of this perfmon_capable() call here.

Given the generic events framework already checks this for any
privileged branch samples (i.e., for both KERNEL and HV), the
individual drivers must not add additional restrictions.

>
>> + pr_warn_once("does not have permission for kernel branch filter\n");
>
> Also I was under the impression that this should be more like a
> KERN_INFO loglevel rather than a KERN_WARNING. It's more like expected
> behavior rather than unexpected behavior and as far as I know anyone who
> sees something in dmesg might think something has gone wrong and try to
> follow it up. It is quite a useful message but I remember getting a
> review like this before and it made sense to me.

+1

Suzuki

2022-10-11 09:38:46

by Anshuman Khandual

[permalink] [raw]
Subject: Re: [PATCH V3 7/7] arm64/perf: Enable branch stack sampling



On 10/10/22 21:18, Suzuki K Poulose wrote:
> On 10/10/2022 14:55, James Clark wrote:
>>
>>
>> On 29/09/2022 08:58, Anshuman Khandual wrote:
>>> Now that all the required pieces are already in place, just enable the perf
>>> branch stack sampling support on arm64 platform, by removing the gate which
>>> blocks it in armpmu_event_init().
>>>
>>> Cc: Mark Rutland <[email protected]>
>>> Cc: Will Deacon <[email protected]>
>>> Cc: Catalin Marinas <[email protected]>
>>> Cc: [email protected]
>>> Cc: [email protected]
>>> Signed-off-by: Anshuman Khandual <[email protected]>
>>> ---
>>>   drivers/perf/arm_pmu.c | 32 +++++++++++++++++++++++++++++---
>>>   1 file changed, 29 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
>>> index 93b36933124f..2a9b988b53c2 100644
>>> --- a/drivers/perf/arm_pmu.c
>>> +++ b/drivers/perf/arm_pmu.c
>>> @@ -537,9 +537,35 @@ 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))
>>> -        return -EOPNOTSUPP;
>>> +    if (has_branch_stack(event)) {
>>> +        /*
>>> +         * BRBE support is absent. Select CONFIG_ARM_BRBE_PMU
>>> +         * in the config, before branch stack sampling events
>>> +         * can be requested.
>>> +         */
>>> +        if (!IS_ENABLED(CONFIG_ARM_BRBE_PMU)) {
>>> +            pr_warn_once("BRBE is disabled, select CONFIG_ARM_BRBE_PMU\n");
>>> +            return -EOPNOTSUPP;
>>> +        }
>>> +
>>> +        if (event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_KERNEL) {
>>> +            if (!perfmon_capable()) {
>>
>> I'm still getting different behaviour compared to x86 when using
>> perf_event_paranoid because of this perfmon_capable() call here.
>
> Given the generic events framework already checks this for any
> privileged branch samples (i.e., for both KERNEL and HV), the
> individual drivers must not add additional restrictions.

Okay, will drop perfmon_capable() check here along with the warning.

>
>>
>>> +                pr_warn_once("does not have permission for kernel branch filter\n");
>>
>> Also I was under the impression that this should be more like a
>> KERN_INFO loglevel rather than a KERN_WARNING. It's more like expected
>> behavior rather than unexpected behavior and as far as I know anyone who
>> sees something in dmesg might think something has gone wrong and try to
>> follow it up. It is quite a useful message but I remember getting a
>> review like this before and it made sense to me.
>
> +1

Sure, will change remaining pr_warn_once() prints as pr_info() instead.