Commit e3e3c423f82a415195a7bbbfa619bfa7b20d2db6
Committed by
David S. Miller
1 parent
72f6510745
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
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(); |
drivers/net/tun.c
... | ... | @@ -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, |