[...] >> Perfect! hacking qemu for testing is no problem this helps a lot thanks >> and saves me time trying to figure out how to get qemu to do this. > > Pls note I didn't try this at all, so might not work, but should > give you the idea. > >>> >>> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c >>> index b68c69d..4866144 100644 >>> --- a/hw/net/virtio-net.c >>> +++ b/hw/net/virtio-net.c >>> @@ -1164,6 +1164,7 @@ static ssize_t virtio_net_receive(NetClientState *nc, >>> const uint8_t *buf, size_t >>> offset = n->host_hdr_len; >>> total += n->guest_hdr_len; >>> guest_offset = n->guest_hdr_len; >>> + continue; >>> } else { >>> guest_offset = 0; >>> } >>> >>> >>> >>> here's one that should cap the 1st s/g to 100 bytes: >>> >>> >>> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c >>> index b68c69d..7943004 100644 >>> --- a/hw/net/virtio-net.c >>> +++ b/hw/net/virtio-net.c >>> @@ -1164,6 +1164,7 @@ static ssize_t virtio_net_receive(NetClientState *nc, >>> const uint8_t *buf, size_t >>> offset = n->host_hdr_len; >>> total += n->guest_hdr_len; >>> guest_offset = n->guest_hdr_len; >>> + sg.iov_len = MIN(sg.iov_len, 100); >>> } else { >>> guest_offset = 0; >>> } >>>
Here is the patch I went with, I'm using vhost=on: --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c @@ -1777,7 +1777,8 @@ static int translate_desc(struct vhost_virtqueue *vq, u64 _iov = iov + ret; size = node->size - addr + node->start; - _iov->iov_len = min((u64)len - s, size); + printk("%s: build 100 length headers!\n", __func__); + _iov->iov_len = min((u64)len - s, (u64)100);//size); _iov->iov_base = (void __user *)(unsigned long) (node->userspace_addr + addr - node->start); s += size; This seems to do the trick and with 100 I can use 'ping -s' to generate as many bufs is needed up to MTU. The patch I have seems to be working fine I'll let it run a bit and test it with some real traffic (not just ping) then push out a v3 assuming I don't find any issues. Thanks, John