4623a49
--- xen-4.5.1/tools/qemu-xen-traditional/hw/virtio.c.orig	2015-06-09 16:32:24.000000000 +0100
4623a49
+++ xen-4.5.1/tools/qemu-xen-traditional/hw/virtio.c	2015-10-10 16:57:01.806370020 +0100
4623a49
@@ -268,8 +268,8 @@
4623a49
     return vring_avail_idx(vq) == vq->last_avail_idx;
4623a49
 }
4623a49
 
4623a49
-void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
4623a49
-                    unsigned int len, unsigned int idx)
4623a49
+static void virtqueue_unmap_sg(VirtQueue *vq, const VirtQueueElement *elem,
4623a49
+			       unsigned int len)
4623a49
 {
4623a49
     unsigned int offset;
4623a49
     int i;
4623a49
@@ -302,7 +302,19 @@
4623a49
         
4623a49
         offset += size;
4623a49
     }
4623a49
+}
4623a49
 
4623a49
+void virtqueue_discard(VirtQueue *vq, const VirtQueueElement *elem,
4623a49
+                       unsigned int len)
4623a49
+{
4623a49
+    vq->last_avail_idx--;
4623a49
+    virtqueue_unmap_sg(vq, elem, len);
4623a49
+}
4623a49
+
4623a49
+void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
4623a49
+                    unsigned int len, unsigned int idx)
4623a49
+{
4623a49
+    virtqueue_unmap_sg(vq, elem, len);
4623a49
     idx = (idx + vring_used_idx(vq)) % vq->vring.num;
4623a49
 
4623a49
     /* Get a pointer to the next entry in the used ring. */
4623a49
--- xen-4.5.1/tools/qemu-xen-traditional/hw/virtio.h.orig	2015-06-09 16:32:24.000000000 +0100
4623a49
+++ xen-4.5.1/tools/qemu-xen-traditional/hw/virtio.h	2015-10-10 16:57:53.146216039 +0100
4623a49
@@ -105,6 +105,8 @@
4623a49
 void virtqueue_push(VirtQueue *vq, const VirtQueueElement *elem,
4623a49
                     unsigned int len);
4623a49
 void virtqueue_flush(VirtQueue *vq, unsigned int count);
4623a49
+void virtqueue_discard(VirtQueue *vq, const VirtQueueElement *elem,
4623a49
+                       unsigned int len);
4623a49
 void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
4623a49
                     unsigned int len, unsigned int idx);
4623a49
 
4623a49
--- xen-4.5.1/tools/qemu-xen-traditional/hw/virtio-net.c.orig	2015-10-10 16:10:05.071786348 +0100
4623a49
+++ xen-4.5.1/tools/qemu-xen-traditional/hw/virtio-net.c	2015-10-10 19:05:34.510029916 +0100
4623a49
@@ -424,11 +424,15 @@
4623a49
         len = iov_fill(sg, elem.in_num,
4623a49
                        buf + offset, size - offset);
4623a49
         total += len;
4623a49
+        offset += len;
4623a49
+        if (!n->mergeable_rx_bufs && offset < size) {
4623a49
+            virtqueue_discard(n->rx_vq, &elem, total);
4623a49
+            return;
4623a49
+        }
4623a49
 
4623a49
         /* signal other side */
4623a49
         virtqueue_fill(n->rx_vq, &elem, total, i++);
4623a49
 
4623a49
-        offset += len;
4623a49
     }
4623a49
 
4623a49
     if (mhdr)