Thread (73 messages) 73 messages, 4 authors, 2021-07-09

Re: [PATCH] net: tun: fix tun_xdp_one() for IFF_TUN mode

From: Jason Wang <jasowang@redhat.com>
Date: 2021-06-22 04:52:45

在 2021/6/22 上午4:43, David Woodhouse 写道:
On Mon, 2021-06-21 at 15:50 +0100, David Woodhouse wrote:
quoted
On Mon, 2021-06-21 at 11:52 +0100, David Woodhouse wrote:
quoted
Firstly, I don't think I can set IFF_VNET_HDR on the tun device after
opening it. So my model of "open the tun device, then *see* if we can
use vhost to accelerate it" doesn't work.

I tried setting VHOST_NET_F_VIRTIO_NET_HDR in the vhost features
instead, but that gives me a weird failure mode where it drops around
half the incoming packets, and I haven't yet worked out why.
FWIW that problem also goes away if I set TUNSNDBUF and avoid the XDP
data path.
Looks like there are two problems there.

Firstly, vhost_net_build_xdp() doesn't cope well with sock_hlen being
zero. It reads those zero bytes into its buffer, then points 'gso' at
the buffer with no valid data in it, and checks gso->flags for the
NEEDS_CSUM flag.

Secondly, tun_xdp_one() doesn't cope with receiving packets without the
virtio header either. While tun_get_user() correctly checks
IFF_VNET_HDR, tun_xdp_one() does not, and treats the start of my IP
packets as if they were a virtio_net_hdr.

I'll look at turning my code into a test case for kernel selftests.

I cook two patches. Please see and check if they fix the problem. 
(compile test only for me).

Thanks

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help