Commit e3e3c423f82a415195a7bbbfa619bfa7b20d2db6

Authored by Vlad Yasevich
Committed by David S. Miller
1 parent 72f6510745

Revert "drivers/net: Disable UFO through virtio"

This reverts commit 3d0ad09412ffe00c9afa201d01effdb6023d09b4.

Now that GSO functionality can correctly track if the fragment
id has been selected and select a fragment id if necessary,
we can re-enable UFO on tap/macvap and virtio devices.

Signed-off-by: Vladislav Yasevich <vyasevic@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 3 changed files with 26 additions and 30 deletions Side-by-side Diff

drivers/net/macvtap.c
... ... @@ -80,7 +80,7 @@
80 80 static const struct proto_ops macvtap_socket_ops;
81 81  
82 82 #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \
83   - NETIF_F_TSO6)
  83 + NETIF_F_TSO6 | NETIF_F_UFO)
84 84 #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO)
85 85 #define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG)
86 86  
... ... @@ -585,8 +585,6 @@
585 585 gso_type = SKB_GSO_TCPV6;
586 586 break;
587 587 case VIRTIO_NET_HDR_GSO_UDP:
588   - pr_warn_once("macvtap: %s: using disabled UFO feature; please fix this program\n",
589   - current->comm);
590 588 gso_type = SKB_GSO_UDP;
591 589 break;
592 590 default:
... ... @@ -633,6 +631,8 @@
633 631 vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
634 632 else if (sinfo->gso_type & SKB_GSO_TCPV6)
635 633 vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
  634 + else if (sinfo->gso_type & SKB_GSO_UDP)
  635 + vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP;
636 636 else
637 637 BUG();
638 638 if (sinfo->gso_type & SKB_GSO_TCP_ECN)
... ... @@ -962,6 +962,9 @@
962 962 if (arg & TUN_F_TSO6)
963 963 feature_mask |= NETIF_F_TSO6;
964 964 }
  965 +
  966 + if (arg & TUN_F_UFO)
  967 + feature_mask |= NETIF_F_UFO;
965 968 }
966 969  
967 970 /* tun/tap driver inverts the usage for TSO offloads, where
... ... @@ -972,7 +975,7 @@
972 975 * When user space turns off TSO, we turn off GSO/LRO so that
973 976 * user-space will not receive TSO frames.
974 977 */
975   - if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6))
  978 + if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_UFO))
976 979 features |= RX_OFFLOADS;
977 980 else
978 981 features &= ~RX_OFFLOADS;
... ... @@ -1087,7 +1090,7 @@
1087 1090 case TUNSETOFFLOAD:
1088 1091 /* let the user check for future flags */
1089 1092 if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 |
1090   - TUN_F_TSO_ECN))
  1093 + TUN_F_TSO_ECN | TUN_F_UFO))
1091 1094 return -EINVAL;
1092 1095  
1093 1096 rtnl_lock();
... ... @@ -186,7 +186,7 @@
186 186 struct net_device *dev;
187 187 netdev_features_t set_features;
188 188 #define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \
189   - NETIF_F_TSO6)
  189 + NETIF_F_TSO6|NETIF_F_UFO)
190 190  
191 191 int vnet_hdr_sz;
192 192 int sndbuf;
193 193  
... ... @@ -1176,18 +1176,8 @@
1176 1176 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
1177 1177 break;
1178 1178 case VIRTIO_NET_HDR_GSO_UDP:
1179   - {
1180   - static bool warned;
1181   -
1182   - if (!warned) {
1183   - warned = true;
1184   - netdev_warn(tun->dev,
1185   - "%s: using disabled UFO feature; please fix this program\n",
1186   - current->comm);
1187   - }
1188 1179 skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
1189 1180 break;
1190   - }
1191 1181 default:
1192 1182 tun->dev->stats.rx_frame_errors++;
1193 1183 kfree_skb(skb);
... ... @@ -1294,6 +1284,8 @@
1294 1284 gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
1295 1285 else if (sinfo->gso_type & SKB_GSO_TCPV6)
1296 1286 gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
  1287 + else if (sinfo->gso_type & SKB_GSO_UDP)
  1288 + gso.gso_type = VIRTIO_NET_HDR_GSO_UDP;
1297 1289 else {
1298 1290 pr_err("unexpected GSO type: "
1299 1291 "0x%x, gso_size %d, hdr_len %d\n",
... ... @@ -1741,6 +1733,11 @@
1741 1733 if (arg & TUN_F_TSO6)
1742 1734 features |= NETIF_F_TSO6;
1743 1735 arg &= ~(TUN_F_TSO4|TUN_F_TSO6);
  1736 + }
  1737 +
  1738 + if (arg & TUN_F_UFO) {
  1739 + features |= NETIF_F_UFO;
  1740 + arg &= ~TUN_F_UFO;
1744 1741 }
1745 1742 }
1746 1743  
drivers/net/virtio_net.c
... ... @@ -490,17 +490,8 @@
490 490 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
491 491 break;
492 492 case VIRTIO_NET_HDR_GSO_UDP:
493   - {
494   - static bool warned;
495   -
496   - if (!warned) {
497   - warned = true;
498   - netdev_warn(dev,
499   - "host using disabled UFO feature; please fix it\n");
500   - }
501 493 skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
502 494 break;
503   - }
504 495 case VIRTIO_NET_HDR_GSO_TCPV6:
505 496 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
506 497 break;
... ... @@ -888,6 +879,8 @@
888 879 hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
889 880 else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6)
890 881 hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
  882 + else if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP)
  883 + hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_UDP;
891 884 else
892 885 BUG();
893 886 if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_ECN)
... ... @@ -1748,7 +1741,7 @@
1748 1741 dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST;
1749 1742  
1750 1743 if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) {
1751   - dev->hw_features |= NETIF_F_TSO
  1744 + dev->hw_features |= NETIF_F_TSO | NETIF_F_UFO
1752 1745 | NETIF_F_TSO_ECN | NETIF_F_TSO6;
1753 1746 }
1754 1747 /* Individual feature bits: what can host handle? */
1755 1748  
... ... @@ -1758,9 +1751,11 @@
1758 1751 dev->hw_features |= NETIF_F_TSO6;
1759 1752 if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN))
1760 1753 dev->hw_features |= NETIF_F_TSO_ECN;
  1754 + if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_UFO))
  1755 + dev->hw_features |= NETIF_F_UFO;
1761 1756  
1762 1757 if (gso)
1763   - dev->features |= dev->hw_features & NETIF_F_ALL_TSO;
  1758 + dev->features |= dev->hw_features & (NETIF_F_ALL_TSO|NETIF_F_UFO);
1764 1759 /* (!csum && gso) case will be fixed by register_netdev() */
1765 1760 }
1766 1761 if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM))
... ... @@ -1798,7 +1793,8 @@
1798 1793 /* If we can receive ANY GSO packets, we must allocate large ones. */
1799 1794 if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) ||
1800 1795 virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) ||
1801   - virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN))
  1796 + virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN) ||
  1797 + virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UFO))
1802 1798 vi->big_packets = true;
1803 1799  
1804 1800 if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF))
1805 1801  
... ... @@ -1994,9 +1990,9 @@
1994 1990 static unsigned int features[] = {
1995 1991 VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM,
1996 1992 VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC,
1997   - VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_TSO6,
  1993 + VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6,
1998 1994 VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6,
1999   - VIRTIO_NET_F_GUEST_ECN,
  1995 + VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO,
2000 1996 VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ,
2001 1997 VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
2002 1998 VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,