Messages in this thread | | | Date | Wed, 9 Feb 2022 12:44:45 +0800 | Subject | Re: [RFC PATCH 5/5] drivers/net/virtio_net.c: Added USO support. | From | Jason Wang <> |
| |
在 2022/1/25 下午4:47, Andrew Melnychenko 写道: > Now, it possible to enable GSO_UDP_L4("tx-udp-segmentation") for VirtioNet. > > Signed-off-by: Andrew Melnychenko <andrew@daynix.com> > --- > drivers/net/virtio_net.c | 22 ++++++++++++++++++---- > 1 file changed, 18 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index a801ea40908f..a45eee022be4 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -60,13 +60,17 @@ static const unsigned long guest_offloads[] = { > VIRTIO_NET_F_GUEST_TSO6, > VIRTIO_NET_F_GUEST_ECN, > VIRTIO_NET_F_GUEST_UFO, > - VIRTIO_NET_F_GUEST_CSUM > + VIRTIO_NET_F_GUEST_CSUM, > + VIRTIO_NET_F_GUEST_USO4, > + VIRTIO_NET_F_GUEST_USO6 > }; > > #define GUEST_OFFLOAD_GRO_HW_MASK ((1ULL << VIRTIO_NET_F_GUEST_TSO4) | \ > (1ULL << VIRTIO_NET_F_GUEST_TSO6) | \ > (1ULL << VIRTIO_NET_F_GUEST_ECN) | \ > - (1ULL << VIRTIO_NET_F_GUEST_UFO)) > + (1ULL << VIRTIO_NET_F_GUEST_UFO) | \ > + (1ULL << VIRTIO_NET_F_GUEST_USO4) | \ > + (1ULL << VIRTIO_NET_F_GUEST_USO6)) > > struct virtnet_stat_desc { > char desc[ETH_GSTRING_LEN]; > @@ -2530,7 +2534,9 @@ static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog, > virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_TSO6) || > virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_ECN) || > virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_UFO) || > - virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_CSUM))) { > + virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_CSUM) || > + virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_USO4) || > + virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_USO6))) { > NL_SET_ERR_MSG_MOD(extack, "Can't set XDP while host is implementing GRO_HW/CSUM, disable GRO_HW/CSUM first"); > return -EOPNOTSUPP; > } > @@ -3155,6 +3161,8 @@ static int virtnet_probe(struct virtio_device *vdev) > dev->hw_features |= NETIF_F_TSO6; > if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN)) > dev->hw_features |= NETIF_F_TSO_ECN; > + if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_USO)) > + dev->hw_features |= NETIF_F_GSO_UDP_L4; > > dev->features |= NETIF_F_GSO_ROBUST; > > @@ -3169,6 +3177,9 @@ static int virtnet_probe(struct virtio_device *vdev) > dev->features |= NETIF_F_GRO_HW; > if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS)) > dev->hw_features |= NETIF_F_GRO_HW; > + if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_USO4) || > + virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_USO6)) > + dev->hw_features |= NETIF_F_LRO;
I think we need to use GRO_HW, see dbcf24d153884 ("virtio-net: use NETIF_F_GRO_HW instead of NETIF_F_LRO"
Thanks
> > dev->vlan_features = dev->features; > > @@ -3200,7 +3211,9 @@ static int virtnet_probe(struct virtio_device *vdev) > if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || > virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) || > virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN) || > - virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UFO)) > + virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UFO) || > + virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_USO4) || > + virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_USO6)) > vi->big_packets = true; > > if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) > @@ -3400,6 +3413,7 @@ static struct virtio_device_id id_table[] = { > VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, \ > VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, \ > VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, \ > + VIRTIO_NET_F_HOST_USO, VIRTIO_NET_F_GUEST_USO4, VIRTIO_NET_F_GUEST_USO6, \ > VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, \ > VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \ > VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, \
| |