[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCHv2 08/14] virtio-net: switch tx to safe iov functions
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PATCHv2 08/14] virtio-net: switch tx to safe iov functions |
Date: |
Tue, 25 Sep 2012 13:12:35 +0200 |
Avoid mangling iovec manually: use safe iov_*
functions.
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
hw/virtio-net.c | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index b9a8be4..358093e 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -715,10 +715,10 @@ static int32_t virtio_net_flush_tx(VirtIONet *n,
VirtQueue *vq)
}
while (virtqueue_pop(vq, &elem)) {
- ssize_t ret, len = 0;
+ ssize_t ret, len;
unsigned int out_num = elem.out_num;
struct iovec *out_sg = &elem.out_sg[0];
- unsigned hdr_len;
+ struct iovec sg[VIRTQUEUE_MAX_SIZE];
/* hdr_len refers to the header received from the guest */
hdr_len = n->mergeable_rx_bufs ?
@@ -730,18 +730,25 @@ static int32_t virtio_net_flush_tx(VirtIONet *n,
VirtQueue *vq)
exit(1);
}
- /* ignore the header if GSO is not supported */
- if (!n->has_vnet_hdr) {
- out_num--;
- out_sg++;
- len += hdr_len;
- } else if (n->mergeable_rx_bufs) {
- /* tapfd expects a struct virtio_net_hdr */
- hdr_len -= sizeof(struct virtio_net_hdr);
- out_sg->iov_len -= hdr_len;
- len += hdr_len;
+ /*
+ * If host wants to see the guest header as is, we can
+ * pass it on unchanged. Otherwise, copy just the parts
+ * that host is interested in.
+ */
+ assert(n->host_hdr_len <= n->guest_hdr_len);
+ if (n->host_hdr_len != n->guest_hdr_len) {
+ unsigned sg_num = iov_copy(sg, ARRAY_SIZE(sg),
+ out_sg, out_num,
+ 0, n->host_hdr_len);
+ sg_num += iov_copy(sg + sg_num, ARRAY_SIZE(sg) - sg_num,
+ out_sg, out_num,
+ n->guest_hdr_len, -1);
+ out_num = sg_num;
+ out_sg = sg;
}
+ len = hdr_len;
+
ret = qemu_sendv_packet_async(&n->nic->nc, out_sg, out_num,
virtio_net_tx_complete);
if (ret == 0) {
--
MST
- [Qemu-devel] [PATCHv2 00/14] virtio-net: iovec handling cleanup, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 01/14] virtio-net: track host/guest header length, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 04/14] virtio-net: avoid sg copy, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 02/14] iov: add const annotation, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 03/14] iov: add iov_cpy, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 06/14] virtio-net: refactor receive_hdr, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 05/14] virtio-net: use safe iov operations for rx, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 07/14] virtio-net: first s/g is always at start of buf, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 08/14] virtio-net: switch tx to safe iov functions,
Michael S. Tsirkin <=
- [Qemu-devel] [PATCHv2 09/14] virtio-net: simplify rx code, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 12/14] virtio-net: minor code simplification, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 14/14] virtio-net: enable mrg buf header in tap on linux, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 10/14] virtio: don't mark unaccessed memory as dirty, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 11/14] virtio-net: fix used len for tx, Michael S. Tsirkin, 2012/09/25
- [Qemu-devel] [PATCHv2 13/14] virtio-net: test peer header support at init time, Michael S. Tsirkin, 2012/09/25