aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2008-05-30 15:09:45 -0500
committerRusty Russell <rusty@rustcorp.com.au>2008-05-30 15:09:46 +1000
commitb4f68be6c5d507afdcd74f5be3df0b1209cda503 (patch)
tree85c0771058ff08c5dab5eedbf3395959dbafc878
parent7757f09c70af87887dfc195e6d6ddd54f5cc7c39 (diff)
downloadkernel_samsung_espresso10-b4f68be6c5d507afdcd74f5be3df0b1209cda503.zip
kernel_samsung_espresso10-b4f68be6c5d507afdcd74f5be3df0b1209cda503.tar.gz
kernel_samsung_espresso10-b4f68be6c5d507afdcd74f5be3df0b1209cda503.tar.bz2
virtio: force callback on empty.
virtio allows drivers to suppress callbacks (ie. interrupts) for efficiency (no locking, it's just an optimization). There's a similar mechanism for the host to suppress notifications coming from the guest: in that case, we ignore the suppression if the ring is completely full. It turns out that life is simpler if the host similarly ignores callback suppression when the ring is completely empty: the network driver wants to free up old packets in a timely manner, and otherwise has to use a timer to poll. We have to remove the code which ignores interrupts when the driver has disabled them (again, it had no locking and hence was unreliable anyway). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r--drivers/virtio/virtio_ring.c7
-rw-r--r--include/linux/virtio_config.h4
2 files changed, 4 insertions, 7 deletions
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 96d2567..72bf8bc 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -253,13 +253,6 @@ irqreturn_t vring_interrupt(int irq, void *_vq)
if (unlikely(vq->broken))
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);
if (vq->vq.callback)
vq->vq.callback(&vq->vq);
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index 71d6c102..f364bbf 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -15,6 +15,10 @@
/* We've given up on this device. */
#define VIRTIO_CONFIG_S_FAILED 0x80
+/* Do we get callbacks when the ring is completely used, even if we've
+ * suppressed them? */
+#define VIRTIO_F_NOTIFY_ON_EMPTY 24
+
#ifdef __KERNEL__
#include <linux/virtio.h>