|
|
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)
|