This patch adds a new netbe_peek_recvlen() function to the net backend API. The new function allows the virtio-net receive code to know in advance how many virtio descriptors chains will be needed to receive the next packet. As a result, the implementation of the virtio-net mergeable rx buffers feature becomes efficient, so that we can enable it also with the tap(4) backend. For the tap(4) backend, a bounce buffer was introduced to implement the peeck_recvlen() callback, which means an additional packet copy on the receive datapath. In the future, it should be possible to remove the bounce buffer (and so the additional copy), by obtaining the length of the next packet from kevent data.
Details
Details
- Reviewers
grehan jhb bryanv markj afedorov - Group Reviewers
bhyve - Commits
- rS358438: MFC r358180
rS358180: bhyve: enable virtio-net mergeable rx buffers for tap(4)
Tested VM-2-VM with tap(4) and vale(4).
Diff Detail
Diff Detail
- Lint
Lint Skipped - Unit
Tests Skipped
Event Timeline
usr.sbin/bhyve/net_backends.c | ||
---|---|---|
310 | I think we can replace this cycle with call buf_to_iov(priv->bbuf, priv->bbuflen, iov, iovcnt, 0) |
usr.sbin/bhyve/net_backends.c | ||
---|---|---|
310 | Good catch, thanks. |
Comment Actions
Sorry, I didn’t have time to test the patch. But as for the code, I have no questions.
Comment Actions
In any case I tested 10 different combinations:
- VM-2-VM + tap + virtio-net + mtu 1500
- VM-2-VM + tap + virtio-net + mtu 9000
- VM-2-VM + tap + e1000 + mtu 1500
- VM-2-VM + tap + e1000 + mtu 9000
- VM-2-VM + vale + virtio-net + mtu 1500
- VM-2-VM + vale + virtio-net + mtu 9000
- VM-2-VM + vale + e1000 + mtu 1500
- VM-2-VM + vale + e1000 + mtu 9000
- VM-2-host + tap + virtio-net + mtu 1500
- VM-2-host + tap + virtio-net + mtu 9000
each one with ping (-D) and netperf. Everything looks good.
Comment Actions
I tested this patch with various OS’s(windows, Ubuntu, centos) and didn’t find any issues. So, I think it’s ready to go.