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 07:20:18
Also in: virtualization

On Tue, Sep 29, 2020 at 2:22 PM Michael S. Tsirkin [off-list ref] wrote:
On Tue, Sep 29, 2020 at 02:10:56PM +0800, Tonghao Zhang wrote:
quoted
On Tue, Sep 29, 2020 at 1:55 PM Michael S. Tsirkin [off-list ref] wrote:
quoted
On Tue, Sep 29, 2020 at 09:45:24AM +0800, Tonghao Zhang wrote:
quoted
On Tue, Sep 29, 2020 at 3:25 AM Michael S. Tsirkin [off-list ref] wrote:
quoted
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.
okay, could you describe the cases where this triggers in a bit more
detail pls?
Hi
As I known,  when we run che commands show as below:
ethtool -K eth1 sg off
ethtool -K eth1 tso off

In that case, we will not invoke virtnet_set_guest_offloads.
How about initialization though? E.g. it looks like guest_offloads
is 0-initialized, won't this skip the first command to disable
offloads?
I guest you mean that: if guest_offloads == 0, and run the command
"ethtool -K eth1 sg off", that will disable offload ?
In that patch
u64 offloads = vi->guest_offloads & vi->guest_offloads_capable; // offload = 0
.....
 if (offloads == (vi->guest_offloads & vi->guest_offloads_capable)) //
if offload not changed, offload == 0, and (vi->guest_offloads &
vi->guest_offloads_capable) == 0.
        return 0;

virtnet_set_guest_offloads // that will not be invoked, so will not
disable offload
quoted
quoted
quoted
quoted
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

--
Best regards, Tonghao

-- 
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