[PATCH v3 08/26] perf: arm_pmu: Convert to new IRQ affinity retrieval API

Marc Zyngier posted 26 patches 4 months, 2 weeks ago
There is a newer version of this series
[PATCH v3 08/26] perf: arm_pmu: Convert to new IRQ affinity retrieval API
Posted by Marc Zyngier 4 months, 2 weeks ago
Now that the relevant interrupt controllers are equipped with
a callback returning the affinity of per-CPU interrupts, switch
the OF side of the ARM PMU driver over to this new method.

Signed-off-by: Marc Zyngier <maz@kernel.org>
---
 drivers/perf/arm_pmu_platform.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/perf/arm_pmu_platform.c b/drivers/perf/arm_pmu_platform.c
index 118170a5cedef..9c0494d8a867a 100644
--- a/drivers/perf/arm_pmu_platform.c
+++ b/drivers/perf/arm_pmu_platform.c
@@ -42,14 +42,13 @@ static int probe_current_pmu(struct arm_pmu *pmu,
 	return ret;
 }
 
-static int pmu_parse_percpu_irq(struct arm_pmu *pmu, int irq)
+static int pmu_parse_percpu_irq(struct arm_pmu *pmu, int irq,
+				const struct cpumask *affinity)
 {
-	int cpu, ret;
 	struct pmu_hw_events __percpu *hw_events = pmu->hw_events;
+	int cpu;
 
-	ret = irq_get_percpu_devid_partition(irq, &pmu->supported_cpus);
-	if (ret)
-		return ret;
+	cpumask_copy(&pmu->supported_cpus, affinity);
 
 	for_each_cpu(cpu, &pmu->supported_cpus)
 		per_cpu(hw_events->irq, cpu) = irq;
@@ -115,9 +114,12 @@ static int pmu_parse_irqs(struct arm_pmu *pmu)
 	}
 
 	if (num_irqs == 1) {
-		int irq = platform_get_irq(pdev, 0);
+		const struct cpumask *affinity;
+		int irq;
+
+		irq = platform_get_irq_affinity(pdev, 0, &affinity);
 		if ((irq > 0) && irq_is_percpu_devid(irq))
-			return pmu_parse_percpu_irq(pmu, irq);
+			return pmu_parse_percpu_irq(pmu, irq, affinity);
 	}
 
 	if (nr_cpu_ids != 1 && !pmu_has_irq_affinity(dev->of_node))
-- 
2.47.3
Re: [PATCH v3 08/26] perf: arm_pmu: Convert to new IRQ affinity retrieval API
Posted by Jinjie Ruan 4 months ago

On 2025/9/22 16:28, Marc Zyngier wrote:
> Now that the relevant interrupt controllers are equipped with
> a callback returning the affinity of per-CPU interrupts, switch
> the OF side of the ARM PMU driver over to this new method.
> 
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> ---
>  drivers/perf/arm_pmu_platform.c | 16 +++++++++-------
>  1 file changed, 9 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/perf/arm_pmu_platform.c b/drivers/perf/arm_pmu_platform.c
> index 118170a5cedef..9c0494d8a867a 100644
> --- a/drivers/perf/arm_pmu_platform.c
> +++ b/drivers/perf/arm_pmu_platform.c
> @@ -42,14 +42,13 @@ static int probe_current_pmu(struct arm_pmu *pmu,
>  	return ret;
>  }
>  
> -static int pmu_parse_percpu_irq(struct arm_pmu *pmu, int irq)
> +static int pmu_parse_percpu_irq(struct arm_pmu *pmu, int irq,
> +				const struct cpumask *affinity)
>  {
> -	int cpu, ret;
>  	struct pmu_hw_events __percpu *hw_events = pmu->hw_events;
> +	int cpu;
>  
> -	ret = irq_get_percpu_devid_partition(irq, &pmu->supported_cpus);
> -	if (ret)
> -		return ret;
> +	cpumask_copy(&pmu->supported_cpus, affinity);
>  
>  	for_each_cpu(cpu, &pmu->supported_cpus)
>  		per_cpu(hw_events->irq, cpu) = irq;
> @@ -115,9 +114,12 @@ static int pmu_parse_irqs(struct arm_pmu *pmu)
>  	}
>  
>  	if (num_irqs == 1) {
> -		int irq = platform_get_irq(pdev, 0);
> +		const struct cpumask *affinity;
> +		int irq;
> +
> +		irq = platform_get_irq_affinity(pdev, 0, &affinity);
>  		if ((irq > 0) && irq_is_percpu_devid(irq))
> -			return pmu_parse_percpu_irq(pmu, irq);
> +			return pmu_parse_percpu_irq(pmu, irq, affinity);
>  	}
>  

Reviewed-by: Jinjie Ruan <ruanjinjie@huawei.com>

>  	if (nr_cpu_ids != 1 && !pmu_has_irq_affinity(dev->of_node))