From: Marc Zyngier <maz@kernel.org>
To: linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, linux-acpi@vger.kernel.org
Cc: Thomas Gleixner <tglx@linutronix.de>,
Mark Rutland <mark.rutland@arm.com>,
Will Deacon <will@kernel.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Rob Herring <robh@kernel.org>,
Saravana Kannan <saravanak@google.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Sven Peter <sven@kernel.org>, Janne Grunau <j@jannau.net>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
James Clark <james.clark@linaro.org>,
Jonathan Cameron <jonathan.cameron@huawei.com>,
Jinjie Ruan <ruanjinjie@huawei.com>,
Alexandru Elisei <alexandru.elisei@arm.com>
Subject: [PATCH v4 18/26] perf: arm_pmu: Request specific affinities for percpu NMI/IRQ
Date: Mon, 20 Oct 2025 13:29:35 +0100 [thread overview]
Message-ID: <20251020122944.3074811-19-maz@kernel.org> (raw)
In-Reply-To: <20251020122944.3074811-1-maz@kernel.org>
From: Will Deacon <will@kernel.org>
Let the PMU driver request both NMI and normal IRQs with an affinity
mask matching the PMU affinity.
Signed-off-by: Will Deacon <will@kernel.org>
Tested-by: Will Deacon <will@kernel.org>
Signed-off-by: Marc Zyngier <maz@kernel.org>
---
drivers/perf/arm_pmu.c | 44 +++++++++++++++++++--------------
drivers/perf/arm_pmu_acpi.c | 2 +-
drivers/perf/arm_pmu_platform.c | 4 +--
include/linux/perf/arm_pmu.h | 4 +--
4 files changed, 31 insertions(+), 23 deletions(-)
diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
index 22c601b46c858..959ceb3d1f556 100644
--- a/drivers/perf/arm_pmu.c
+++ b/drivers/perf/arm_pmu.c
@@ -26,7 +26,8 @@
#include <asm/irq_regs.h>
-static int armpmu_count_irq_users(const int irq);
+static int armpmu_count_irq_users(const struct cpumask *affinity,
+ const int irq);
struct pmu_irq_ops {
void (*enable_pmuirq)(unsigned int irq);
@@ -64,7 +65,9 @@ static void armpmu_enable_percpu_pmuirq(unsigned int irq)
static void armpmu_free_percpu_pmuirq(unsigned int irq, int cpu,
void __percpu *devid)
{
- if (armpmu_count_irq_users(irq) == 1)
+ struct arm_pmu *armpmu = *per_cpu_ptr((void * __percpu *)devid, cpu);
+
+ if (armpmu_count_irq_users(&armpmu->supported_cpus, irq) == 1)
free_percpu_irq(irq, devid);
}
@@ -89,7 +92,9 @@ static void armpmu_disable_percpu_pmunmi(unsigned int irq)
static void armpmu_free_percpu_pmunmi(unsigned int irq, int cpu,
void __percpu *devid)
{
- if (armpmu_count_irq_users(irq) == 1)
+ struct arm_pmu *armpmu = *per_cpu_ptr((void * __percpu *)devid, cpu);
+
+ if (armpmu_count_irq_users(&armpmu->supported_cpus, irq) == 1)
free_percpu_nmi(irq, devid);
}
@@ -580,11 +585,11 @@ static const struct attribute_group armpmu_common_attr_group = {
.attrs = armpmu_common_attrs,
};
-static int armpmu_count_irq_users(const int irq)
+static int armpmu_count_irq_users(const struct cpumask *affinity, const int irq)
{
int cpu, count = 0;
- for_each_possible_cpu(cpu) {
+ for_each_cpu(cpu, affinity) {
if (per_cpu(cpu_irq, cpu) == irq)
count++;
}
@@ -592,12 +597,13 @@ static int armpmu_count_irq_users(const int irq)
return count;
}
-static const struct pmu_irq_ops *armpmu_find_irq_ops(int irq)
+static const struct pmu_irq_ops *
+armpmu_find_irq_ops(const struct cpumask *affinity, int irq)
{
const struct pmu_irq_ops *ops = NULL;
int cpu;
- for_each_possible_cpu(cpu) {
+ for_each_cpu(cpu, affinity) {
if (per_cpu(cpu_irq, cpu) != irq)
continue;
@@ -609,22 +615,25 @@ static const struct pmu_irq_ops *armpmu_find_irq_ops(int irq)
return ops;
}
-void armpmu_free_irq(int irq, int cpu)
+void armpmu_free_irq(struct arm_pmu * __percpu *armpmu, int irq, int cpu)
{
if (per_cpu(cpu_irq, cpu) == 0)
return;
if (WARN_ON(irq != per_cpu(cpu_irq, cpu)))
return;
- per_cpu(cpu_irq_ops, cpu)->free_pmuirq(irq, cpu, &cpu_armpmu);
+ per_cpu(cpu_irq_ops, cpu)->free_pmuirq(irq, cpu, armpmu);
per_cpu(cpu_irq, cpu) = 0;
per_cpu(cpu_irq_ops, cpu) = NULL;
}
-int armpmu_request_irq(int irq, int cpu)
+int armpmu_request_irq(struct arm_pmu * __percpu *pcpu_armpmu, int irq, int cpu)
{
int err = 0;
+ struct arm_pmu **armpmu = per_cpu_ptr(pcpu_armpmu, cpu);
+ const struct cpumask *affinity = *armpmu ? &(*armpmu)->supported_cpus :
+ cpu_possible_mask; /* ACPI */
const irq_handler_t handler = armpmu_dispatch_irq;
const struct pmu_irq_ops *irq_ops;
@@ -646,25 +655,24 @@ int armpmu_request_irq(int irq, int cpu)
IRQF_NOBALANCING | IRQF_NO_AUTOEN |
IRQF_NO_THREAD;
- err = request_nmi(irq, handler, irq_flags, "arm-pmu",
- per_cpu_ptr(&cpu_armpmu, cpu));
+ err = request_nmi(irq, handler, irq_flags, "arm-pmu", armpmu);
/* If cannot get an NMI, get a normal interrupt */
if (err) {
err = request_irq(irq, handler, irq_flags, "arm-pmu",
- per_cpu_ptr(&cpu_armpmu, cpu));
+ armpmu);
irq_ops = &pmuirq_ops;
} else {
has_nmi = true;
irq_ops = &pmunmi_ops;
}
- } else if (armpmu_count_irq_users(irq) == 0) {
- err = request_percpu_nmi(irq, handler, "arm-pmu", NULL, &cpu_armpmu);
+ } else if (armpmu_count_irq_users(affinity, irq) == 0) {
+ err = request_percpu_nmi(irq, handler, "arm-pmu", affinity, pcpu_armpmu);
/* If cannot get an NMI, get a normal interrupt */
if (err) {
- err = request_percpu_irq(irq, handler, "arm-pmu",
- &cpu_armpmu);
+ err = request_percpu_irq_affinity(irq, handler, "arm-pmu",
+ affinity, pcpu_armpmu);
irq_ops = &percpu_pmuirq_ops;
} else {
has_nmi = true;
@@ -672,7 +680,7 @@ int armpmu_request_irq(int irq, int cpu)
}
} else {
/* Per cpudevid irq was already requested by another CPU */
- irq_ops = armpmu_find_irq_ops(irq);
+ irq_ops = armpmu_find_irq_ops(affinity, irq);
if (WARN_ON(!irq_ops))
err = -EINVAL;
diff --git a/drivers/perf/arm_pmu_acpi.c b/drivers/perf/arm_pmu_acpi.c
index 05dda19c5359a..e80f76d95e68b 100644
--- a/drivers/perf/arm_pmu_acpi.c
+++ b/drivers/perf/arm_pmu_acpi.c
@@ -218,7 +218,7 @@ static int arm_pmu_acpi_parse_irqs(void)
* them with their PMUs.
*/
per_cpu(pmu_irqs, cpu) = irq;
- err = armpmu_request_irq(irq, cpu);
+ err = armpmu_request_irq(&probed_pmus, irq, cpu);
if (err)
goto out_err;
}
diff --git a/drivers/perf/arm_pmu_platform.c b/drivers/perf/arm_pmu_platform.c
index 9c0494d8a867a..1c9e50a132015 100644
--- a/drivers/perf/arm_pmu_platform.c
+++ b/drivers/perf/arm_pmu_platform.c
@@ -165,7 +165,7 @@ static int armpmu_request_irqs(struct arm_pmu *armpmu)
if (!irq)
continue;
- err = armpmu_request_irq(irq, cpu);
+ err = armpmu_request_irq(&hw_events->percpu_pmu, irq, cpu);
if (err)
break;
}
@@ -181,7 +181,7 @@ static void armpmu_free_irqs(struct arm_pmu *armpmu)
for_each_cpu(cpu, &armpmu->supported_cpus) {
int irq = per_cpu(hw_events->irq, cpu);
- armpmu_free_irq(irq, cpu);
+ armpmu_free_irq(&hw_events->percpu_pmu, irq, cpu);
}
}
diff --git a/include/linux/perf/arm_pmu.h b/include/linux/perf/arm_pmu.h
index 93c9a26492fcf..6690bd77aa4ee 100644
--- a/include/linux/perf/arm_pmu.h
+++ b/include/linux/perf/arm_pmu.h
@@ -190,8 +190,8 @@ bool arm_pmu_irq_is_nmi(void);
struct arm_pmu *armpmu_alloc(void);
void armpmu_free(struct arm_pmu *pmu);
int armpmu_register(struct arm_pmu *pmu);
-int armpmu_request_irq(int irq, int cpu);
-void armpmu_free_irq(int irq, int cpu);
+int armpmu_request_irq(struct arm_pmu * __percpu *armpmu, int irq, int cpu);
+void armpmu_free_irq(struct arm_pmu * __percpu *armpmu, int irq, int cpu);
#define ARMV8_PMU_PDEV_NAME "armv8-pmu"
--
2.47.3
next prev parent reply other threads:[~2025-10-20 12:30 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-20 12:29 [PATCH v4 00/26] genirq: Add support for percpu_devid IRQ affinity Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 01/26] irqdomain: Add firmware info reporting interface Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 02/26] ACPI: irq: Add IRQ affinity " Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] ACPI: irq: Add interrupt " tip-bot2 for Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 03/26] of/irq: Add IRQ " Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] of/irq: Add interrupt " tip-bot2 for Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 04/26] platform: Add firmware-agnostic irq and affinity retrieval interface Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 05/26] irqchip/gic-v3: Add FW info retrieval support Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-11-12 16:54 ` [PATCH v4 05/26] " Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 06/26] irqchip/apple-aic: " Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 07/26] coresight: trbe: Convert to new IRQ affinity retrieval API Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] coresight: trbe: Convert to the new interrupt " tip-bot2 for Marc Zyngier
2025-11-12 16:58 ` [PATCH v4 07/26] coresight: trbe: Convert to new IRQ " Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 08/26] perf: arm_pmu: " Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] perf: arm_pmu: Convert to the new interrupt " tip-bot2 for Marc Zyngier
2025-11-12 16:59 ` [PATCH v4 08/26] perf: arm_pmu: Convert to new IRQ " Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 09/26] perf: arm_spe_pmu: " Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] perf: arm_spe_pmu: Convert to new interrupt " tip-bot2 for Marc Zyngier
2025-11-12 17:58 ` [PATCH v4 09/26] perf: arm_spe_pmu: Convert to new IRQ " Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 10/26] irqchip/gic-v3: Switch high priority PPIs over to handle_percpu_devid_irq() Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-11-12 18:06 ` [PATCH v4 10/26] " Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 11/26] genirq: Kill handle_percpu_devid_fasteoi_nmi() Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-11-12 18:07 ` [PATCH v4 11/26] " Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 12/26] genirq: Merge irqaction::{dev_id,percpu_dev_id} Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-11-12 18:09 ` [PATCH v4 12/26] " Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 13/26] genirq: Factor-in percpu irqaction creation Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 14/26] genirq: Add affinity to percpu_devid interrupt requests Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-11-12 18:13 ` [PATCH v4 14/26] " Jonathan Cameron
2025-11-13 13:37 ` Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 15/26] genirq: Update request_percpu_nmi() to take an affinity Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-11-12 18:15 ` [PATCH v4 15/26] " Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 16/26] genirq: Allow per-cpu interrupt sharing for non-overlapping affinities Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-11-12 18:25 ` [PATCH v4 16/26] " Jonathan Cameron
2025-12-04 10:56 ` Daniel Thompson
2025-12-04 14:21 ` Marc Zyngier
2025-12-05 9:19 ` Daniel Thompson
2025-10-20 12:29 ` [PATCH v4 17/26] genirq: Add request_percpu_irq_affinity() helper Marc Zyngier
2025-10-27 16:31 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-11-12 18:27 ` [PATCH v4 17/26] " Jonathan Cameron
2025-11-13 13:39 ` Marc Zyngier
2025-10-20 12:29 ` Marc Zyngier [this message]
2025-10-27 16:31 ` [tip: irq/core] perf: arm_pmu: Request specific affinities for per CPU NMIs/interrupts tip-bot2 for Will Deacon
2025-11-12 18:31 ` [PATCH v4 18/26] perf: arm_pmu: Request specific affinities for percpu NMI/IRQ Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 19/26] perf: arm_spe_pmu: Request specific affinities for percpu IRQ Marc Zyngier
2025-10-27 16:30 ` [tip: irq/core] perf: arm_spe_pmu: Request specific affinities for per CPU interrupts tip-bot2 for Marc Zyngier
2025-11-12 18:31 ` [PATCH v4 19/26] perf: arm_spe_pmu: Request specific affinities for percpu IRQ Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 20/26] coresight: trbe: " Marc Zyngier
2025-10-27 16:30 ` [tip: irq/core] coresight: trbe: Request specific affinities for per CPU interrupts tip-bot2 for Marc Zyngier
2025-11-12 18:32 ` [PATCH v4 20/26] coresight: trbe: Request specific affinities for percpu IRQ Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 21/26] irqchip/gic-v3: Drop support for custom PPI partitions Marc Zyngier
2025-10-27 16:30 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 22/26] irqchip/apple-aic: Drop support for custom PMU irq partitions Marc Zyngier
2025-10-27 16:30 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 23/26] irqchip: Kill irq-partition-percpu Marc Zyngier
2025-10-27 16:30 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 24/26] genirq: Kill irq_{g,s}et_percpu_devid_partition() Marc Zyngier
2025-10-27 16:30 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-10-20 12:29 ` [PATCH v4 25/26] irqdomain: Kill of_node_to_fwnode() helper Marc Zyngier
2025-10-27 16:30 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
2025-11-12 18:35 ` [PATCH v4 25/26] " Jonathan Cameron
2025-10-20 12:29 ` [PATCH v4 26/26] perf: arm_pmu: Kill last use of per-CPU cpu_armpmu pointer Marc Zyngier
2025-10-27 16:30 ` [tip: irq/core] " tip-bot2 for Marc Zyngier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251020122944.3074811-19-maz@kernel.org \
--to=maz@kernel.org \
--cc=alexandru.elisei@arm.com \
--cc=gregkh@linuxfoundation.org \
--cc=j@jannau.net \
--cc=james.clark@linaro.org \
--cc=jonathan.cameron@huawei.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=rafael@kernel.org \
--cc=robh@kernel.org \
--cc=ruanjinjie@huawei.com \
--cc=saravanak@google.com \
--cc=suzuki.poulose@arm.com \
--cc=sven@kernel.org \
--cc=tglx@linutronix.de \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.