* [PATCH v6 0/4] x86/irq: Fix lost interrupts on CPU hot-unplug
@ 2026-09-23 4:30 Naman Jain
2026-09-23 4:30 ` [PATCH v6 1/4] x86/hyperv: Set irq_retrigger for root partition PCI/MSI irqchip Naman Jain
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Naman Jain @ 2026-09-23 4:30 UTC (permalink / raw)
To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
H . Peter Anvin, Wei Liu, K . Y . Srinivasan, Haiyang Zhang,
Dexuan Cui, Michael Kelley
Cc: Long Li, Nam Cao, Joerg Roedel, Suravee Suthikulpanit,
Vasant Hegde, Will Deacon, Robin Murphy, Lorenzo Pieralisi,
Krzysztof Wilczyński, Manivannan Sadhasivam, Rob Herring,
Bjorn Helgaas, Kees Cook, Rafael J . Wysocki, Radu Rendec,
Sean Christopherson, Kai Huang, Dmitry Ilvokhin, Shradha Gupta,
Christophe JAILLET, Thierry Reding, Jiri Wiesner,
Daniel J Blueman, linux-hyperv, linux-kernel, iommu, linux-pci
On CPU hot-unplug, fixup_irqs() re-injects interrupts that are still
pending in the outgoing CPU's IRR via the irqchip's irq_retrigger()
callback. The Hyper-V root partition PCI/MSI irqchip lost that callback
when it was converted to msi_create_parent_irq_domain(), so such a
pending interrupt is silently dropped, leading to lost interrupts, stalls
and "No irq handler for vector" messages.
Patch 1 is the minimal, backportable fix (Fixes:/Cc: stable) that restores
irq_chip_retrigger_hierarchy() on the Hyper-V root partition PCI/MSI chip.
The equivalent guest pci-hyperv.c fix from the previous version is already
merged, so it is dropped here.
Patch 2 then switches fixup_irqs() to call irq_chip_retrigger_hierarchy()
directly which ensures that this issue does not occur for chips that
miss adding this initialization.
Patch 3 makes a similar change in msi_set_affinity()
Patch 4 then drops the now-redundant irq_retrigger() initializations.
This way, patch 2-4 do not need to be backported.
Changes since v5:
https://lore.kernel.org/all/20260914111836.2119301-1-namjain@linux.microsoft.com/
* Commit messages refinement/correction (Michael)
Changes since v4:
https://lore.kernel.org/all/20260909064448.1004-1-namjain@linux.microsoft.com/
* Discussion between Thomas and Michael concluded that if-else check for
irq_retrigger callback is not required, and
irq_chip_retrigger_hierarchy() can safely replace all irq_retrigger
invocations. Make the change to remove if-else blocks and update commit
msg accordingly. Older series could not be picked because there was a
genuine change in patch 1 of this series.
Changes since v3:
https://lore.kernel.org/all/20260907065129.269262-1-namjain@linux.microsoft.com/
* Move irq_retrigger setting to hv_init_dev_msi_info() in patch 1
(Michael, Nam)
* Add if-else fallback check in msi_set_affinity() in patch 3 (Michael)
* Break patch 3 into two separate patches, while *keeping review tags*.
Changes since v2:
https://lore.kernel.org/all/20260810090716.2325295-1-namjain@linux.microsoft.com/
* Add a backportable fix for Hyper-V root partition irqchip (Wei)
* Add a check for custom irq_retrigger implementations and add direct
irq_chip_retrigger_hierarchy() calls as a fallback if it is not
defined by a chip. (Sashiko, Michael)
* Removed local loop variable change, and continue using the irq_desc
accessor function (Michael)
* Did not pick "Acked-by: Manivannan Sadhasivam" as it was on v1, and v3
is a functionally different to some extent, specially patch 2.
Requesting you to please review again.
Changes since v1:
https://lore.kernel.org/all/20260728135117.2888175-1-namjain@linux.microsoft.com/#t
* Added Review tags
* Adding minor clarification in commit msg of patch 2 (Shradha)
Original RFC: https://lore.kernel.org/all/87y0f3jhd6.ffs@fw13/
Naman Jain (4):
x86/hyperv: Set irq_retrigger for root partition PCI/MSI irqchip
x86/irq: Use irq_chip_retrigger_hierarchy() in fixup_irqs()
x86/irq: Use irq_chip_retrigger_hierarchy() in msi_set_affinity()
x86/irq, iommu/amd, x86/hyperv, PCI: Drop redundant irq_retrigger
inits
arch/x86/kernel/apic/io_apic.c | 2 --
arch/x86/kernel/apic/msi.c | 4 +---
arch/x86/kernel/hpet.c | 1 -
arch/x86/kernel/irq.c | 18 ++++++++----------
drivers/iommu/amd/init.c | 1 -
drivers/pci/controller/pci-hyperv.c | 1 -
6 files changed, 9 insertions(+), 18 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v6 1/4] x86/hyperv: Set irq_retrigger for root partition PCI/MSI irqchip
2026-09-23 4:30 [PATCH v6 0/4] x86/irq: Fix lost interrupts on CPU hot-unplug Naman Jain
@ 2026-09-23 4:30 ` Naman Jain
2026-09-23 4:30 ` [PATCH v6 2/4] x86/irq: Use irq_chip_retrigger_hierarchy() in fixup_irqs() Naman Jain
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Naman Jain @ 2026-09-23 4:30 UTC (permalink / raw)
To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
H . Peter Anvin, Wei Liu, K . Y . Srinivasan, Haiyang Zhang,
Dexuan Cui, Michael Kelley
Cc: Long Li, Nam Cao, Joerg Roedel, Suravee Suthikulpanit,
Vasant Hegde, Will Deacon, Robin Murphy, Lorenzo Pieralisi,
Krzysztof Wilczyński, Manivannan Sadhasivam, Rob Herring,
Bjorn Helgaas, Kees Cook, Rafael J . Wysocki, Radu Rendec,
Sean Christopherson, Kai Huang, Dmitry Ilvokhin, Shradha Gupta,
Christophe JAILLET, Thierry Reding, Jiri Wiesner,
Daniel J Blueman, linux-hyperv, linux-kernel, iommu, linux-pci
The Hyper-V root partition vPCI MSI irqchip lost its irq_retrigger()
callback when it was converted to msi_create_parent_irq_domain(). The
callback was present on the original irqchip and was dropped during that
conversion.
On CPU hot-unplug fixup_irqs() migrates the interrupts which are affine to
the outgoing CPU to a new target. If an interrupt still has its pending bit
set in the outgoing CPU's IRR at that point, fixup_irqs() resends it on the
new target through the irqchip's irq_retrigger() callback. As the root
partition PCI/MSI chip no longer provides that callback, the pending
interrupt is silently dropped, which can result in lost interrupts, stalls
and "No irq handler for vector" messages during CPU hotplug.
Restore irq_chip_retrigger_hierarchy() as the irq_retrigger() callback for
the root partition PCI/MSI irqchip, so that a pending interrupt is resent
on its new target CPU via the parent x86 vector domain.
Fixes: 4691db0704ac ("x86/hyperv: Switch to msi_create_parent_irq_domain()")
Cc: stable@vger.kernel.org
Reviewed-by: Michael Kelley <mhklinux@outlook.com>
Reviewed-by: Nam Cao <namcao@linutronix.de>
Signed-off-by: Naman Jain <namjain@linux.microsoft.com>
---
arch/x86/hyperv/irqdomain.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/x86/hyperv/irqdomain.c b/arch/x86/hyperv/irqdomain.c
index b3ad50a874dca..6d790636c8b95 100644
--- a/arch/x86/hyperv/irqdomain.c
+++ b/arch/x86/hyperv/irqdomain.c
@@ -316,6 +316,7 @@ static bool hv_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
return false;
chip->flags |= IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MOVE_DEFERRED;
+ chip->irq_retrigger = irq_chip_retrigger_hierarchy;
info->ops->msi_prepare = pci_msi_prepare;
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v6 2/4] x86/irq: Use irq_chip_retrigger_hierarchy() in fixup_irqs()
2026-09-23 4:30 [PATCH v6 0/4] x86/irq: Fix lost interrupts on CPU hot-unplug Naman Jain
2026-09-23 4:30 ` [PATCH v6 1/4] x86/hyperv: Set irq_retrigger for root partition PCI/MSI irqchip Naman Jain
@ 2026-09-23 4:30 ` Naman Jain
2026-09-23 4:30 ` [PATCH v6 3/4] x86/irq: Use irq_chip_retrigger_hierarchy() in msi_set_affinity() Naman Jain
2026-09-23 4:30 ` [PATCH v6 4/4] x86/irq, iommu/amd, x86/hyperv, PCI: Drop redundant irq_retrigger inits Naman Jain
3 siblings, 0 replies; 7+ messages in thread
From: Naman Jain @ 2026-09-23 4:30 UTC (permalink / raw)
To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
H . Peter Anvin, Wei Liu, K . Y . Srinivasan, Haiyang Zhang,
Dexuan Cui, Michael Kelley
Cc: Long Li, Nam Cao, Joerg Roedel, Suravee Suthikulpanit,
Vasant Hegde, Will Deacon, Robin Murphy, Lorenzo Pieralisi,
Krzysztof Wilczyński, Manivannan Sadhasivam, Rob Herring,
Bjorn Helgaas, Kees Cook, Rafael J . Wysocki, Radu Rendec,
Sean Christopherson, Kai Huang, Dmitry Ilvokhin, Shradha Gupta,
Christophe JAILLET, Thierry Reding, Jiri Wiesner,
Daniel J Blueman, linux-hyperv, linux-kernel, iommu, linux-pci
fixup_irqs() re-injects a pending interrupt on its new target CPU by
looking at the outermost domain chip and invoking its irq_retrigger()
callback directly. When the outermost chip does not implement
irq_retrigger(), the pending interrupt is silently dropped, which can
lead to lost interrupts on CPU hot-unplug.
Use irq_chip_retrigger_hierarchy() instead, which walks up the interrupt
hierarchy until it finds a chip that implements irq_retrigger(). This
fixes the issues for those chips which miss initializing irq_retrigger
callback.
While at it, use a scoped guard for desc->lock. VECTOR_RETRIGGERED is
now set only when the retrigger succeeds instead of unconditionally,
which is harmless today since apic_retrigger_irq() always returns 1.
Suggested-by: Thomas Gleixner <tglx@kernel.org>
Reviewed-by: Shradha Gupta <shradhagupta@linux.microsoft.com>
Reviewed-by: Thomas Gleixner <tglx@kernel.org>
Reviewed-by: Michael Kelley <mhklinux@outlook.com>
Signed-off-by: Naman Jain <namjain@linux.microsoft.com>
---
arch/x86/kernel/irq.c | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index 30122f0b3af96..acdc1145cce6d 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -469,7 +469,7 @@ void fixup_irqs(void)
unsigned int vector;
struct irq_desc *desc;
struct irq_data *data;
- struct irq_chip *chip;
+ int ret;
irq_migrate_all_off_this_cpu();
@@ -490,21 +490,19 @@ void fixup_irqs(void)
* nothing else will touch it.
*/
for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) {
- if (IS_ERR_OR_NULL(__this_cpu_read(vector_irq[vector])))
+ desc = __this_cpu_read(vector_irq[vector]);
+
+ if (IS_ERR_OR_NULL(desc))
continue;
if (is_vector_pending(vector)) {
- desc = __this_cpu_read(vector_irq[vector]);
-
- raw_spin_lock(&desc->lock);
+ guard(raw_spinlock)(&desc->lock);
data = irq_desc_get_irq_data(desc);
- chip = irq_data_get_irq_chip(data);
- if (chip->irq_retrigger) {
- chip->irq_retrigger(data);
+ ret = irq_chip_retrigger_hierarchy(data);
+ if (ret)
__this_cpu_write(vector_irq[vector], VECTOR_RETRIGGERED);
- }
- raw_spin_unlock(&desc->lock);
}
+
if (__this_cpu_read(vector_irq[vector]) != VECTOR_RETRIGGERED)
__this_cpu_write(vector_irq[vector], VECTOR_UNUSED);
}
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v6 3/4] x86/irq: Use irq_chip_retrigger_hierarchy() in msi_set_affinity()
2026-09-23 4:30 [PATCH v6 0/4] x86/irq: Fix lost interrupts on CPU hot-unplug Naman Jain
2026-09-23 4:30 ` [PATCH v6 1/4] x86/hyperv: Set irq_retrigger for root partition PCI/MSI irqchip Naman Jain
2026-09-23 4:30 ` [PATCH v6 2/4] x86/irq: Use irq_chip_retrigger_hierarchy() in fixup_irqs() Naman Jain
@ 2026-09-23 4:30 ` Naman Jain
2026-09-23 14:30 ` Michael Kelley
2026-09-23 4:30 ` [PATCH v6 4/4] x86/irq, iommu/amd, x86/hyperv, PCI: Drop redundant irq_retrigger inits Naman Jain
3 siblings, 1 reply; 7+ messages in thread
From: Naman Jain @ 2026-09-23 4:30 UTC (permalink / raw)
To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
H . Peter Anvin, Wei Liu, K . Y . Srinivasan, Haiyang Zhang,
Dexuan Cui, Michael Kelley
Cc: Long Li, Nam Cao, Joerg Roedel, Suravee Suthikulpanit,
Vasant Hegde, Will Deacon, Robin Murphy, Lorenzo Pieralisi,
Krzysztof Wilczyński, Manivannan Sadhasivam, Rob Herring,
Bjorn Helgaas, Kees Cook, Rafael J . Wysocki, Radu Rendec,
Sean Christopherson, Kai Huang, Dmitry Ilvokhin, Shradha Gupta,
Christophe JAILLET, Thierry Reding, Jiri Wiesner,
Daniel J Blueman, linux-hyperv, linux-kernel, iommu, linux-pci
The irqchips used by msi_set_affinity() are initialized by
x86_init_dev_msi_info(), which sets their irq_retrigger() callback to
irq_chip_retrigger_hierarchy(). Call the hierarchy helper directly instead
of invoking it indirectly through the irqchip callback.
Suggested-by: Thomas Gleixner <tglx@kernel.org>
Reviewed-by: Shradha Gupta <shradhagupta@linux.microsoft.com>
Reviewed-by: Thomas Gleixner <tglx@kernel.org>
Signed-off-by: Naman Jain <namjain@linux.microsoft.com>
---
arch/x86/kernel/apic/msi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
index 66bc5d3e79db3..9160227b9b32a 100644
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -137,7 +137,7 @@ msi_set_affinity(struct irq_data *irqd, const struct cpumask *mask, bool force)
* IRR.
*/
if (lapic_vector_set_in_irr(cfg->vector))
- irq_data_get_irq_chip(irqd)->irq_retrigger(irqd);
+ irq_chip_retrigger_hierarchy(irqd);
return ret;
}
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v6 4/4] x86/irq, iommu/amd, x86/hyperv, PCI: Drop redundant irq_retrigger inits
2026-09-23 4:30 [PATCH v6 0/4] x86/irq: Fix lost interrupts on CPU hot-unplug Naman Jain
` (2 preceding siblings ...)
2026-09-23 4:30 ` [PATCH v6 3/4] x86/irq: Use irq_chip_retrigger_hierarchy() in msi_set_affinity() Naman Jain
@ 2026-09-23 4:30 ` Naman Jain
2026-09-23 14:33 ` Michael Kelley
3 siblings, 1 reply; 7+ messages in thread
From: Naman Jain @ 2026-09-23 4:30 UTC (permalink / raw)
To: Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
H . Peter Anvin, Wei Liu, K . Y . Srinivasan, Haiyang Zhang,
Dexuan Cui, Michael Kelley
Cc: Long Li, Nam Cao, Joerg Roedel, Suravee Suthikulpanit,
Vasant Hegde, Will Deacon, Robin Murphy, Lorenzo Pieralisi,
Krzysztof Wilczyński, Manivannan Sadhasivam, Rob Herring,
Bjorn Helgaas, Kees Cook, Rafael J . Wysocki, Radu Rendec,
Sean Christopherson, Kai Huang, Dmitry Ilvokhin, Shradha Gupta,
Christophe JAILLET, Thierry Reding, Jiri Wiesner,
Daniel J Blueman, linux-hyperv, linux-kernel, iommu, linux-pci
With fixup_irqs() and msi_set_affinity() now using
irq_chip_retrigger_hierarchy(), the outermost domain chips no longer need
the helper as their irq_retrigger() callback. The generic resend path
already uses the hierarchy helper.
The hierarchy walk reaches the x86 vector domain's apic_retrigger_irq() for
all of these stacked domain chips.
Remove the now redundant irq_retrigger() initializations from the outermost
domain interrupt chips, including the Hyper-V root partition PCI/MSI chip.
No functional change intended.
Suggested-by: Thomas Gleixner <tglx@kernel.org>
Reviewed-by: Shradha Gupta <shradhagupta@linux.microsoft.com>
Reviewed-by: Thomas Gleixner <tglx@kernel.org>
Signed-off-by: Naman Jain <namjain@linux.microsoft.com>
---
arch/x86/hyperv/irqdomain.c | 1 -
arch/x86/kernel/apic/io_apic.c | 2 --
arch/x86/kernel/apic/msi.c | 2 --
arch/x86/kernel/hpet.c | 1 -
drivers/iommu/amd/init.c | 1 -
drivers/pci/controller/pci-hyperv.c | 1 -
6 files changed, 8 deletions(-)
diff --git a/arch/x86/hyperv/irqdomain.c b/arch/x86/hyperv/irqdomain.c
index 6d790636c8b95..b3ad50a874dca 100644
--- a/arch/x86/hyperv/irqdomain.c
+++ b/arch/x86/hyperv/irqdomain.c
@@ -316,7 +316,6 @@ static bool hv_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
return false;
chip->flags |= IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MOVE_DEFERRED;
- chip->irq_retrigger = irq_chip_retrigger_hierarchy;
info->ops->msi_prepare = pci_msi_prepare;
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 7d7175d012288..18f49a251f23b 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1857,7 +1857,6 @@ static struct irq_chip ioapic_chip __read_mostly = {
.irq_ack = irq_chip_ack_parent,
.irq_eoi = ioapic_ack_level,
.irq_set_affinity = ioapic_set_affinity,
- .irq_retrigger = irq_chip_retrigger_hierarchy,
.irq_get_irqchip_state = ioapic_irq_get_chip_state,
.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MOVE_DEFERRED |
IRQCHIP_AFFINITY_PRE_STARTUP,
@@ -1871,7 +1870,6 @@ static struct irq_chip ioapic_ir_chip __read_mostly = {
.irq_ack = irq_chip_ack_parent,
.irq_eoi = ioapic_ir_ack_level,
.irq_set_affinity = ioapic_set_affinity,
- .irq_retrigger = irq_chip_retrigger_hierarchy,
.irq_get_irqchip_state = ioapic_irq_get_chip_state,
.flags = IRQCHIP_SKIP_SET_WAKE |
IRQCHIP_AFFINITY_PRE_STARTUP,
diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
index 9160227b9b32a..aad2f15eb2176 100644
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -246,7 +246,6 @@ static bool x86_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
info->ops->msi_prepare = x86_msi_prepare;
info->chip->irq_ack = irq_chip_ack_parent;
- info->chip->irq_retrigger = irq_chip_retrigger_hierarchy;
info->chip->flags |= IRQCHIP_SKIP_SET_WAKE |
IRQCHIP_AFFINITY_PRE_STARTUP;
@@ -313,7 +312,6 @@ static struct irq_chip dmar_msi_controller = {
.irq_mask = dmar_msi_mask,
.irq_ack = irq_chip_ack_parent,
.irq_set_affinity = msi_domain_set_affinity,
- .irq_retrigger = irq_chip_retrigger_hierarchy,
.irq_compose_msi_msg = dmar_msi_compose_msg,
.irq_write_msi_msg = dmar_msi_write_msg,
.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MOVE_DEFERRED |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
index 8dc7b710e1250..2bb7a6f466af3 100644
--- a/arch/x86/kernel/hpet.c
+++ b/arch/x86/kernel/hpet.c
@@ -509,7 +509,6 @@ static struct irq_chip hpet_msi_controller __ro_after_init = {
.irq_mask = hpet_msi_mask,
.irq_ack = irq_chip_ack_parent,
.irq_set_affinity = msi_domain_set_affinity,
- .irq_retrigger = irq_chip_retrigger_hierarchy,
.irq_write_msi_msg = hpet_msi_write_msg,
.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_AFFINITY_PRE_STARTUP,
};
diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
index 8a410d4aa3704..0d22324568911 100644
--- a/drivers/iommu/amd/init.c
+++ b/drivers/iommu/amd/init.c
@@ -2477,7 +2477,6 @@ static struct irq_chip intcapxt_controller = {
.irq_unmask = intcapxt_unmask_irq,
.irq_mask = intcapxt_mask_irq,
.irq_ack = irq_chip_ack_parent,
- .irq_retrigger = irq_chip_retrigger_hierarchy,
.irq_set_affinity = intcapxt_set_affinity,
.irq_set_wake = intcapxt_set_wake,
.flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_MOVE_DEFERRED,
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
index 056d379b3cee4..a004b08d68fe9 100644
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -2119,7 +2119,6 @@ static bool hv_pcie_init_dev_msi_info(struct device *dev, struct irq_domain *dom
info->ops->msi_prepare = hv_msi_prepare;
chip->irq_set_affinity = irq_chip_set_affinity_parent;
- chip->irq_retrigger = irq_chip_retrigger_hierarchy;
if (IS_ENABLED(CONFIG_X86))
chip->flags |= IRQCHIP_MOVE_DEFERRED;
--
2.43.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH v6 3/4] x86/irq: Use irq_chip_retrigger_hierarchy() in msi_set_affinity()
2026-09-23 4:30 ` [PATCH v6 3/4] x86/irq: Use irq_chip_retrigger_hierarchy() in msi_set_affinity() Naman Jain
@ 2026-09-23 14:30 ` Michael Kelley
0 siblings, 0 replies; 7+ messages in thread
From: Michael Kelley @ 2026-09-23 14:30 UTC (permalink / raw)
To: Naman Jain, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H . Peter Anvin, Wei Liu, K . Y . Srinivasan,
Haiyang Zhang, Dexuan Cui, Michael Kelley
Cc: Long Li, Nam Cao, Joerg Roedel, Suravee Suthikulpanit,
Vasant Hegde, Will Deacon, Robin Murphy, Lorenzo Pieralisi,
Krzysztof Wilczyński, Manivannan Sadhasivam, Rob Herring,
Bjorn Helgaas, Kees Cook, Rafael J . Wysocki, Radu Rendec,
Sean Christopherson, Kai Huang, Dmitry Ilvokhin, Shradha Gupta,
Christophe JAILLET, Thierry Reding, Jiri Wiesner,
Daniel J Blueman, linux-hyperv, linux-kernel, iommu, linux-pci
From: Naman Jain <namjain@linux.microsoft.com> Sent: Tuesday, September 22, 2026 9:30 PM
>
> The irqchips used by msi_set_affinity() are initialized by
> x86_init_dev_msi_info(), which sets their irq_retrigger() callback to
> irq_chip_retrigger_hierarchy(). Call the hierarchy helper directly instead
> of invoking it indirectly through the irqchip callback.
>
> Suggested-by: Thomas Gleixner <tglx@kernel.org>
> Reviewed-by: Shradha Gupta <shradhagupta@linux.microsoft.com>
> Reviewed-by: Thomas Gleixner <tglx@kernel.org>
> Signed-off-by: Naman Jain <namjain@linux.microsoft.com>
> ---
> arch/x86/kernel/apic/msi.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
> index 66bc5d3e79db3..9160227b9b32a 100644
> --- a/arch/x86/kernel/apic/msi.c
> +++ b/arch/x86/kernel/apic/msi.c
> @@ -137,7 +137,7 @@ msi_set_affinity(struct irq_data *irqd, const struct cpumask *mask, bool force)
> * IRR.
> */
> if (lapic_vector_set_in_irr(cfg->vector))
> - irq_data_get_irq_chip(irqd)->irq_retrigger(irqd);
> + irq_chip_retrigger_hierarchy(irqd);
>
> return ret;
> }
Reviewed-by: Michael Kelley <mhklinux@outlook.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH v6 4/4] x86/irq, iommu/amd, x86/hyperv, PCI: Drop redundant irq_retrigger inits
2026-09-23 4:30 ` [PATCH v6 4/4] x86/irq, iommu/amd, x86/hyperv, PCI: Drop redundant irq_retrigger inits Naman Jain
@ 2026-09-23 14:33 ` Michael Kelley
0 siblings, 0 replies; 7+ messages in thread
From: Michael Kelley @ 2026-09-23 14:33 UTC (permalink / raw)
To: Naman Jain, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H . Peter Anvin, Wei Liu, K . Y . Srinivasan,
Haiyang Zhang, Dexuan Cui, Michael Kelley
Cc: Nam Cao, Joerg Roedel, Suravee Suthikulpanit, Vasant Hegde,
Will Deacon, Robin Murphy, Lorenzo Pieralisi,
Krzysztof Wilczyński, Manivannan Sadhasivam, Rob Herring,
Bjorn Helgaas, Kees Cook, Rafael J . Wysocki, Radu Rendec,
Sean Christopherson, Kai Huang, Dmitry Ilvokhin, Shradha Gupta,
Christophe JAILLET, Thierry Reding, Jiri Wiesner,
Daniel J Blueman, linux-hyperv, linux-kernel, iommu, linux-pci
From: Naman Jain <namjain@linux.microsoft.com> Sent: Tuesday, September 22, 2026 9:30 PM
>
> With fixup_irqs() and msi_set_affinity() now using
> irq_chip_retrigger_hierarchy(), the outermost domain chips no longer need
> the helper as their irq_retrigger() callback. The generic resend path
> already uses the hierarchy helper.
>
> The hierarchy walk reaches the x86 vector domain's apic_retrigger_irq() for
> all of these stacked domain chips.
>
> Remove the now redundant irq_retrigger() initializations from the outermost
> domain interrupt chips, including the Hyper-V root partition PCI/MSI chip.
>
> No functional change intended.
>
> Suggested-by: Thomas Gleixner <tglx@kernel.org>
> Reviewed-by: Shradha Gupta <shradhagupta@linux.microsoft.com>
> Reviewed-by: Thomas Gleixner <tglx@kernel.org>
> Signed-off-by: Naman Jain <namjain@linux.microsoft.com>
Reviewed-by: Michael Kelley <mhklinux@outlook.com>
> ---
> arch/x86/hyperv/irqdomain.c | 1 -
> arch/x86/kernel/apic/io_apic.c | 2 --
> arch/x86/kernel/apic/msi.c | 2 --
> arch/x86/kernel/hpet.c | 1 -
> drivers/iommu/amd/init.c | 1 -
> drivers/pci/controller/pci-hyperv.c | 1 -
> 6 files changed, 8 deletions(-)
>
> diff --git a/arch/x86/hyperv/irqdomain.c b/arch/x86/hyperv/irqdomain.c
> index 6d790636c8b95..b3ad50a874dca 100644
> --- a/arch/x86/hyperv/irqdomain.c
> +++ b/arch/x86/hyperv/irqdomain.c
> @@ -316,7 +316,6 @@ static bool hv_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
> return false;
>
> chip->flags |= IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MOVE_DEFERRED;
> - chip->irq_retrigger = irq_chip_retrigger_hierarchy;
>
> info->ops->msi_prepare = pci_msi_prepare;
>
> diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
> index 7d7175d012288..18f49a251f23b 100644
> --- a/arch/x86/kernel/apic/io_apic.c
> +++ b/arch/x86/kernel/apic/io_apic.c
> @@ -1857,7 +1857,6 @@ static struct irq_chip ioapic_chip __read_mostly = {
> .irq_ack = irq_chip_ack_parent,
> .irq_eoi = ioapic_ack_level,
> .irq_set_affinity = ioapic_set_affinity,
> - .irq_retrigger = irq_chip_retrigger_hierarchy,
> .irq_get_irqchip_state = ioapic_irq_get_chip_state,
> .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MOVE_DEFERRED |
> IRQCHIP_AFFINITY_PRE_STARTUP,
> @@ -1871,7 +1870,6 @@ static struct irq_chip ioapic_ir_chip __read_mostly = {
> .irq_ack = irq_chip_ack_parent,
> .irq_eoi = ioapic_ir_ack_level,
> .irq_set_affinity = ioapic_set_affinity,
> - .irq_retrigger = irq_chip_retrigger_hierarchy,
> .irq_get_irqchip_state = ioapic_irq_get_chip_state,
> .flags = IRQCHIP_SKIP_SET_WAKE |
> IRQCHIP_AFFINITY_PRE_STARTUP,
> diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
> index 9160227b9b32a..aad2f15eb2176 100644
> --- a/arch/x86/kernel/apic/msi.c
> +++ b/arch/x86/kernel/apic/msi.c
> @@ -246,7 +246,6 @@ static bool x86_init_dev_msi_info(struct device *dev, struct irq_domain *domain,
> info->ops->msi_prepare = x86_msi_prepare;
>
> info->chip->irq_ack = irq_chip_ack_parent;
> - info->chip->irq_retrigger = irq_chip_retrigger_hierarchy;
> info->chip->flags |= IRQCHIP_SKIP_SET_WAKE |
> IRQCHIP_AFFINITY_PRE_STARTUP;
>
> @@ -313,7 +312,6 @@ static struct irq_chip dmar_msi_controller = {
> .irq_mask = dmar_msi_mask,
> .irq_ack = irq_chip_ack_parent,
> .irq_set_affinity = msi_domain_set_affinity,
> - .irq_retrigger = irq_chip_retrigger_hierarchy,
> .irq_compose_msi_msg = dmar_msi_compose_msg,
> .irq_write_msi_msg = dmar_msi_write_msg,
> .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MOVE_DEFERRED |
> diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
> index 8dc7b710e1250..2bb7a6f466af3 100644
> --- a/arch/x86/kernel/hpet.c
> +++ b/arch/x86/kernel/hpet.c
> @@ -509,7 +509,6 @@ static struct irq_chip hpet_msi_controller __ro_after_init = {
> .irq_mask = hpet_msi_mask,
> .irq_ack = irq_chip_ack_parent,
> .irq_set_affinity = msi_domain_set_affinity,
> - .irq_retrigger = irq_chip_retrigger_hierarchy,
> .irq_write_msi_msg = hpet_msi_write_msg,
> .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_AFFINITY_PRE_STARTUP,
> };
> diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
> index 8a410d4aa3704..0d22324568911 100644
> --- a/drivers/iommu/amd/init.c
> +++ b/drivers/iommu/amd/init.c
> @@ -2477,7 +2477,6 @@ static struct irq_chip intcapxt_controller = {
> .irq_unmask = intcapxt_unmask_irq,
> .irq_mask = intcapxt_mask_irq,
> .irq_ack = irq_chip_ack_parent,
> - .irq_retrigger = irq_chip_retrigger_hierarchy,
> .irq_set_affinity = intcapxt_set_affinity,
> .irq_set_wake = intcapxt_set_wake,
> .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_MOVE_DEFERRED,
> diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
> index 056d379b3cee4..a004b08d68fe9 100644
> --- a/drivers/pci/controller/pci-hyperv.c
> +++ b/drivers/pci/controller/pci-hyperv.c
> @@ -2119,7 +2119,6 @@ static bool hv_pcie_init_dev_msi_info(struct device *dev, struct irq_domain *dom
> info->ops->msi_prepare = hv_msi_prepare;
>
> chip->irq_set_affinity = irq_chip_set_affinity_parent;
> - chip->irq_retrigger = irq_chip_retrigger_hierarchy;
>
> if (IS_ENABLED(CONFIG_X86))
> chip->flags |= IRQCHIP_MOVE_DEFERRED;
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-09-23 14:33 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-23 4:30 [PATCH v6 0/4] x86/irq: Fix lost interrupts on CPU hot-unplug Naman Jain
2026-09-23 4:30 ` [PATCH v6 1/4] x86/hyperv: Set irq_retrigger for root partition PCI/MSI irqchip Naman Jain
2026-09-23 4:30 ` [PATCH v6 2/4] x86/irq: Use irq_chip_retrigger_hierarchy() in fixup_irqs() Naman Jain
2026-09-23 4:30 ` [PATCH v6 3/4] x86/irq: Use irq_chip_retrigger_hierarchy() in msi_set_affinity() Naman Jain
2026-09-23 14:30 ` Michael Kelley
2026-09-23 4:30 ` [PATCH v6 4/4] x86/irq, iommu/amd, x86/hyperv, PCI: Drop redundant irq_retrigger inits Naman Jain
2026-09-23 14:33 ` Michael Kelley
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®