|
@@ -255,6 +255,13 @@ irqreturn_t vring_interrupt(int irq, void *_vq)
|
|
if (unlikely(vq->broken))
|
|
if (unlikely(vq->broken))
|
|
return IRQ_HANDLED;
|
|
return IRQ_HANDLED;
|
|
|
|
|
|
|
|
+ /* Other side may have missed us turning off the interrupt,
|
|
|
|
+ * but we should preserve disable semantic for virtio users. */
|
|
|
|
+ if (unlikely(vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT)) {
|
|
|
|
+ pr_debug("virtqueue interrupt after disable for %p\n", vq);
|
|
|
|
+ return IRQ_HANDLED;
|
|
|
|
+ }
|
|
|
|
+
|
|
pr_debug("virtqueue callback for %p (%p)\n", vq, vq->vq.callback);
|
|
pr_debug("virtqueue callback for %p (%p)\n", vq, vq->vq.callback);
|
|
if (vq->vq.callback)
|
|
if (vq->vq.callback)
|
|
vq->vq.callback(&vq->vq);
|
|
vq->vq.callback(&vq->vq);
|