Re: [PATCH v3] virtio-pci: return IRQ_HANDLED after non-zero ISR

From: Andrew Stellman

Date: Mon Sep 07 2026 - 19:43:28 EST


LLM was Claude Opus 5, agent was Quality Playbook
<https://github.com/andrewstellman/quality-playbook>, an open-source
code quality agent I maintain.

One request: unless your version is already queued, would you take a
corrected patch from me so the commit keeps my authorship? Having an
upstream Linux commit trace directly to a Quality Playbook finding
would mean a lot for the project.


On Mon, Sep 7, 2026 at 5:45 PM Michael S. Tsirkin <mst@xxxxxxxxxx> wrote:
>
> On Fri, Sep 04, 2026 at 10:13:18AM -0400, Andrew Stellman wrote:
> > vp_interrupt() reads the ISR before dispatching config-change and
> > vring handling. Reading the ISR also clears it, so once the read
> > returns non-zero the interrupt was from this device and has already
> > been consumed.
> >
> > Currently vp_interrupt() returns the result of vp_vring_interrupt().
> > For a config-change interrupt with no vring work, that can return
> > IRQ_NONE even though the ISR was non-zero and the interrupt was
> > handled.
> >
> > Call vp_vring_interrupt() for any queue work, but once the ISR is
> > non-zero return IRQ_HANDLED.
> >
> > Tested with QEMU virtio-blk-pci forced to INTx using vectors=0 and
> > pci=nomsi. On an idle device, 200 config-change interrupts were
> > generated using QMP block_resize.
> >
> > Before this change, irq_handler_exit reported ret=unhandled and
> > /proc/irq/11/spurious increased from 0 to 200 unhandled interrupts.
> > After this change, irq_handler_exit reported ret=handled and the
> > unhandled count remained at 0.
> >
> > The issue was found during an LLM-assisted Quality Playbook review.
> >
> > Fixes: 77cf524654a8 ("virtio_pci: split up vp_interrupt")
> > Suggested-by: Michael S. Tsirkin <mst@xxxxxxxxxx>
> > Assisted-by: LLM
>
> tell us which llm and which agent pls
>
> > Signed-off-by: Andrew Stellman <astellman@xxxxxxxxxxxxxxxxxxx>
> > ---
> > Changes from v2:
> > - Repost as a standalone patch in a new thread, per maintainer request.
> > - Add LLM-assistance disclosure.
> > - No code changes.
> >
> > Changes from v1:
> > - Return IRQ_HANDLED for any non-zero ISR, as suggested by Michael.
> > - Add Fixes and Suggested-by tags.
> > - Test the change with virtio-blk forced to legacy INTx under QEMU.
> >
> > Full red/green test logs and the tested v2 patch:
> > https://github.com/andrewstellman/quality-playbook/tree/11ba61d/evidence/virtio-pci-intx
> >
> > drivers/virtio/virtio_pci_common.c | 4 +++-
> > 1 file changed, 3 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
> > index 10371ecbc054..b90c174450b2 100644
> > --- a/drivers/virtio/virtio_pci_common.c
> > +++ b/drivers/virtio/virtio_pci_common.c
> > @@ -120,7 +120,9 @@ static irqreturn_t vp_interrupt(int irq, void *opaque)
> > if (isr & VIRTIO_PCI_ISR_CONFIG)
> > vp_config_changed(irq, opaque);
> >
> > - return vp_vring_interrupt(irq, opaque);
> > + vp_vring_interrupt(irq, opaque);
> > +
> > + return IRQ_HANDLED;
> > }
> >
> > static int vp_request_msix_vectors(struct virtio_device *vdev, int nvectors,
> > base-commit: bc35965f6940a9bf834d54187b6088b8eb09206d
> >
> > --
> > 2.43.0
>