[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <174982054908.406.13897114312168103744.tip-bot2@tip-bot2>
Date: Fri, 13 Jun 2025 13:15:49 -0000
From: "tip-bot2 for Brian Norris" <tip-bot2@...utronix.de>
To: linux-tip-commits@...r.kernel.org
Cc: Aleksandrs Vinarskis <alex.vinarskis@...il.com>,
Brian Norris <briannorris@...omium.org>, Thomas Gleixner <tglx@...utronix.de>,
x86@...nel.org, linux-kernel@...r.kernel.org, maz@...nel.org
Subject: [tip: irq/urgent] genirq/cpuhotplug: Rebalance managed interrupts
across multi-CPU hotplug
The following commit has been merged into the irq/urgent branch of tip:
Commit-ID: 2b32fc8ff08deac3aa509f321a28e21b1eea5525
Gitweb: https://git.kernel.org/tip/2b32fc8ff08deac3aa509f321a28e21b1eea5525
Author: Brian Norris <briannorris@...omium.org>
AuthorDate: Thu, 12 Jun 2025 11:32:51 -07:00
Committer: Thomas Gleixner <tglx@...utronix.de>
CommitterDate: Fri, 13 Jun 2025 15:13:35 +02:00
genirq/cpuhotplug: Rebalance managed interrupts across multi-CPU hotplug
Commit 788019eb559f ("genirq: Retain disable depth for managed interrupts
across CPU hotplug") intended to only decrement the disable depth once per
managed shutdown, but instead it decrements for each CPU hotplug in the
affinity mask, until its depth reaches a point where it finally gets
re-started.
For example, consider:
1. Interrupt is affine to CPU {M,N}
2. disable_irq() -> depth is 1
3. CPU M goes offline -> interrupt migrates to CPU N / depth is still 1
4. CPU N goes offline -> irq_shutdown() / depth is 2
5. CPU N goes online
-> irq_restore_affinity_of_irq()
-> irqd_is_managed_and_shutdown()==true
-> irq_startup_managed() -> depth is 1
6. CPU M goes online
-> irq_restore_affinity_of_irq()
-> irqd_is_managed_and_shutdown()==true
-> irq_startup_managed() -> depth is 0
*** BUG: driver expects the interrupt is still disabled ***
-> irq_startup() -> irqd_clr_managed_shutdown()
7. enable_irq() -> depth underflow / unbalanced enable_irq() warning
This should clear the managed-shutdown flag at step 6, so that further
hotplugs don't cause further imbalance.
Note: It might be cleaner to also remove the irqd_clr_managed_shutdown()
invocation from __irq_startup_managed(). But this is currently not possible
because of irq_update_affinity_desc() as it sets IRQD_MANAGED_SHUTDOWN and
expects irq_startup() to clear it.
Fixes: 788019eb559f ("genirq: Retain disable depth for managed interrupts across CPU hotplug")
Reported-by: Aleksandrs Vinarskis <alex.vinarskis@...il.com>
Signed-off-by: Brian Norris <briannorris@...omium.org>
Signed-off-by: Thomas Gleixner <tglx@...utronix.de>
Tested-by: Aleksandrs Vinarskis <alex.vinarskis@...il.com>
Link: https://lore.kernel.org/all/20250612183303.3433234-2-briannorris@chromium.org
---
kernel/irq/chip.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index b0e0a73..2b27400 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -205,6 +205,14 @@ __irq_startup_managed(struct irq_desc *desc, const struct cpumask *aff,
void irq_startup_managed(struct irq_desc *desc)
{
+ struct irq_data *d = irq_desc_get_irq_data(desc);
+
+ /*
+ * Clear managed-shutdown flag, so we don't repeat managed-startup for
+ * multiple hotplugs, and cause imbalanced disable depth.
+ */
+ irqd_clr_managed_shutdown(d);
+
/*
* Only start it up when the disable depth is 1, so that a disable,
* hotunplug, hotplug sequence does not end up enabling it during
Powered by blists - more mailing lists