Subject: Re: [net-next PATCH v2 3/5] virtio_net: Add XDP support

From: John Fastabend <[email-masked]>
Date: Mon, 28 Nov 2016 15:26:53 -0800

[...]

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