diff mbox series

[V3,7/7] arm64/perf: Enable branch stack sampling

Message ID 20220929075857.158358-8-anshuman.khandual@arm.com (mailing list archive)
State New, archived
Headers show
Series arm64/perf: Enable branch stack sampling | expand

Commit Message

Anshuman Khandual Sept. 29, 2022, 7:58 a.m. UTC
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 <mark.rutland@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: linux-kernel@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
---
 drivers/perf/arm_pmu.c | 32 +++++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

Comments

James Clark Oct. 10, 2022, 1:55 p.m. UTC | #1
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 <mark.rutland@arm.com>
> Cc: Will Deacon <will@kernel.org>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Cc: linux-kernel@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
> ---
>  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;
Suzuki K Poulose Oct. 10, 2022, 3:48 p.m. UTC | #2
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 <mark.rutland@arm.com>
>> Cc: Will Deacon <will@kernel.org>
>> Cc: Catalin Marinas <catalin.marinas@arm.com>
>> Cc: linux-kernel@vger.kernel.org
>> Cc: linux-arm-kernel@lists.infradead.org
>> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
>> ---
>>   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
Anshuman Khandual Oct. 11, 2022, 9:27 a.m. UTC | #3
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 <mark.rutland@arm.com>
>>> Cc: Will Deacon <will@kernel.org>
>>> Cc: Catalin Marinas <catalin.marinas@arm.com>
>>> Cc: linux-kernel@vger.kernel.org
>>> Cc: linux-arm-kernel@lists.infradead.org
>>> Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
>>> ---
>>>   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.
diff mbox series

Patch

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;