On 9/8/2026 1:23 AM, Michael Kelley wrote:
From: Naman Jain <[email protected]> Sent: Sunday, September 6, 2026 11:51 PMThe 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: [email protected] Signed-off-by: Naman Jain <[email protected]> --- 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..1e273d7d6c5b3 100644 --- a/arch/x86/hyperv/irqdomain.c +++ b/arch/x86/hyperv/irqdomain.c @@ -304,6 +304,7 @@ static struct irq_chip hv_pci_msi_controller = { .irq_ack = irq_chip_ack_parent, .irq_compose_msi_msg = hv_irq_compose_msi_msg, .irq_set_affinity = irq_chip_set_affinity_parent, + .irq_retrigger = irq_chip_retrigger_hierarchy, };There's a slight discrepancy compared with the guest pci-hyperv.c driver, where setting the .irq_retrigger function is done dynamically in hv_pcie_init_dev_msi_info() instead of statically. The parallel here would be to set it in hv_init_dev_msi_info(). But given that Patch 3 of series removes setting .irq_retrigger in both cases, the discrepancy shouldn't really matter. If there's a reason to prefer one approach vs. the other, I don't know what that reason is. Reviewed-by: Michael Kelley <[email protected]>
This change should be done for the outermost chip, i.e. in hv_init_dev_msi_info(). With change 2, it won't matter, but patch 2 is not being back ported. So, I'll fix it. Regards, Naman
static bool hv_init_dev_msi_info(struct device *dev, struct irq_domain *domain, -- 2.43.0
