[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 08/14] virtio-net: switch tx to safe iov functions
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PATCH 08/14] virtio-net: switch tx to safe iov functions |
Date: |
Tue, 25 Sep 2012 01:04:53 +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 6e6f5f3..23feb21 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -714,10 +714,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 ?
@@ -729,18 +729,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_cpy(sg, ARRAY_SIZE(sg),
+ out_sg, out_num,
+ 0, n->host_hdr_len);
+ sg_num += iov_cpy(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
- Re: [Qemu-devel] [PATCH 03/14] iov: add iov_cpy, (continued)
- [Qemu-devel] [PATCH 04/14] virtio-net: avoid sg copy, Michael S. Tsirkin, 2012/09/24
- [Qemu-devel] [PATCH 05/14] virtio-net: use safe iov operations for rx, Michael S. Tsirkin, 2012/09/24
- [Qemu-devel] [PATCH 07/14] virtio-net: first s/g is always at start of buf, Michael S. Tsirkin, 2012/09/24
- [Qemu-devel] [PATCH 02/14] iov: add const annotation, Michael S. Tsirkin, 2012/09/24
- [Qemu-devel] [PATCH 08/14] virtio-net: switch tx to safe iov functions,
Michael S. Tsirkin <=
- [Qemu-devel] [PATCH 09/14] virtio-net: simplify rx code, Michael S. Tsirkin, 2012/09/24
- [Qemu-devel] [PATCH 06/14] virtio-net: refactor receive_hdr, Michael S. Tsirkin, 2012/09/24
- [Qemu-devel] [PATCH 10/14] virtio: don't mark unaccessed memory as dirty, Michael S. Tsirkin, 2012/09/24
- [Qemu-devel] [PATCH 11/14] virtio-net: fix used len for tx, Michael S. Tsirkin, 2012/09/24
- [Qemu-devel] [PATCH 12/14] virtio-net: minor code simplification, Michael S. Tsirkin, 2012/09/24
- [Qemu-devel] [PATCH 14/14] virtio-net: enable mrg buf header in tap on linux, Michael S. Tsirkin, 2012/09/24
- [Qemu-devel] [PATCH 13/14] virtio-net: test peer header support at init time, Michael S. Tsirkin, 2012/09/24