On Tue, Sep 29, 2020 at 09:45:24AM +0800, Tonghao Zhang wrote: > On Tue, Sep 29, 2020 at 3:25 AM Michael S. Tsirkin <mst@xxxxxxxxxx> wrote: > > > > On Mon, Sep 28, 2020 at 11:39:15AM +0800, xiangxia.m.yue@xxxxxxxxx wrote: > > > From: Tonghao Zhang <xiangxia.m.yue@xxxxxxxxx> > > > > > > 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@xxxxxxxxxx> > > > Cc: Jason Wang <jasowang@xxxxxxxxxx> > > > Signed-off-by: Tonghao Zhang <xiangxia.m.yue@xxxxxxxxx> > > > --- > > > 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? > > > + > > > + 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 _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization