Thread (18 messages) 18 messages, 3 authors, 2020-09-30

Re: [PATCH 2/2] virtio-net: ethtool configurable RXCSUM

From: Tonghao Zhang <hidden>
Date: 2020-09-29 01:47:59
Also in: virtualization

On Tue, Sep 29, 2020 at 3:25 AM Michael S. Tsirkin [off-list ref] wrote:
On Mon, Sep 28, 2020 at 11:39:15AM +0800, xiangxia.m.yue@gmail.com wrote:
quoted
From: Tonghao Zhang <redacted>

Allow user configuring RXCSUM separately with ethtool -K,
reusing the existing virtnet_set_guest_offloads helper
that configures RXCSUM for XDP. This is conditional on
VIRTIO_NET_F_CTRL_GUEST_OFFLOADS.

Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Jason Wang <jasowang@redhat.com>
Signed-off-by: Tonghao Zhang <redacted>
---
 drivers/net/virtio_net.c | 40 ++++++++++++++++++++++++++++------------
 1 file changed, 28 insertions(+), 12 deletions(-)
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 21b71148c532..2e3af0b2c281 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -68,6 +68,8 @@ static const unsigned long guest_offloads[] = {
                              (1ULL << VIRTIO_NET_F_GUEST_ECN)  | \
                              (1ULL << VIRTIO_NET_F_GUEST_UFO))

+#define GUEST_OFFLOAD_CSUM_MASK (1ULL << VIRTIO_NET_F_GUEST_CSUM)
+
 struct virtnet_stat_desc {
      char desc[ETH_GSTRING_LEN];
      size_t offset;
@@ -2526,25 +2528,37 @@ static int virtnet_set_features(struct net_device *dev,
                              netdev_features_t features)
 {
      struct virtnet_info *vi = netdev_priv(dev);
-     u64 offloads;
+     u64 offloads = vi->guest_offloads &
+                    vi->guest_offloads_capable;
      int err;

-     if ((dev->features ^ features) & NETIF_F_LRO) {
-             if (vi->xdp_queue_pairs)
-                     return -EBUSY;
+     /* Don't allow configuration while XDP is active. */
+     if (vi->xdp_queue_pairs)
+             return -EBUSY;

+     if ((dev->features ^ features) & NETIF_F_LRO) {
              if (features & NETIF_F_LRO)
-                     offloads = vi->guest_offloads_capable;
+                     offloads |= GUEST_OFFLOAD_LRO_MASK;
              else
-                     offloads = vi->guest_offloads_capable &
-                                ~GUEST_OFFLOAD_LRO_MASK;
+                     offloads &= ~GUEST_OFFLOAD_LRO_MASK;
+     }

-             err = virtnet_set_guest_offloads(vi, offloads);
-             if (err)
-                     return err;
-             vi->guest_offloads = offloads;
+     if ((dev->features ^ features) & NETIF_F_RXCSUM) {
+             if (features & NETIF_F_RXCSUM)
+                     offloads |= GUEST_OFFLOAD_CSUM_MASK;
+             else
+                     offloads &= ~GUEST_OFFLOAD_CSUM_MASK;
      }

+     if (offloads == (vi->guest_offloads &
+                      vi->guest_offloads_capable))
+             return 0;
Hmm, what exactly does this do?
If the features(lro, rxcsum) we supported, are not changed, it is not
necessary to invoke virtnet_set_guest_offloads.
quoted
+
+     err = virtnet_set_guest_offloads(vi, offloads);
+     if (err)
+             return err;
+
+     vi->guest_offloads = offloads;
      return 0;
 }
@@ -3013,8 +3027,10 @@ 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))
              dev->features |= NETIF_F_LRO;
-     if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS))
+     if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS)) {
+             dev->hw_features |= NETIF_F_RXCSUM;
              dev->hw_features |= NETIF_F_LRO;
+     }

      dev->vlan_features = dev->features;

--
2.23.0

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