Re: [RFC PATCH 5/5] drivers/net/virtio_net.c: Added USO support.

2022-02-08 Thread 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 
---
  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, \


___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

[RFC PATCH 5/5] drivers/net/virtio_net.c: Added USO support.

2022-01-25 Thread Andrew Melnychenko
Now, it possible to enable GSO_UDP_L4("tx-udp-segmentation") for VirtioNet.

Signed-off-by: Andrew Melnychenko 
---
 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;
 
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, \
-- 
2.34.1

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization