virtio: imply disable_cb on callbacks

Since the most efficient use of virtio is to only enable interrupts
when processing is done, this should be the natural flow.

Turns out that wake counters have this requirement anyway.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
---
 drivers/block/virtio_blk.c          |    2 ++
 drivers/char/hw_random/virtio-rng.c |    1 +
 drivers/char/virtio_console.c       |    1 +
 drivers/net/virtio_net.c            |    9 +--------
 drivers/virtio/virtio_ring.c        |    1 +
 5 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -69,6 +69,8 @@ static void blk_done(struct virtqueue *v
 	/* In case queue is stopped waiting for more buffers. */
 	blk_start_queue(vblk->disk->queue);
 	spin_unlock_irqrestore(&vblk->lock, flags);
+
+	vq->vq_ops->enable_cb(vq);
 }
 
 static bool do_req(struct request_queue *q, struct virtio_blk *vblk,
diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c
--- a/drivers/char/hw_random/virtio-rng.c
+++ b/drivers/char/hw_random/virtio-rng.c
@@ -43,6 +43,7 @@ static void random_recv_done(struct virt
 
 	data_left = len / sizeof(random_data[0]);
 	complete(&have_data);
+	vq->vq_ops->enable_cb(vq);
 }
 
 static void register_buffer(void)
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -177,6 +177,7 @@ static void hvc_handle_input(struct virt
 {
 	if (hvc_poll(hvc))
 		hvc_kick();
+	vq->vq_ops->enable_cb(vq);
 }
 
 /*D:370 Once we're further in boot, we get probed like any other virtio device.
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -110,9 +110,6 @@ static void skb_xmit_done(struct virtque
 {
 	struct virtnet_info *vi = svq->vdev->priv;
 
-	/* Suppress further interrupts. */
-	svq->vq_ops->disable_cb(svq);
-
 	/* We were probably waiting for more output buffers. */
 	netif_wake_queue(vi->dev);
 
@@ -377,11 +374,7 @@ static void try_fill_recv(struct virtnet
 static void skb_recv_done(struct virtqueue *rvq)
 {
 	struct virtnet_info *vi = rvq->vdev->priv;
-	/* Schedule NAPI, Suppress further interrupts if successful. */
-	if (napi_schedule_prep(&vi->napi)) {
-		rvq->vq_ops->disable_cb(rvq);
-		__napi_schedule(&vi->napi);
-	}
+	napi_schedule(&vi->napi);
 }
 
 static int virtnet_poll(struct napi_struct *napi, int budget)
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -361,6 +361,7 @@ irqreturn_t vring_interrupt(int irq, voi
 		return IRQ_HANDLED;
 
 	pr_debug("virtqueue callback for %p (%p)\n", vq, vq->vq.callback);
+	vring_disable_cb(_vq);
 	if (vq->vq.callback)
 		vq->vq.callback(&vq->vq);
 
