Re: [PATCH 1/2] virtio-net: don't disable guest csum when disable LRO
From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Date: 2020-09-28 08:35:07
Also in:
virtualization
On Mon, Sep 28, 2020 at 5:41 AM [off-list ref] wrote:
From: Tonghao Zhang <redacted>
Open vSwitch and Linux bridge will disable LRO of the interface
when this interface added to them. Now when disable the LRO, the
virtio-net csum is disable too. That drops the forwarding performance.
Fixes: e59ff2c49ae1 ("virtio-net: disable guest csum during XDP set")
Patch looks fine to me, but wrong commit here?
That commit disables csum on purpose when enabling xdp with ndp_bpf.
This patch refines disabling LRO with ndo_set_features.
The relevant commit is a02e8964eaf9 ("virtio-net: ethtool configurable LRO").
If this is a fix, it should target [PATCH net] separately from the
second patch in the patchset, which is a new feature and targets
[PATCH net-next]. They can arguably target net-next together, but then
it should not have a fixes tag.
quoted hunk ↗ jump to hunk
Cc: Michael S. Tsirkin <mst@redhat.com> Cc: Jason Wang <jasowang@redhat.com> Cc: Willem de Bruijn <willemb@google.com> Signed-off-by: Tonghao Zhang <redacted> --- drivers/net/virtio_net.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 7145c83c6c8c..21b71148c532 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c@@ -63,6 +63,11 @@ static const unsigned long guest_offloads[] = { VIRTIO_NET_F_GUEST_CSUM }; +#define GUEST_OFFLOAD_LRO_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)) + struct virtnet_stat_desc { char desc[ETH_GSTRING_LEN]; size_t offset;@@ -2531,7 +2536,8 @@ static int virtnet_set_features(struct net_device *dev, if (features & NETIF_F_LRO) offloads = vi->guest_offloads_capable; else - offloads = 0; + offloads = vi->guest_offloads_capable & + ~GUEST_OFFLOAD_LRO_MASK; err = virtnet_set_guest_offloads(vi, offloads); if (err) --2.23.0