FIXME: rebench
lguest: don't offer VIRTIO_F_NOTIFY_ON_EMPTY

VIRTIO_F_NOTIFY_ON_EMPTY indicates to the Guest that we will hit them with
an interrupt every time the xmit queue is emptied.

This avoids stale packets, but means if we outpace the guest we can hit it
with an interrupt per packet.  We're better off not interrupting it, and
letting it use its own timer to reap old packets from the xmit ring.

Before:				Seconds	TxPkts	TxIRQs
 1G TCP Guest->Host (no GSO):	18.7	753673	129483
 1M normal pings:		51	1000007	992726
 100,000 1k pings (-l 120):	130	100011	13990

After:
 1G TCP Guest->Host (no GSO):	17.1	753671	1
 1M normal pings:		48	1000006	1
 100,000 1k pings (-l 120):	1499	100053	1

Note the horrendous stalls on the 100k pings throughput test: this is
covered in the next patch.
---
 Documentation/lguest/lguest.c |    6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/Documentation/lguest/lguest.c b/Documentation/lguest/lguest.c
--- a/Documentation/lguest/lguest.c
+++ b/Documentation/lguest/lguest.c
@@ -570,9 +570,8 @@ static void trigger_irq(struct virtqueue
 	}
 	vq->pending_used = 0;
 
-	/* If they don't want an interrupt, don't send one, unless empty. */
-	if ((vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT)
-	    && lg_last_avail(vq) != vq->vring.avail->idx) {
+	/* If they don't want an interrupt, don't send one. */
+	if (vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT) {
 		(*vq->irq_suppressed)++;
 		return;
 	}
@@ -1342,7 +1341,6 @@ static void setup_tun_net(char *arg)
 	/* Set up the tun device. */
 	configure_device(ipfd, tapif, ip);
 
-	add_feature(dev, VIRTIO_F_NOTIFY_ON_EMPTY);
 	/* Expect Guest to handle everything except UFO */
 	add_feature(dev, VIRTIO_NET_F_CSUM);
 	add_feature(dev, VIRTIO_NET_F_GUEST_CSUM);
