Here's the result of a 1G Guest->Host send, for example:

echo -n 'Seconds: '
time -f %E tcpblast -o -s 65536 -c 16k 192.168.2.1:9999 > /dev/null
echo 'Packets:' `ifconfig eth0 | sed -n 's/.*RX packets:\([0-9]*\).*/\1/p`,`ifconfig eth0 | sed -n 's/.*TX packets:\([0-9]*\).*/\1/p`
echo -n 'Interrupts: '
echo `awk '/virtio1/ { print $2 }' < /proc/interrupts` | tr ' ' ,
echo -n 'Notifications: '
echo `awk '{ print $3"("$4")" }' < /sys/devices/lguest/virtio1/vqstats` | tr ' ' ,
halt

	Seconds: 0:37.15
	Packets: 32823,32808
	Interrupts: 31869,700
	Notifications: 1(4680),16401(16407)
	[   49.461421] Power down.
	Net IRQs triggered: 32823(0),32808(0)
---
 Documentation/lguest/lguest.c |   22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/Documentation/lguest/lguest.c b/Documentation/lguest/lguest.c
--- a/Documentation/lguest/lguest.c
+++ b/Documentation/lguest/lguest.c
@@ -157,6 +157,9 @@ struct virtqueue
 	/* Function for the thread which is servicing this virtqueue. */
 	void (*service)(struct virtqueue *vq);
 	pid_t thread;
+
+	/* Stats. */
+	unsigned long *irq, *irq_suppressed;
 };
 
 /* Remember the arguments to the program so we can "reboot" */
@@ -638,12 +641,15 @@ static void trigger_irq(struct virtqueue
 
 	/* 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)
+	    && lg_last_avail(vq) != vq->vring.avail->idx) {
+		(*vq->irq_suppressed)++;
 		return;
+	}
 
 	/* Send the Guest an interrupt tell them we used something up. */
 	if (write(lguest_fd, buf, sizeof(buf)) != 0)
 		err(1, "Triggering irq %i", vq->config.irq);
+	(*vq->irq)++;
 }
 
 /* And here's the combo meal deal.  Supersize me! */
@@ -665,6 +671,10 @@ struct console_abort
 	struct timeval start;
 };
 
+static unsigned long recv_irq, recv_irq_suppressed;
+static unsigned long xmit_irq, xmit_irq_suppressed;
+static unsigned long dummy_stat;
+
 /* This is the routine which handles console input (ie. stdin). */
 static void console_input(struct virtqueue *vq)
 {
@@ -748,6 +758,9 @@ static void net_output(struct virtqueue 
 	int len;
 	struct iovec iov[vq->vring.num];
 
+	vq->irq = &xmit_irq;
+	vq->irq_suppressed = &xmit_irq_suppressed;
+
 	head = wait_for_vq_desc(vq, iov, &out, &in);
 	if (in)
 		errx(1, "Input buffers in net output queue?");
@@ -766,6 +779,9 @@ static void net_input(struct virtqueue *
 	struct iovec iov[vq->vring.num];
 	struct net_info *net_info = vq->dev->priv;
 
+	vq->irq = &recv_irq;
+	vq->irq_suppressed = &recv_irq_suppressed;
+
 	head = wait_for_vq_desc(vq, iov, &out, &in);
 	if (out)
 		errx(1, "Output buffers in net input queue?");
@@ -996,6 +1012,7 @@ static void add_virtqueue(struct device 
 	vq->last_avail_idx = 0;
 	vq->dev = dev;
 	vq->service = service;
+	vq->irq = vq->irq_suppressed = &dummy_stat;
 	vq->thread = (pid_t)-1;
 
 	/* Initialize the configuration. */
@@ -1557,6 +1574,9 @@ static void __attribute__((noreturn)) ru
 		} else if (errno == ENOENT) {
 			char reason[1024] = { 0 };
 			pread(lguest_fd, reason, sizeof(reason)-1, cpu_id);
+			fprintf(stderr, "Net IRQs triggered: %lu(%lu),%lu(%lu)\n",
+				recv_irq, recv_irq_suppressed,
+				xmit_irq, xmit_irq_suppressed);
 			errx(1, "%s", reason);
 		/* ERESTART means that we need to reboot the guest */
 		} else if (errno == ERESTART) {
