Thread (27 messages) 27 messages, 5 authors, 21d ago

RE: [PATCH v2 1/3] PCI: hv: Set irq_retrigger callback for the Hyper-V PCI MSI irqchip

From: Michael Kelley <hidden>
Date: 2026-08-17 17:14:09
Also in: linux-iommu, linux-pci, lkml

From: Naman Jain <redacted> Sent: Monday, August 17, 2026 8:31 AM
On 8/17/2026 5:45 PM, Naman Jain wrote:
quoted
On 8/17/2026 9:08 AM, Michael Kelley wrote:
quoted
From: Naman Jain <redacted> Sent: Monday, August
10, 2026 2:07 AM
quoted
The Hyper-V vPCI MSI irqchip never installs an irq_retrigger() callback.

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 Hyper-V
PCI/MSI chip does not provide 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.

Install irq_chip_retrigger_hierarchy() as the irq_retrigger() callback for
the Hyper-V PCI/MSI irqchip, so that a pending interrupt is resent on its
new target CPU via the parent x86 vector domain.
The RFC version of this patch set listed the asynchronous nature
of the HVCALL_RETARGET_INTERRUPT hypercall as a cause of the
problem. Is that hypercall still believed to be asynchronous?
My understanding of "asynchronous" would be that Hyper-V
does not guarantee that the retargeting of the interrupt to a new
vCPU has occurred when the hypercall returns. There is an
unspecified time period during which the interrupt could still be
directed to the vCPU that is going offline. Furthermore, Hyper-V
provides no rendezvous mechanism for the guest to know when
the interrupt is guaranteed to go to the new vCPU.

If the async behavior is indeed present, isn't it a problem, even
after this patch? irq_migrate_all_off_this_cpu() causes the
RETARGET_INTERRUPT hypercall to be made, but a new interrupt
could still be generated to the going-offline vCPU after fixup_irqs()
runs its loop searching for any pending interrupts. A new such
interrupt would be lost. The 1 millisecond delay in fixup_irqs()
probably mitigates this problem by giving Hyper-V time to complete
the retargeting. But it's not a 100% solution.
 > > Assuming my thinking is correct, there isn't a 100% solution. But
quoted
the problem's existence, and the likely benefit of the 1 ms delay,
should be called out in the commit message and/or code
comments for future readers.
Please allow me to confirm with the Hyper-V team internally once. I may
have assumed asynchronous behavior because of the pending interrupt
after retarget. It could simply have been committed to the old route
before the retarget operation.
This is actually synchronous. So the fix in this series should suffice.
Sorry for the confusion.
I don't see any mentions of asynchronous behavior of that hypercall
anywhere in these 3 patches, so I think we should be good.
Thanks for getting the definitive answer. Having it be async was
initially plausible to me given the experience we had with the
VMBus MODIFYCHANNEL message. But upon further reflection,
the VMBus case was really more because it is a messaging protocol
instead of a "call".  As a "call", the hypercall really should be
synchronous. And that's consistent with the arm64 behavior of
setting the GICD register.

With this top-level question now resolved, I'll review the patch
series at a more detailed level to see if anything else comes up,
but it looks pretty good in my initial read-through.

Michael
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help