On Mon, Jun 19, 2023 at 06:57:36PM +0800, Heng Qi wrote: > Currently, the VIRTIO_NET_F_GUEST_CSUM (corresponds to NETIF_F_RXCSUM > for netdev) feature of the virtio-net driver conflicts with the loading > of XDP, which is caused by the problem described in [1][2], that is, > XDP may cause errors in partial csumed-related fields which can lead > to packet dropping. > > In addition, when communicating between vm and vm on the same host, the > receiving side vm will receive packets marked as > VIRTIO_NET_HDR_F_NEEDS_CSUM, but after these packets are processed by > XDP, the VIRTIO_NET_HDR_F_NEEDS_CSUM and skb CHECKSUM_PARTIAL flags will > be cleared, causing the packet dropping. > > This patch introduces a helper function, which will try to solve the > above problems in the subsequent patch. > > [1] commit 18ba58e1c234 ("virtio-net: fail XDP set if guest csum is negotiated") > [2] commit e59ff2c49ae1 ("virtio-net: disable guest csum during XDP set") > > Signed-off-by: Heng Qi <hengqi@xxxxxxxxxxxxxxxxx> > Reviewed-by: Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> squash this and patch 1 into where the helpers are used. in particular so we don't get warnings with bisect. > --- > drivers/net/virtio_net.c | 38 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 38 insertions(+) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 36cae78f6311..07b4801d689c 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -1663,6 +1663,44 @@ static int virtnet_flow_dissect_udp_tcp(struct virtnet_info *vi, struct sk_buff > return 0; > } > > +static int virtnet_set_csum_after_xdp(struct virtnet_info *vi, > + struct sk_buff *skb, > + __u8 flags) > +{ > + int err; > + > + /* When XDP program is loaded, for example, the vm-vm scenario > + * on the same host, packets marked as VIRTIO_NET_HDR_F_NEEDS_CSUM > + * will travel. Although these packets are safe from the point of > + * view of the vm, to avoid modification by XDP and successful > + * forwarding in the upper layer, we re-probe the necessary checksum > + * related information: skb->csum_{start, offset}, pseudo-header csum. > + * > + * This benefits us: > + * 1. XDP can be loaded when there's _F_GUEST_CSUM. > + * 2. The device verifies the checksum of packets , especially > + * benefiting for large packets. > + * 3. In the same-host vm-vm scenario, packets marked as > + * VIRTIO_NET_HDR_F_NEEDS_CSUM are no longer dropped after being > + * processed by XDP. > + */ > + if (flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) { > + err = virtnet_flow_dissect_udp_tcp(vi, skb); > + if (err < 0) > + return -EINVAL; > + > + skb->ip_summed = CHECKSUM_PARTIAL; > + } else if (flags && VIRTIO_NET_HDR_F_DATA_VALID) { > + /* We want to benefit from this: XDP guarantees that packets marked > + * as VIRTIO_NET_HDR_F_DATA_VALID still have correct csum after they > + * are processed. > + */ > + skb->ip_summed = CHECKSUM_UNNECESSARY; > + } > + > + return 0; > +} > + > static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq, > void *buf, unsigned int len, void **ctx, > unsigned int *xdp_xmit, > -- > 2.19.1.6.gb485710b